Daten|teiler
Kopieren als Kulturtechnik

Mein erstes Makro mit Python in LibreOffice

8. Dezember 2019 von Christian Imhorst

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“.

Das Python_makro in LibreOffice

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“.

Mein Makro ausführen

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:

Python Makro in einer ODF-Datei

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:

Makro-Warnung in LibreOffice

Unter „Extras -> Optionen -> LibreOffice -> Sicherheit -> Makrosicherheit“ kann man die Makrosicherheitsstufe auf „Mittel“ stellen, um die Makroausführung mithilfe einer Bestätigung zu ermöglichen:

LibreOffice Makrosicherheitsstufe auf Mittel

Danach erhält man ein Auswahlfenster, mit dem man die Ausführung von Makros zulassen kann:

Makros aktivieren zulassen

Unter „Extra -> Makro -> Makro ausführen“ findet man das Makro dann eingebunden im LibreOffice-Dokument und kann von dort gestartet werden:

Makro auswählen

Geschrieben in Gnu/Linux, LibreOffice, OpenSuse, Python