Funktionssammlung OpenOffice Calc

  • Hallo,

    um auf OpenOffice Dokumente zuzugreifen, habe ich einige Funktionen erstellt.
    Zur Zeit werden die Grundfunktionen bei der Arbeit mit Tabellenblättern bereitgestellt.
    Ein großer Vorteil von OO ist, daß sehr viele Exportfilter implementiert sind.
    Somit ist ein "Export" der Dateien nach PDF,HTML,XLS oder anderen Formaten sehr einfach möglich.

    /EDIT 14.02.2010/
    Object-Errorhandling integriert, Funktion für Tabellendaten nach Array und umgekehrt implementiert, Farbfunktionen eingefügt
    "schönere" Demo :D
    /EDIT 06.12.2016/
    In den "neueren" AutoIt-Versionen ist die Funktion _ArrayCreate() nicht mehr vorhanden, einfach die folgenden Zeilen unten anhängen

    //EDIT 03.02.2019

    als Download

    OpenOffice_calc.au3

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    6 Mal editiert, zuletzt von Andy (3. Februar 2019 um 10:08)

    • Offizieller Beitrag

    Hi Andy,
    feine Arbeit erstmal. :thumbup:
    Was ich vielleicht noch verändern würde:
    - Returns von allen Funktionen (z.B. von Init das Objekt zurückgeben lassen und dieses auch als ersten Parameter in allen anderen Funktionen führen, so wie in den Word/Excel-UDF. Ermöglicht dann auch das Errorhandling)
    - Methoden in der korrekten Syntax (Groß-/Kleinschreibung) verwenden. Zum Einen übersichtlicher, zum Anderen werden u.U. sonst Befehle nicht erkannt.

    Ansonsten hab ich nix zu 'meckern' :D - Also weiter so, es gibt ja noch OO -Write, Draw... :rolleyes:

  • Ich hätte noch einen vorschlag: das "com.sun.star.ServiceManager"-Objekt kannst du doch auch Global erstellen und nicht bei jedem Funktionsaufruf neu. Soweit ich weiß, hat AutoIt ein Speicherleck, wenn man Objekte andauernd neu erstellt.

    //Edit: und statt True / False solltest du das verwenden, das funktioniert:

    [autoit]

    Global Const $OO_TRUE = -1
    Global Const $OO_FALSE = 0

    [/autoit]


    und für die Funktionen z.B. so, dann muss man nicht alle Eigenschaften ändern:

    [autoit]

    Func _OOSheetSetRowProperties($row, $height=Default, $optheight = Default, $visible = Default, $newpage = Default) ;Eigenschaften der Zeile
    ; $optheight, $visible $newpage all $OO_true or $OO_False
    $orow = $oSheet.getRows().getByIndex($row)
    If IsNumber($height) Then $orow.setPropertyValue("Height", $height) ;Höhe in 1/100mm
    If IsNumber($optheight) Then $orow.setPropertyValue("OptimalHeight", $optheight) ;funktioniert nicht
    If IsNumber($visible) Then $orow.setPropertyValue("IsVisible", $visible) ;egal ob true oder False zeile wird nichtsichtbar
    If IsNumber($newpage) Then $orow.setPropertyValue("IsStartOfNewPage", $newpage)
    EndFunc ;==>_OOSheetSetRowProperties

    [/autoit]

    3 Mal editiert, zuletzt von progandy (14. März 2009 um 14:54)

  • Danke Leute!
    Vor allem für das konstruktive Feedback!

    Da bin ich doch gleich motiviert, weiterzumachen^^
    Wie schon bereits ersichtlich, kämpfe ich noch mit den Objekten, Klassen, Instanzen, Methoden, Funktionen und was es sonst in der Objektorientierten Programmierung zu beachten und aufeinander anzuwenden gibt. Manchmal gehen mir Kronleuchter auf, manchmal ist es zum verzweifeln. Auch die Dokumentation bzw. die Programmbeispiele (meist C# und Java) sind krude, man merkt dem System einfach an, dass es über viele Jahre von einigen hundert bis tausend Programmierern erstellt und dokumentiert wurde.
    Was unwahrscheinlich schwer (jedenfalls für mich) ist, es gibt kaum eine übersichtliche Referenz, ich stelle mir so eine Art Baumdiagramm vor.
    Eine Liste der "Objekte"(Oberklassen) der darauf anwendbaren Klassen und Methoden (träum), das wärs!
    EINEN Vorteil hat die Sucherei jedenfalls, auf "der anderen Seite" stehen fetteste SUN-Server, da ist jede Suchanfrage in Millisekunden erledigt^^

    ciao
    Andy

  • Ja, diese Seiten kenne ich^^
    Wenn man da nach 5-6h Lektüre wieder rauskommt, gehts einem wie in deiner Sig^^
    ciao
    Andy

  • Update der Funktionen, Kleinigkeiten geändert, einige Funktionen hinzugefügt. Demo automatisch ablaufend.
    Kurze Anfrage:
    Sollte man das schon "UDF"-mäßig ausbauen (entsprechende Header und das ganze Fehlerabfang-Brimborium ?)
    Ich würde dann auch die Funktionen noch so ändern, daß die globalen Variablen vermieden werden usw. ggf noch gewünschte Funktionen einbauen.

  • hallo zusammen,

    folgend meine Lösung, um ein Tabellenblatt zu löschen!

    [autoit]


    _OOBookDeleteSheet("Tabelle1")
    ;_OOBookDeleteSheet("sheet1")

    [/autoit][autoit][/autoit][autoit]

    Func _OOBookDeleteSheet($sheetname) ;Delete other Sheets (by default Sheet2,Sheet3)
    $errormodul = "_OODeleteSheet"
    If $odoc.Sheets.hasByName($sheetname) Then $odoc.Sheets.removeByName($sheetname)
    EndFunc ;==>_OOBookDeleteSheet

    [/autoit]

    die Funktionen aus dem ersten Post nochmal komplett mit SheetDelete!

    Spoiler anzeigen
    [autoit]

    ;Functions
    Func _OOSetProp($cName, $uValue) ;Eigenschaften in struct übergeben
    $errormodul = "_OOSetProp"
    $osm = ObjCreate("com.sun.star.ServiceManager")
    $oPropertyValue = $osm.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    $oPropertyValue.Name = $cName
    $oPropertyValue.Value = $uValue
    $setOOoProp = $oPropertyValue
    Return $setOOoProp
    EndFunc ;==>_OOSetProp

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOInit($pass = "", $readonly = False, $hidden = False) ;verbindung zu OO herstellen
    $errormodul = "_OOINIT"
    $osm = ObjCreate("com.sun.star.ServiceManager")
    $oDesk = $osm.createInstance("com.sun.star.frame.Desktop")
    $OpenPar[0] = _OOSetProp("ReadOnly", $readonly)
    $OpenPar[1] = _OOsetProp("Password", $pass) ;setzt das passwort des dokuments
    $OpenPar[2] = _OOsetProp("Hidden", $hidden)
    EndFunc ;==>_OOInit

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOAddNewBook() ; neue Tabellendatei erstellen
    $errormodul = "_OOAddNewBook"
    $odoc = $oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, $OpenPar)
    $oSheet = $odoc.CurrentController.ActiveSheet
    EndFunc ;==>_OOAddNewBook

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOOpenFile($fname) ; bestehende *.Datei öffnen, OO importiert mit Filter wenn möglich
    $errormodul = "_OOOpenFile"
    $fname = StringReplace($fname, ":", "|")
    $fname = StringReplace($fname, " ", "%20")
    $fname = "file:///" & StringReplace($fname, "\", "/")
    $odoc = $oDesk.loadComponentFromURL($fname, "_blank", 0, $OpenPar)
    EndFunc ;==>_OOOpenFile

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOOpenBook($fname) ; bestehende Tabellendatei öffnen
    $errormodul = "_OOOpenBook"
    $fname = StringReplace($fname, ":", "|")
    $fname = StringReplace($fname, " ", "%20")
    $fname = "file:///" & StringReplace($fname, "\", "/")
    $odoc = $oDesk.loadComponentFromURL($fname, "_blank", 0, $OpenPar)
    $oSheet = $odoc.CurrentController.ActiveSheet ;auskommentieren, um alle importierbaren Formate zu öffnen
    EndFunc ;==>_OOOpenBook

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOStoreBook($fname, $filter = "StarOffice XML (Calc)") ;speichert Datei , angewandt wird der Dateifilter
    ;Alle EXPORT-Filter von dieser Page sind anwendbar, es gelten die internen Namen!
    ;http://wiki.services.openoffice.org/wiki/Framework…FilterList_SO_7
    $errormodul = "_OOStoreBook"
    $fname = StringReplace($fname, ":", "|")
    $fname = StringReplace($fname, " ", "%20")
    $fname = "file:///" & StringReplace($fname, "\", "/")
    ;MsgBox(0, "File saved", $filter)
    $oSave = _ArrayCreate(_OOsetProp("FilterName", $filter))
    $odoc.storetourl($fname, $oSave)
    EndFunc ;==>_OOStoreBook

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetActivate($sheetnameornumber, $activeflag = 1) ;Tabellenname oder nummer zum schreiben/lesen aktivieren
    ;mit $activeflag=1 kommt die Tabelle in den Vordergrund
    ;mit $activeflag=0 wird die Tabelle verdeckt aktiviert z.B.um im Hintergrund Daten zu ändern
    $errormodul = "_OOSheetactivate"
    If IsString($sheetnameornumber) Then
    $activesheet = $odoc.sheets.getbyname($sheetnameornumber)
    Else
    $activesheet = $odoc.sheets.getbyindex($sheetnameornumber) ;index starts with 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $activeflag = 1 Then
    $oSheet = $odoc.CurrentController.setActiveSheet($activesheet)
    EndIf
    $oSheet = $activesheet
    EndFunc ;==>_OOSheetActivate

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOBookAddNewSheet($sheetname) ;erstellt neues Tabellenblatt mit dem Namen $sheetname
    $errormodul = "_OOAddNewsheet"
    $eSheets = $odoc.getSheets.createEnumeration
    $flag = 0
    While $eSheets.hasMoreElements ;abfrage, ob sheet schon existiert
    $oElement = $eSheets.nextElement()
    If $oElement = $sheetname Then $flag = 1 ;wenn ja, merken
    WEnd
    If $flag = 0 Then
    $Inst = $odoc.createInstance("com.sun.star.sheet.Spreadsheet")
    $odoc.Sheets.insertByName($sheetname, $Inst)
    EndIf
    EndFunc ;==>_OOBookAddNewSheet

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOBookDeleteSheet($sheetname) ;Delete other Sheets (by default Sheet2,Sheet3)
    $errormodul = "_OODeleteSheet"
    If $odoc.Sheets.hasByName($sheetname) Then $odoc.Sheets.removeByName($sheetname)
    EndFunc ;==>_OOBookDeleteSheet

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetGetCellValue($col, $row) ;Inhalt der Zelle bsp; "A3" oder F22
    $errormodul = "_OOSheetGetCellValue"
    If IsString($col) Then
    _OOAdress2Koord($col)
    $col = $cellkoord[0]
    $row = $cellkoord[1]
    EndIf
    $oCell = $oSheet.getCellByPosition($col, $row).value
    Return $oCell
    EndFunc ;==>_OOSheetGetCellValue

    [/autoit] [autoit][/autoit] [autoit]

    Func _OONumberOfSheets() ; Anzahl der Tabellenblätter
    $errormodul = "_OONumberofsheets"
    Return $odoc.getsheets.getcount
    EndFunc ;==>_OONumberOfSheets

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOAdress2Koord($cellname) ;wandelt "C1" in $cellkoord[0]=2 und $cellkoord[1]=0
    $errormodul = "_OOAdress2Koord"
    Local $textchar[3]
    Local $numchar[3]
    $cellname = StringUpper($cellname)
    $numchar = StringRegExp($cellname, '\d+', 1) ;y-Koordinate der Zelle, findet Zahlen im Zellennamen;
    ; msgbox (0,$cellname,$textchar[0]&" "&$numchar[0])
    $cellkoord[1] = $numchar[0] - 1
    $textchar = StringRegExp($cellname, '[[:alpha:]]{0,2}', 1) ;findet A oder AA im Zellennamen
    $x = (Asc(StringMid($textchar[0], 1, 1)) - 65) ;ascii erster Buchstabe
    If StringLen($textchar[0]) = 2 Then
    $x = (($x + 1) * 26) + (Asc(StringMid($textchar[0], 2, 1)) - 65)
    EndIf
    $cellkoord[0] = $x
    Return $cellkoord
    EndFunc ;==>_OOAdress2Koord

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOKoordToAddress($row,$col) ;wandelt 2,3 in "C4"
    $x = Int($col / 26)
    $y = Mod($col, 26)

    [/autoit] [autoit][/autoit] [autoit]

    If $x = 0 Then
    $char = Chr(64 + $y) ;A B C
    Else
    $char = Chr(64 + $x) & Chr(65 + $y) ; AA AB AC...
    EndIf
    Return $char & String($row + 1)
    EndFunc ;==>_OOKoordToAddress

    [/autoit] [autoit][/autoit] [autoit]

    Func _OONameOfActiveSheet()
    $errormodul = "_OONameofAvtiveSheet"
    Return $oSheet.name
    EndFunc ;==>_OONameOfActiveSheet

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetSetRowProperties($row, $height, $optheight = Default, $visible = Default, $newpage = Default) ;Eigenschaften der Zeile
    ; $optheight, $visible $newpage all OO_true or OO_False
    $errormodul = "_OOSheetSetRowProperties"
    $orow = $oSheet.getRows().getByIndex($row)
    If IsNumber($height) Then $orow.Height = $height ;column height (in 100ths of mm)
    $orow.OptimalWidth = Number($optheight)
    $orow.IsVisible = Number($visible)
    $orow.IsStartOfNewPage = Number($newpage)
    EndFunc ;==>_OOSheetSetRowProperties

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetSetColProperties($col, $width, $optwidth = Default, $visible = Default, $newpage = Default) ;Eigenschaften Spalte
    ; $opt, $visible $newpage all OO_true or OO_False
    $errormodul = "_OOSheetSetColProperties"
    If IsString($col) Then
    $ocol = $oSheet.getColumns().getByName($col)
    Else
    $ocol = $oSheet.getColumns().getByIndex($col)
    EndIf
    $ocol.Width = $width ;column width (in 100ths of mm)
    $ocol.OptimalWidth = Number($optwidth)
    $ocol.IsVisible = Number($visible)
    $ocol.IsStartOfNewPage = Number($newpage)
    EndFunc ;==>_OOSheetSetColProperties

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetdeleteRow($startrow, $numberofrows = 1) ;Zeile löschen
    $errormodul = "_OOSheetDeleteRow"
    $oSheet.getrows.removeByIndex($startrow, $numberofrows)
    EndFunc ;==>_OOSheetdeleteRow

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetinsertRow($startrow, $numberofrows = 1) ;Zeile einfügen
    $errormodul = "_OOSheetInsertRow"
    $oSheet.getrows.insertbyindex($startrow, $numberofrows)
    EndFunc ;==>_OOSheetinsertRow

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetdeleteCol($startcol, $numberofcols = 1) ;Spalte löschen
    $errormodul = "_OOSheetDeleteCol"
    $oSheet.getcolumns.removeByIndex($startcol, $numberofcols)
    EndFunc ;==>_OOSheetdeleteCol

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetinsertCol($startcol, $numberofcols = 1) ;spalte einfügen
    $errormodul = "_OOSheetInsertCol"
    $oSheet.getcolumns.insertbyindex($startcol, $numberofcols)
    EndFunc ;==>_OOSheetinsertCol

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetGetCellType($row, $col) ;Rückgabe: Zellentyp: value, string, formula, empty
    $errormodul = "_OOSheetGetCellType"
    If IsString($row) Then
    $cell = _OOAdress2Koord($row)
    $row = $cell[0]
    $col = $cell[1]
    EndIf
    $oCell = $oSheet.getcellbyposition($row, $col)
    Select
    Case $oCell.type = 1
    $celltype = "VALUE"
    Case $oCell.type = 2
    $celltype = "STRING"
    Case $oCell.type = 3
    $celltype = "FORMULA"
    Case $oCell.type = 0
    $celltype = "EMPTY"
    Case Else
    $celltype = "UNKNOWN"
    EndSelect
    Return $celltype
    EndFunc ;==>_OOSheetGetCellType

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetMoveOrCopyRange($fromsheetnameornumber, $fromrange, $tosheetnameornumber, $tocell, $flag) ;$fromrange="B2:c4" $tocell="F4" flag: 0=move, 1=copy
    $errormodul = "_OOSheetMoveOrCopyRange"
    If IsString($fromsheetnameornumber) Then
    $fromsheet = $odoc.sheets.getbyname($fromsheetnameornumber)
    Else
    $fromsheet = $odoc.sheets.getbyindex($fromsheetnameornumber) ;index starts with 0
    EndIf
    If IsString($tosheetnameornumber) Then
    $tosheet = $odoc.sheets.getbyname($tosheetnameornumber)
    Else
    $tosheet = $odoc.sheets.getbyindex($tosheetnameornumber) ;index starts with 0
    EndIf
    $oRangeOrg = $fromsheet.getCellRangeByName($fromrange).RangeAddress ; copy range
    $oCellCpy = $tosheet.getCellrangeByname($tocell).CellAddress ; insert position
    If $flag = 0 Then ;move
    $oSheet.MoveRange($oCellCpy, $oRangeOrg)
    Else
    $oSheet.CopyRange($oCellCpy, $oRangeOrg)
    EndIf
    EndFunc ;==>_OOSheetMoveOrCopyRange

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetSetCell($xkoord, $ykoord, $data, $ref = "string") ;$ref= angabe, ob "string" "value" "formula"
    $errormodul = "_OOSheetSetCell"
    If IsString($xkoord) Then
    $cell = _OOAdress2Koord($xkoord)
    $xkoord = $cell[0]
    $ykoord = $cell[1]

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    $ref = StringUpper($ref)
    Select
    Case $ref = "STRING"
    $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
    $oCell.setString($data)

    [/autoit] [autoit][/autoit] [autoit]

    Case $ref = "VALUE"
    $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
    $oCell.setvalue($data)

    [/autoit] [autoit][/autoit] [autoit]

    Case $ref = "FORMULA"
    $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
    $oCell.setformula($data)

    [/autoit] [autoit][/autoit] [autoit]

    Case Else
    $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
    $oCell.setstring($data)
    EndSelect
    EndFunc ;==>_OOSheetSetCell

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOCloseBook() ;Datei beenden
    $errormodul = "_OOCloseBook"
    $odoc.close(True)
    EndFunc ;==>_OOCloseBook

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetSetCellColor($col, $row, $front = Default, $back = Default) ;RRGGBB
    $errormodul = "_OOSheetSetCell"
    If IsString($col) Then
    $cell = _OOAdress2Koord($col)
    $col = $cell[0]
    $row = $cell[1]
    EndIf
    $oCell = $oSheet.getCellByPosition($col, $row)
    $oCell.CharColor = $front
    $oCell.CellBackColor = $back
    EndFunc ;==>_OOSheetSetCellColor

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetSetRowColor($row, $front = Default, $back = Default) ;RRGGBB
    $errormodul = "_OOSheetSetRowColor"
    $orow = $oSheet.getRows().getByIndex($row)
    $orow.CharColor = $front
    $orow.CellBackColor = $back
    EndFunc ;==>_OOSheetSetRowColor

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetSetColColor($col, $front = Default, $back = Default) ;RRGGBB
    $errormodul = "_OOSheetSetColColor"
    $ocol = $oSheet.getColumns().getByIndex($col)
    $ocol.CharColor = $front
    $ocol.CellBackColor = $back
    EndFunc ;==>_OOSheetSetColColor

    [/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetRangeToArray($sheetnameornumber, $startcell, $endcell, $all = "ALL") ;gibt ein Array der Daten aus dem Bereich des Tabellenblatts
    $errormodul = "_OOSheetRangeToArray"
    If IsString($sheetnameornumber) Then
    $oSheet = $odoc.sheets.getbyname($sheetnameornumber)
    Else
    $oSheet = $odoc.sheets.getbyindex($sheetnameornumber) ;index starts with 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If StringUpper($all) = "ALL" Then ;used data of the whole sheet
    $oCursor = $oSheet.createCursor()
    $oCursor.GotoStartOfUsedArea(0) ;von der ersten ausgefüllten Zelle
    $start = $oCursor.getrangeaddress()
    $Start_row = $start.startRow
    $Start_col = $start.startColumn
    $oCursor.GotoEndOfUsedArea(1);bis zur letzten ausgefüllten Zelle
    $end = $oCursor.getrangeaddress()
    $end_row = $end.endRow
    $end_col = $end.endColumn
    Else
    If IsString($startcell) Then
    $cell = _OOAdress2Koord($startcell)
    $Start_row = $cell[1]
    $Start_col = $cell[0]
    EndIf
    If IsString($endcell) Then
    $cell = _OOAdress2Koord($endcell)
    $end_row = $cell[1]
    $end_col = $cell[0]
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $ooarray = $oSheet.getCellRangeByPosition($Start_col, $Start_row, $end_col, $end_row).getDataArray() ;verschachteltes array, in [0] ist die erste zeile, in [2] die 2. usw

    [/autoit] [autoit][/autoit] [autoit]

    Dim $array[UBound($ooarray)][UBound($ooarray[0])]
    For $rows = 0 To UBound($ooarray) - 1
    $row = $ooarray[$rows]
    For $cols = 0 To UBound($row) - 1
    $array[$rows][$cols] = $row[$cols]
    Next
    Next
    Return $array
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $GetUsedRangeAddress = ' & $GetUsedRangeAddress & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ;~ ; return $Range
    EndFunc ;==>_OOSheetRangeToArray

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _OOSheetArrayToRange($sheetnameornumber, $cellname, $array) ;Array ins Tabellenblatt am Position cellname ("B4")
    $errormodul = "_OOSheetArrayToRange"
    If IsString($sheetnameornumber) Then
    $oSheet = $odoc.sheets.getbyname($sheetnameornumber) ;"Tabelle1"
    Else
    $oSheet = $odoc.sheets.getbyindex($sheetnameornumber) ;index starts with 0
    EndIf
    If IsString($cellname) Then
    $cell = _OOAdress2Koord($cellname)
    $row = $cell[1]
    $col = $cell[0]
    Else
    return seterror(1,0,0)
    EndIf
    $rangestring = $cellname & ":" & _OOKoordToAddress($row + UBound($array, 1) - 1, $col + UBound($array, 2)) ;calculate the cellname of the last arrayitem in the sheet
    ;build ooArray
    $dimensions = UBound($array, 0)
    If $dimensions > 2 Then Return SetError(1, 0, 0) ;nur maximal 2-dimensionale arrays
    If $dimensions = 1 Then ;eine zeile im Array wird zu einer spalte im sheet!!!
    Dim $ooarray[1]
    $ooarray[0] = $array
    Else
    Dim $ooarray[UBound($array, 1)] ;anzahl der Zeilen
    Dim $arows[UBound($array, 2)] ;länge der zeilen
    For $row = 0 To UBound($array, 1) - 1 ;alle Zeilen abarbeiten
    For $col = 0 To UBound($array, 2) - 1 ;alle Spalteneinträge in dieser Zeile
    $arows[$col] = $array[$row][$col] ;die Spalteneinträge als Reihe ins array
    Next
    $ooarray[$row] = $arows ;das array der gesamten Zeile in das ooarray an index $row
    Next
    EndIf
    $oRange = $oSheet.getCellRangeByName($rangestring)
    $oData = $oRange.setDataArray($ooarray)
    EndFunc ;==>_OOSheetArrayToRange

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Das ist unser eigener Error-Handler
    Func _OOErrFunc() ;COM-Error-Handler
    $HexNumber = Hex($oMyError.number, 8)
    #CS MsgBox(0, "COM-Error OpenOffice Script", "Ein COM-Fehler wurde abgefangen!" & @CRLF & _
    "Fehlernummer: " & $HexNumber & @CRLF & _
    "WinDescription: " & $oMyError.windescription & @CRLF & _
    "Error in Modul " & $errormodul)
    #CE
    ;SetError(1)
    EndFunc ;==>_OOErrFunc

    [/autoit]

    gruß gmmg ;)

  • Hallo Andy,

    deine Arbeit hilft mir gerade sehr, da ich automatisch eine Calc-Datei erstellen möchte, die auch noch einige Formatierungen (Hintergrundfarbe, Spaltenbreite) hat. Daher herzlichen Dank :)

    Ein kleiner Fehler hat sich aber eingeschlichen. Es gibt eine Fehlermeldung, wenn die Zeile über "_OOSheetSetRowProperties" angesprochen wird. Hier geht es um 'Row', 'Height' und somit ist 'OptimalWidth' nicht korrekt, sondern sollte 'OptimalHeight' heißen. (Zeile 6)

    Code
    Func _OOSheetSetRowProperties($row, $height, $optheight = Default, $visible = Default, $newpage = Default) ;Eigenschaften der Zeile
        ; $optheight, $visible $newpage all     OO_true or OO_False
        $errormodul = "_OOSheetSetRowProperties"
        $orow = $oSheet.getRows().getByIndex($row)
        If IsNumber($height) Then $orow.Height = $height ;column height (in 100ths of mm)
        $orow.OptimalWidth = Number($optheight)     ;Korrekt:  $orow.OptimalHeight = Number($optheight) 
        $orow.IsVisible = Number($visible)
        $orow.IsStartOfNewPage = Number($newpage)
    EndFunc   ;==>_OOSheetSetRowProperties

    Ich bin über diese Seite hier fündig geworden:
    http://www.openoffice.org/api/docs/commo…e/TableRow.html

    In diesem Zusammenhang sei mir noch eine Frage erlaubt:
    Hat sich schon jemand mit den Rahmen um die Zellen beschäftigt?
    Ich habe das hier gefunden:
    http://www.oooforum.de/viewtopic.php?f=18&t=2600&start=0
    und das in dieses AutoIt-UDF zu übertragen scheint mir doch etwas mehr Arbeit zu sein. Vielleicht kann ich mir die Arbeit ja sparen? ;)

    Viele Grüße
    Carsten

  • Irgendwie gibts genau 0 zeilenumbrüche im Quellcode... Hilfe. Ich bekomme nur eine Zeile mit 4,87km länge eingefügt, egal wo.


    erledigt.

    Einmal editiert, zuletzt von C01 (2. Februar 2019 um 19:29)

  • Hi,

    habe im Startpost das Script als Download angehängt. Da ich das Script nicht neu formatiert und somit lesbar einfügen konnte, weil "...der Text mehr als 20.000 Zeichen hat...".

    Somit "nur" als Download.

    Btw., das Script ist jetzt seit 10 Jahren unverändert und funktioniert mit der neuesten Version sowohl von AutoIt als auch von OpenOffice einwandfrei. Fragt sich nur, wie lange noch....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (3. Februar 2019 um 10:19)

  • Hallo,

    Hast du noch einen Trick auf Lager wie ich Calc ein DATUM korrekt übergeben kann? Ich bekomme immer nur einen Text rein, also mit Hochkomma. Lösche ich das ' erkennt calc das Datum. Das muß man doch auch irgendwie sauber übergeben können. Übergebe ich eine Zahl ab dem 30.12.1899 bekomme ich die Zelle über AutoIt ja nicht als Datum vormartiert, also auch keine Lösung.

    Eigentlich ist ein Datum ja eine Value als Typ, übergebe ich es mit . oder - oder / muß ich String nehmen.

    Please Help, hier gingen schon Stunden drauf....

  • Hi,

    Ich bekomme immer nur einen Text rein, also mit Hochkomma.

    Schreib man ein Minimalscript, um das nachvollziehen zu können

  • So, Sorry fürs lange zappeln lassen. Ich habe das eigentliche Script und die zu verarbeitende XML soweit eingedampft das es das Problem zeigt.

    Die Fehlermeldung die OO ausspuck kommt vom Value als Zellformat, eben das was bei einem erkannten Datum nach manueller eingabe in Calc für eine Zelle mit Datum zurückgegeben wird. Als String frisst OO das Datum ohne Motzen, erkennt es aber eben nicht als Wert sondern als Text, also mit einem Hochkomma '

    Apache OO 4.1.5

    Auto It 3.1.2.1.0 rc4

    Aufgabe des Scripts ist es, die Bestellungen aus einem Shopsystem (die xml) in eine Calc Tabelle zu übertragen (dazu wird noch nach EU/nicht EU, EU Land usw unterschieden).

    hier die bsp.xml

    XML
    <?xml version='1.0' encoding='utf-8'?>
    <Orders>
      <Shop>
        <GUID>bla</GUID>
      </Shop>
      <Order>
        <CreationDate>2019-01-21T23:17:42</CreationDate>
        <PaidOn>2019-01-21T23:18:26</PaidOn>
      </Order>
      </Orders>

    Ich habe mir die Zähne daran ausgebissen, vielleicht bin ich einfach zu Blind vor lauter Wald....

  • Hi,

    du musst das Datum in ein "value", also eine Nummer in AutoIt umwandeln, diese Nummer in das Feld auf dem Datenblatt einfügen und dann als bspw. Datum formatieren.

    ich empfehle die UDF von mLipok https://www.autoitscript.com/forum/files/fi…mlwrapperexau3/ für den weiteren Einsatz mit OpenOffice!

    //EDIT Da hat sich der c&p-Teufel eingeschlichen, eigentlich wollte ich für OpenOffice/LibreOfficedas hier verlinken:

    https://www.autoitscript.com/forum/topic/15…olibo-calc-udf/


    Dort ist auch eine Funktion für das Setzen des Formats, die habe ich allerdings nicht ausprobiert^^

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (9. Februar 2019 um 15:18)