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:
- Ian Weisser hat das Skript für die Umgebungsvariablen geliefert. Zu finden unter http://forum.openoffice.org/en/forum/viewtopic.php?f=45&t=36370&p=166783
- Lukas PyUno Manual, aus dem Python Wiki von OpenOffice.
- Stüvel hatte den entscheidenden Tipp, wo man Danny’s OOo library findet.
Besten Dank
an Daniel Wildermuth, welcher mich auf die Idee gebracht hat mir das Generieren von LibreOffice-Calc Sheets per Python nochmals anzuschauen.