2016-04-28 7 views
2

Ich schreibe ein Python-Makro, das LibreOffice Calcs Sortierfunktion aufrufen muss. Python-Dokumentation ist knapp, aber ich habe eine klare Basic example gefunden, die ich versuche, in Python zu konvertieren.Konvertieren eines Libre/Star/Openoffice Basic-Makros in Python - Problem mit Objekttypen

Es lief gut bis Section 1 und Section 2 unten. Basic erstellt ein oSortFields() Objekt Array, aber der Python-Interpreter würde oSortFields() nicht akzeptieren. oSortFields war so nah wie ich konnte.

Also, wenn es den Sortierbefehl in Abschnitt 3 aufruft, verursacht die Nichtübereinstimmung ein AttributeError.

Was ist das Python-Äquivalent von Basic oSortFields()?

#basic# Dim oSortFields(1) As New com.sun.star.util.SortField 
from com.sun.star.util import SortField 
oSortFields = SortField 

#basic# Dim oSortDesc(0) As New com.sun.star.beans.PropertyValue 
from com.sun.star.beans import PropertyValue 
oSortDesc = PropertyValue 

#basic# oSheet = ThisComponent.Sheets.getByName("Sheet1") 
oSheet = ThisComponent.getSheets().getByIndex(0) 

#basic# REM Get the cell range to sort 
#basic# oCellRange = oSheet.getCellRangeByName("A1:C5") 
oCellRange = oSheet.getCellRangeByName("B1:M30") 

################# Section 1 ################# 
#basic# REM Sort column B (column 1) descending. 
#basic# oSortFields(0).Field = 1 
#basic# oSortFields(0).SortAscending = FALSE 
oSortFields.Field = 11 # close as I could get 
oSortFields.SortAscending = False 

################# Section 2 ################# 
#basic# REM If column B has two cells with the same value, 
#basic# REM then use column A ascending to decide the order. 
#basic# oSortFields(1).Field = 0 ### Skipped and prayed 
#basic# oSortFields(1).SortAscending = True 
# Now I'm really in trouble 

#basic# oSortDesc(0).Name = "SortFields" 
#basic# oSortDesc(0).Value = oSortFields() 
oSortDesc.Name = "SortFields" 
oSortDesc.Value = oSortFields 

################# Section 3 ################# 
#basic# REM Sort the range. 
#basic# oCellRange.Sort(oSortDesc()) 
oCellRange.Sort(oSortDesc()) 
# Gemerates Error: 
# <class 'AttributeError'>: Sort StockDataFromYahoo.py:212 
# in function StockOptionParty() [oCellRange.Sort(oSortDesc())] 
# pythonscript.py:870 in function invoke() [ret = self.func(*args)] 
+2

Die Sprache heißt LibreOffice Basic, StarBasic oder einfach Basic, aber nie VBA, das ist für Microsoft-Technologien. Gut geschriebene Frage. –

+0

Guter Punkt! Ich habe alle 'VBA' Referenzen auf 'Basic' geändert. –

Antwort

3

Erstellen von Objekten des Typs SortField und sie in ein Tupel setzen. Hier ist, was bei mir funktioniert hat:

import uno 
from com.sun.star.beans import PropertyValue 
from com.sun.star.util import SortField 

def create_sort_field(column, sort_ascending): 
    oSortField = SortField() 
    oSortField.Field = column 
    oSortField.SortAscending = sort_ascending 
    return oSortField 

def sort_cols(): 
    oSheet = XSCRIPTCONTEXT.getDocument().getSheets().getByIndex(0) 
    oCellRange = oSheet.getCellRangeByName("B1:M30") 
    oSortFields = (
     create_sort_field(11, False), # column M 
     create_sort_field(0, True),) # column B 
    oSortDesc = [PropertyValue()] 
    oSortDesc[0].Name = "SortFields" 
    oSortDesc[0].Value = uno.Any(
     '[]com.sun.star.util.SortField', oSortFields) 
    oCellRange.sort(oSortDesc) 

# Functions that can be called from Tools -> Macros -> Run Macro. 
g_exportedScripts = sort_cols, 

Siehe auch: Sorting cell range in a calc document with pyuno.

+0

Funktioniert gut, danke! –

Verwandte Themen