Mein erstes Makro mit Python in LibreOffice
In LibreOffice kann man Makros in mehreren Sprachen als nur BASIC schreiben, darunter zum Beispiel auch Python. Dazu benötigt man PyUNO, das die Brücke zwischen Python und LibreOffice herstellt. Damit das funktioniert, sollten die Pakete libreoffice-pyuno
oder unter Ubuntu noch libreoffice-script-provider-python
installiert sein. Unter Windows klappt das natürlich auch. Ob Makros in Python grundsätzlich unterstützt werden, kann man mit den Makros testen, die LibreOffice schon mitbringt. Dazu öffnet man ein neues Dokument in Writer und wählt im Menü „Extras -> Macros -> Macros verwalten -> Python…“. Unter „LibreOffice Makros“ findet man dann „HelloWorld -> HelloWorldPython“, das „Hello World (in Python)“ ins Dokument schreibt, wenn man es ausführt. Sieht man das Ergebnis, kann das installierte LibreOffice Python-Makros ausführen.
Das Python-Skript, das „Hello World“ ins Dokument schreibt, findet man unter Linux übrigens im Verzeichnis /usr/lib64/
bzw. /usr/lib/
und dann libreoffice/share/Scripts/python/
, was davon abhängt, ob man die 32- oder 64-Bit-Version von LibreOffice installiert ist. Ähnlich liegt das Skript in Windows unter C:\Program Files\
oder C:\Program Files (x86)\
und dann LibreOffice\share\Scripts\python
.
Eigene Makros kopiert man unter Linux im Home-Vereichnis in den Unterordner .config/libreoffice/4/user/Scripts/python/
bzw. im Heimverzeichnis des Nutzers unter Windows in den versteckten Ordner AppData\Roaming\
und dann weiter unter LibreOffice\4\user\Scripts\python
. Wichtig ist bei beiden Systemen, auf die Schreibweise der Verzeichnisnamen zu achten: Es muss Scripts\python
heißen, mit großem „S“ in „Scripts“ und kleinem „p“ in „python“.
Ein erstes Makro könnte dann so aussehen, wie das aus dem Wiki von LibreOffice:
import uno def my_first_macro_writer(): doc = XSCRIPTCONTEXT.getDocument() text = doc.getText() text.setString('Hello World in Python in Writer') return |
Um das Makro auszuführen, klickt man in Writer unter „Extras -> Makros -> Makros ausführen…“, dann „Meine Makros“ und wählt den Namen des Makros aus, unter den man die Python-Datei abgespeichert hat, in meinem Fall „MyFirstMacroWriter“.
Eine andere Möglichkeit ist, das Makro direkt in das Dokument selbst einzubinden. Jede ODF-Datei ist eigentlich eine ZIP-Datei, die man entpacken kann. Hat man sie erfolgreich entpackt, erstellt man im Stammverzeichnis den Ordner Scripts/python/
und kopiert dort das Python-Skript mit dem Makro hinein:
Nun muss noch die Datei manifest.xml
im Ordner META-INF
bearbeitet werden und die folgenden Zeilen kurz vor dem schließenden Tag </manifest:manifest>
hinzuzufügen:
<manifest:file-entry manifest:full-path="Scripts/python/mymacros.py" manifest:media-type="" /> <manifest:file-entry manifest:full-path="Scripts/python/" manifest:media-type="application/binary" /> <manifest:file-entry manifest:full-path="Scripts/" manifest:media-type="application/binary" /> |
Dabei muss man darauf achten, dass der Name des Python-Skripts in der ersten Zeile gleich ist. Wenn alles gespeichert ist, stellt man das ODT-Archiv mit einem ZIP-Programm wieder her. Aber Vorsicht, es darf nicht der übergeordnete Ordner, der beim Entpacken erstellt wurde, gezippt werden, sondern nur der Inhalt des Ordners:
zip -r -Z store ../DocumentWithMacro.odt * |
Will man jetzt das LibreOffice-Dokument öffnen, erscheint eine Warnung, dass es Makros enthält:
Unter „Extras -> Optionen -> LibreOffice -> Sicherheit -> Makrosicherheit“ kann man die Makrosicherheitsstufe auf „Mittel“ stellen, um die Makroausführung mithilfe einer Bestätigung zu ermöglichen:
Danach erhält man ein Auswahlfenster, mit dem man die Ausführung von Makros zulassen kann:
Unter „Extra -> Makro -> Makro ausführen“ findet man das Makro dann eingebunden im LibreOffice-Dokument und kann von dort gestartet werden:
Geschrieben in Gnu/Linux, LibreOffice, OpenSuse, Python