LibreOffice Dokumente mit Python generieren

Ziel dieses Artikels ist es unter Windows (in meinem Fall eine XP-64 Installation) mit Python und Dreampie ein LibreOffice-Calc Sheet zu generieren.

Dazu geht man wie folgt vor:

  • Falls man Dreampie noch nicht hat: Hier Dreampie herunterladen, installieren und ausführen.
  • LibreOffice kommt mit seiner eigenen Python-Installation daher. Um unter Windows an die wichtigen UNO Module heranzukommen muss man etwas tricksen.
    Das geht mit folgendem Code:

    import os
    import sys
    import subprocess
    
    def import_uno():
        libreoffice_path = "C:\\Program Files (x86)\\LibreOffice 3\\"
       
        python_lo_executable = libreoffice_path + "program\\python.exe"
        python_lo_script = """-cimport os; print(os.environ["URE_BOOTSTRAP"]); print(os.environ["UNO_PATH"]); print(os.environ["PATH"])"""
        path_to_uno = libreoffice_path + "Basis\\program"
    
        # Umgebungsvariablen von LO-Python per subprocess herausholen
        process = subprocess.Popen([python_lo_executable, python_lo_script], stdout=subprocess.PIPE)
        result = process.communicate()
        env = os.environ
        env["URE_BOOTSTRAP"], env["UNO_PATH"], env_path, ignore = result[0].split("\n")
    
        existing_paths = env["PATH"].split(";")
        for path in env_path.split(";"):
            if path not in existing_paths:
                existing_paths.append(path)
        env["PATH"] = ";".join(existing_paths)
    
        sys.path.append(path_to_uno)
    
    import_uno()
    import uno

    Diesen Code kopieren und in das untere Fenster von Dreampie einfügen.

  • In meinem Fall ist LibreOffice unter C:\Program Files (x86)\LibreOffice 3\ installiert. Die Variable auf Zeile 6 muss entsprechend angepasst werden.
  • Mit Ctrl+Enter den Code in Dreampie ausführen.
  • LibreOffice lässt sich nur per Socket von aussen steuern. Damit ein solcher Socket geöffnet wird, muss LibreOffice mit einigen zusätzlichen Parametern gestartet werden.
    "C:\Program Files (x86)\LibreOffice 3\program\soffice.exe" -calc -accept=socket,host=localhost,port=2002;urp;

    Den Code kopieren in einem DOS-Fenster ausführen.

  • Zurück in Dreampie. Folgender Code erstellt uns die wichtigsten Objekte.
    local = uno.getComponentContext()
    resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
    context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
    desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
  • Dieser Code erstellt ein neues Calc Dokument und schreibt etwas Text.
    doc = desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, ())
    sheet = doc.getSheets().getByIndex(0)
    sheet.getCellByPosition(0, 0).setString("Hallo Welt")
    sheet.getCellByPosition(0, 1).setString("Noch'n Text")
  • Bestehende Dokumente werden wie folgt geladen:
    import unohelper
    doc = desktop.loadComponentFromURL(
        unohelper.systemPathToFileUrl(os.path.abspath("C:\Test.ods")), "_blank", 0, ())
    
  • Profit!

Danny’s OOo Library

Viele Beispiele verwenden das Python Modul Danny.OOo.OOoLib . Falls man das braucht: Das File findet man hier.
Um es zu benutzen muss man das File in einen Python-Pfad legen. Z.B nach C:\Python26\Danny\OOo . Der Ordner C:\Python26 wurde schon bei der Installation von Dreampie angelegt. Es muss den Ordner Danny im Verzeichnis C:\Python26 erstellt und in diesem zusätzlich den Ordner OOo . Dort legt man das OOoLib.py-File ab. Zusätzlich muss in beiden Ordnern noch ein leeres File mit dem Namen __init__.py angelegt werden.

Referenzen

Der Artikel hat von folgenden wichtigen Seiten profitiert:

Besten Dank

an Daniel Wildermuth, welcher mich auf die Idee gebracht hat mir das Generieren von LibreOffice-Calc Sheets per Python nochmals anzuschauen.

Beitrag kommentieren


[ Ctrl + Enter ]