Ja. LibreOffice Calc kann Python-Code als Makro innerhalb des LibreOffice-Prozesses ausführen, und ein LibreOffice Basic-Makro kann über das LibreOffice-Skriptframework ebenfalls eine Python-Funktion aufrufen. Wenn Sie Zellen in der geöffneten Tabelle lesen oder ändern möchten, ist ein Python-Makro innerhalb des Prozesses in der Regel der einfachste Ausgangspunkt. Verwenden Sie einen Basic-zu-Python-Aufruf, wenn ein bestehendes Basic-Makro eine Aufgabe an eine wiederverwendbare Python-Funktion übergeben soll.
Diese Vorgehensweisen unterscheiden sich vom Starten eines gewöhnlichen System-Python-Skripts über einen Shell-Befehl. Ein normaler externer Python-Prozess empfängt das Dokumentobjekt von Calc nicht automatisch. Um auf Arbeitsmappen zuzugreifen, führen Sie ein Python-Makro über LibreOffice aus oder verbinden Sie einen externen Prozess gezielt über UNO mit einer LibreOffice-Instanz.
Was bedeutet „Python innerhalb eines Calc-Makros ausführen“?
LibreOffice unterstützt über sein Skript-Framework mehrere Skriptsprachen. In einem Python-Makro stellt LibreOffice ein UNO-Kontextobjekt bereit, das dem Skript den Zugriff auf das aktuelle Dokument und dessen Tabellenblätter ermöglicht. Ein Python-Makro ist eine Funktion in einem .pyModul; das Modul- g_exportedScriptsTupel identifiziert die Funktionen, die LibreOffice als ausführbare Makros anzeigen soll.
Ein Python-Makro kann eigenständig über das Makromenü von Calc ausgeführt werden. Es muss nicht von Basic aufgerufen werden. Falls Sie bereits ein Basic-Makro haben und dieses Python aufrufen möchten, Session.ExecutePythonScriptkann der Skriptanbieter von LibreOffice oder der neuere Dienst ScriptForge die beiden Sprachen verbinden.
Welchen Ansatz sollten Sie wählen?
- Verwenden Sie ein Python-Makro direkt, wenn die Aufgabe hauptsächlich in Python geschrieben ist und das aktuelle Calc-Dokument benötigt wird. Dadurch wird ein Sprachwechsel vermieden und die Fehlersuche als einzelnes Skript vereinfacht.
- Python aus Basic aufrufen, wenn Sie bereits Basic-Code, Schaltflächen oder Dokumentereignisse haben, die erhalten bleiben sollen, und Sie einen Python-Helfer benötigen, der eine gezielte Berechnung oder Datenoperation durchführt.
- Verwenden Sie einen externen Python-Prozess, wenn Sie eine separate Entwicklungsumgebung oder Python-Pakete benötigen, die nicht in LibreOffice enthalten sind. Richten Sie eine explizite UNO-Verbindung ein; gehen Sie nicht davon aus, dass ein Skript, das über das Terminal gestartet wird, auf die geöffnete Tabelle zugreifen kann.
Ein kleines Tool zur Tabellenbereinigung lässt sich beispielsweise vollständig als Python-Makro schreiben. Falls eine vorhandene Schaltfläche bereits einen Bericht ausführt, kann das zugehörige Makro beibehalten und eine Python-Funktion aufgerufen werden, die die Berichtssumme berechnet.
Wie erstellt man ein Python-Makro, das Calc-Zellen bearbeitet?
LibreOffice speichert persönliche Python-Skripte im Benutzerprofil, anwendungsweite Skripte im Installationsverzeichnis und Dokumentskripte zusammen mit dem jeweiligen Dokument. Für einen ersten Test ist ein persönliches Skript praktisch, da es in jedem geöffneten LibreOffice-Dokument desselben Benutzers verfügbar ist. Es wird jedoch nicht mit der ODS-Datei übertragen, sodass es nicht automatisch an andere Benutzer mit der Tabellenkalkulation übergeben wird.
Den persönlichen Python-Skriptordner Ihres Systems finden Sie in der LibreOffice-Hilfe unter „Organisation und Speicherort der Python-Skripte“. Gängige Speicherorte sind %APPDATA%\LibreOffice\4\user\Scripts\pythonunter Windows und ~/.config/libreoffice/4/user/Scripts/pythonLinux. Der tatsächliche Pfad kann variieren; verwenden Sie daher den für Ihre Installation dokumentierten Speicherort, anstatt ein zweites Profilverzeichnis auf gut Glück anzulegen.
calc_tools.pyErstellen Sie im persönlichen Python-Skriptordner eine Datei mit dem entsprechenden Namen und fügen Sie dann dieses einfache Beispiel hinzu:
def double_a1(args=None):
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.getCurrentController().getActiveSheet()
source = sheet.getCellRangeByName("A1")
target = sheet.getCellRangeByName("B1")
target.setValue(source.getValue() * 2)
g_exportedScripts = (double_a1,)
Diese Funktion liest den numerischen Wert in Zelle A1 des aktiven Tabellenblatts und schreibt das Doppelte dieses Wertes in Zelle B1. XSCRIPTCONTEXTSie wird einem LibreOffice-Python-Makro zur Laufzeit übergeben; es handelt sich nicht um eine reguläre globale Python-Variable, wenn dieselbe Datei außerhalb von LibreOffice geöffnet wird. Die öffentliche Funktion ist in der Datei `/etc/libreoffice.py` aufgeführt, g_exportedScriptssodass sie in der Makroauswahl erscheint.
Speichern Sie die Datei, öffnen Sie Calc oder kehren Sie zu Calc zurück und wählen Sie „Extras“ > „Makros“ > „Makros ausführen“ . Je nach LibreOffice-Version oder Plattformübersetzung kann die Menübezeichnung im Singular stehen. Wählen Sie „Meine Makros“ > „calc_tools“ > „double_a1“ und führen Sie das Makro aus. Geben Sie zuerst eine Zahl in A1 ein und prüfen Sie dann, ob B1 den verdoppelten Wert enthält. Falls das Modul nicht angezeigt wird, überprüfen Sie, ob die Dateierweiterung korrekt ist .py, sich die Datei im richtigen Python-Ordner Ihres Profils befindet und die Python-Skriptunterstützung installiert ist. Ein Neustart von LibreOffice nach dem Hinzufügen eines neuen Moduls kann die Skriptliste aktualisieren.
Wie kann ein Basic-Makro eine Python-Funktion aufrufen?
Für einen BASIC-zu-Python-Aufruf legen Sie ein Python-Modul in Ihren persönlichen Skriptordner und rufen dessen Funktion über den ScriptForge- SessionDienst auf. Dieses Beispiel addiert zwei Werte in Python und schreibt das Ergebnis in Zelle B1 des aktuellen Tabellenblatts.
In calc_tools.py, definieren Sie die Funktion:
def add_values(first, second):
return float(first) + float(second)
g_exportedScripts = (add_values,)
Erstellen Sie anschließend ein einfaches Makro in Calc und verwenden Sie es:
Sub RunPythonHelper()
Dim session As Object
Dim result As Variant
Dim sheet As Object
session = CreateScriptService("Session")
result = session.ExecutePythonScript( _
session.SCRIPTISPERSONAL, _
"calc_tools.py$add_values", _
12, 30)
sheet = ThisComponent.CurrentController.getActiveSheet()
sheet.getCellRangeByName("B1").setValue(result)
End Sub
Führen Sie RunPythonHelperdas Skript über die Makroauswahl aus. Bei erfolgreichem Aufruf sollte in B1 der Wert 42 angezeigt werden. Die Skriptreferenz folgt dem Format module.py$function_name`<script referenz>`. Für ein Modul in einem Unterordner oder an einem anderen Speicherort verwenden Sie die Syntax und die für die jeweilige ScriptForge-Version dokumentierte Speicherortkonstante. Verwenden Sie für Argumente und Rückgabewerte Datentypen, die von beiden Sprachen sauber dargestellt werden können, wie z. B. Zahlen, Zeichenketten und einfache Sequenzen.
CreateScriptServiceDie dokumentierten ScriptForge-Sitzungshilfsfunktionen sind in modernen LibreOffice-Versionen verfügbar, Menünamen und mitgelieferte Komponenten können jedoch in älteren oder in Distributionspaketen enthaltenen Versionen abweichen. Falls dieser Dienst nicht verfügbar ist, verwenden Sie die dokumentierte UNO-Skriptanbietermethode von LibreOffice, die ein Makro XScriptaus einer Skript-URI abruft und aufruft. Vermeiden Sie es, Codefragmente für einen anderen Makrospeicherort zu kopieren, ohne die Speicherorteinstellung zu ändern.
Soll der Python-Code persönlich, geteilt oder eingebettet sein?
| Lagerung | Optimale Passform | Abtausch |
| Meine Makros / Benutzerprofil | Ihre eigenen wiederverwendbaren Werkzeuge für verschiedene Dokumente | Wird nicht automatisch beim Versenden der Tabelle mitgeliefert. |
| Anwendungsmakros | Skripte werden für mehrere Benutzer auf einer Installation verwaltet | Für die Installation und Wartung ist in der Regel ein Administratorzugriff erforderlich. |
| Dokumentmakros | Code, der einem Dokument zugeordnet werden soll | Die Empfänger müssen möglicherweise Makros zulassen; testen Sie die Portabilität und das Sicherheitsverhalten in der Zielversion von LibreOffice. |
Für einen Team-Workflow sollten Sie festlegen, wie die Empfänger den Code erhalten und ihm vertrauen, bevor Sie eine Arbeitsmappe mit einem persönlichen Makro erstellen. Falls die Python-Logik in die Tabellenkalkulation integriert werden muss, testen Sie die Makrospeicherung und die Sicherheitsabfragen des Dokuments mit denselben LibreOffice-Versionen, die Ihre Empfänger verwenden. Bei der verwalteten Bereitstellung kann ein Administrator Skripte für Benutzer paketieren oder eine Erweiterung gemäß den üblichen Softwarerichtlinien der Organisation verteilen.
Warum könnte das Makro fehlen oder fehlschlagen?
- Die Python-Option bzw. das Python-Modul fehlt. Bei einigen GNU/Linux-Distributionen ist das Python-Skript-Framework von LibreOffice ein optionales Paket. Falls die Python-Makros im Makro-Dialog nicht angezeigt werden, überprüfen Sie die Installationshinweise Ihrer Distribution zu LibreOffice.
- Das Skript wurde im falschen Profil gespeichert. LibreOffice unterstützt mehrere Benutzerprofile. Überprüfen Sie den Profilpfad Ihrer aktuellen Installation und speichern Sie das Modul im entsprechenden
Scripts/pythonVerzeichnis.
- Die Funktion wird nicht exportiert. Fügen Sie sie
g_exportedScriptseiner Funktion hinzu, die Sie über den Makroselektor ausführen möchten. Achten Sie darauf, dass die Tupelsyntax das abschließende Komma für ein Tupel mit einem Element enthält.
- Das Skript wird außerhalb von LibreOffice ausgeführt.
XSCRIPTCONTEXT Es existiert für ein Makro, das von LibreOffice gestartet wird, nicht aber, wenn dieselbe Datei mit dem Systembefehl gestartet wird python. Verwenden Sie den Makro-Runner oder richten Sie eine dokumentierte UNO-Verbindung ein.
- Die Makrosicherheit blockiert eingebetteten Code. Überprüfen Sie die Makrosicherheitseinstellungen von LibreOffice und aktivieren Sie nur Code aus vertrauenswürdigen Quellen. Das Senken der globalen Sicherheitsstufe ist keine geeignete Lösung zur Fehlerbehebung.
- Ein importiertes Modul kann den Dokumentkontext nicht einsehen. LibreOffice-Dokumente
XSCRIPTCONTEXTwerden nicht an importierte Module übergeben. Übergeben Sie das benötigte Dokument- oder Tabellenblattobjekt an Hilfsfunktionen, anstatt zu erwarten, dass importierte Module diese globale Variable lesen.
- Es gibt keine sichtbare Konsolenausgabe. Die Standardausgabe von Python ist nicht verfügbar, wenn ein Makro über das Menü „Tools > Makros“ ausgeführt wird. Um eine Rückmeldung zu erhalten, schreiben Sie das Ergebnis in eine Zelle, verwenden Sie einen LibreOffice-Dialogdienst oder protokollieren Sie die Ausgabe in einer Datei Ihrer Wahl.
Wie lässt sich das Ergebnis sicher überprüfen?
Testen Sie mit einer Kopie der Tabelle und einer bekannten Eingabe. Stellen Sie sicher, dass das Python-Makro im Runner angezeigt wird, führen Sie es einmal aus und vergleichen Sie die Ausgabezelle mit einem manuell berechneten Ergebnis. Testen Sie bei einem Basic-zu-Python-Aufruf eine einfache Eingabe und prüfen Sie, ob der zurückgegebene Wert in das gewünschte Tabellenblatt geschrieben wird. Vermeiden Sie Skripte, die Tabellenblätter löschen, große Bereiche überschreiben oder Betriebssystembefehle ausführen.
Wenn der Test erfolgreich ist, legen Sie fest, wie das Skript auf anderen Computern installiert werden soll, und dokumentieren Sie alle benötigten Python-Bibliotheken oder LibreOffice-Versionsvoraussetzungen. Die in LibreOffice integrierte Python-Umgebung wird für In-Process-Makros verwendet; Pakete, die für einen separaten System-Python-Interpreter installiert wurden, stehen möglicherweise nicht zur Verfügung. Falls Sie Pakete eines anderen Interpreters benötigen, verwenden Sie die Methode „Externer Prozess/UNO“ und konfigurieren Sie diese Verbindung entsprechend.
Offizielle Referenzen