Anleitung wie man Python in LibreOffice verwendet

Hallo Zusammen,

ich habe schon ähnliche Fragen im englischsprachigen Teil des Forums gestellt, möchte aber die Chance nicht ungenutzt lassen eventuell ein kompletten Guide, vorzugsweise in Deutsch (englisch wäre aber auch ok) zu finden.

Zielsetzung ist folgende:

Makros mit Python programmieren und auch in der Lage sein diese zu Debuggen.

Meine präferierte IDE für Python ist PyCharm, inzwischen wäre ich aber schon froh wenn es einfach geht.

Ich glaube das Potential von LibreOffice in Verbindung mit Python ist riesig, so richtig verstehe ich daher nicht warum die Hürden das zu nutzen dann doch so hoch sind - oder falls die Hürden nicht so Hoch sind, warum Sie nicht als ein Guide zusammengefasst sind. (Vielleicht kenne ich zu wenig Hintergründe oder bestenfalls kann mir jemand eine komplette Anleitung senden?) Ich finde zudem auch keine Roadmap für LibreOffice selbst, wünschenswert wäre ja die Integration von Haus aus, muss nicht als eigene IDE sein, aber wäre doch wüschenswert wenn die Anlaufschwierigkeiten nicht zu einem so großen Overhead führen das Menschen die Lust schon vor Beginn der Arbeit verlieren (das ist eher Wunsch den Kritik, ich verstehe das LibreOffice ein freies Projekt ist und sicher auch die Kapazitäten sehr Beschränkt sind)

Ich möchte für unseren Verein gern in Zukunft alle Dokumente auf LibreOffice umstellen, diverse Funktionen sollen dabei auch automatisiert möglich sein → daher Makros.

Falls ich irgendwann nicht mehr im Verein tätig sein sollte, möchte ich natürlich alles so hinterlassen das die Schwelle meine Arbeit fortzuführen oder kleinere Anpassungen zu machen oder den Funktionsumfang um neue Anforderungen zu erweitern möglichst gering ist. Auch dafür wäre so ein Guide sehr hilfreich.

Das Programmieren von StarBasic empfinde ich als sehr unbefriedigend, denn durch das fehlen von IntelliSense ist es sehr schwierig schnell neue Funktionalitäten zu erstellen. Ich schätze den Lernerfolg für unbedarfte bei Python höher ein, zum einen weil die Entwicklungsumgebungen die Nutzer in der Arbeit unterstützen (Hinweise zu PEP und IntelliSense) und zum anderen weil die Motivation etwas zu lernen das einem möglicherweise an anderen Stellen im Leben ebenfalls helfen kann höher sein wird als eine ScriptSprache zu erlernen welche nur einen Zweck hat.

Meine bisherigen Schritte um meine Ziele zu erreichen sind folgedne:

Ich finde die Informationen die ich schon dafür gebraucht habe liegen einfach an zu vielen Orten, aber wie gesagt, vielleicht habe ich den einen Guide noch nicht gefunden.

Als eine Antwort im englischsprachigen Raum habe ich folgende Seite bekommen:
https://wiki.documentfoundation.org/Macros/Python_Basics#PyCharm

Leider finde ich das für mich nicht sehr Hilfreich, entweder ich stelle mich besonders blöd an, oder es sind einfach zu wenig Informationen enthalten. Am Ende muss man nun wieder 2 Tage quer lesen und alle möglichen Suchanfragen starten, alles in allem sehr anstrengend um in das Thema rein zu kommen.

Hallo
PyCharm ist zweifellos eine sehr gute und ausgereifte IDE für Python, ich habe es selbst vor einiger Zeit lange genutzt.
Momentan arbeite ich aber auf einem kleinen RaspberryPi-board mit Debian, da sind die Resourcen etwas eingeschränkt. (soviel zum Hintergrund)

Soweit ich weiss benutzt Pycharms-Intellisence(-autovervollständigung) nur statische Informationen aus bereits Geschriebenen respective aus importierten python-modulen?
An der Stelle beginnt das eigentliche Problem - du möchtest ja in Zusammenhang mit LO auch und vor allem anderen auch Zugriff auf Objekte und deren Attribute|Properties|Methoden… dynamisch zur Laufzeit, ohne das diese statisch in irgendeiner Weise verfügbar sind.

Zur Lösung dieses Problems benutze und empfehle ich:

Hier nochmal kurz ein Update des relevanten Codes:

#starten von LO im PIPE-modus
from subprocess import Popen
from random import sample
from string import ascii_letters as abc

PIPENAME = ''.join(sample(abc,8))

officepath = 'soffice'
calc = '--calc'
pipe = f"--accept=pipe,name={PIPENAME};urp;StarOffice.ComponentContext"


Popen([officepath,
       calc,
       #env, 
       pipe]); PIPENAME
print(f'LibreOffice has started and is available via PIPE: {PIPENAME}') 


### eine Zelle weiter:
### Verbindung herstellen:
import uno
from pythonscript import ScriptContext

local = uno.getComponentContext()
resolver = local.ServiceManager.createInstance("com.sun.star.bridge.UnoUrlResolver")


client = resolver.resolve( "uno:pipe,"
                           f"name={PIPENAME};"
                           "urp;"
                           "StarOffice.ComponentContext")

createUnoService = client.ServiceManager.createInstance

(
 file_access,
 pathsubstitution,
 mri) = map(   createUnoService,(
                 "com.sun.star.ucb.SimpleFileAccess",
                 "com.sun.star.util.PathSubstitution",
                 "mytools.Mri" )
             )

XSCRIPTCONTEXT = ScriptContext(client, None, None) ##!!!

Via XSCRIPTCONTEXT hast du danach vollständigen interaktiven Zugang zur Objekthierarchie innerhalb LO, zB.

doc =XSCRIPTCONTEXT.getDocument()
sel = doc.CurrentSelection

Jupyter notebook wird im einfachstem Fall(Linux-distribution dessen LO direkt mit der ebenfalls mitgeliefertem System-python-umgebung zusammenarbeitet) installiert mit:

pip3 install notebook --user --upgrade
1 Like

Vielen Dank für Deine Antwort, Der Hintergrund erschließt sich mir schon mal, die Umsetzung der Lösung noch nicht ganz.

Ich fühle mich immer ein wenig erschlagen vom Umfang der geleistet werden muss um das zur Verfügung zu stellen, sorry.

Ich versuche das mal durchzuarbeiten, aber so richtig weiß ich noch nicht wann ich welches Script laufen lassen muss.

Von meinem Verständnis zu Beginn der Entwicklung, also immer dann wenn man Programmiert, muss das Script welches die Brücke schlägt laufen? Ist das Korrekt?
Wenn ja, wo und wie starte ich es?

Danke und sorry, ich glaub nach mittlerweile 3 oder 4 Tagen versuchen um nur mal zu beginnen bin ich leicht frustriert und nicht mehr ganz so enthusiastisch am weiter tüfteln.

Ganz ehrlich? Bleib bei Microsoft Office! Du brauchst Monate, um den ganzen VB-Kladderadatsch umzustellen. Das ist es einfach nicht wert. Seit 20 Jahren habe ich MS Office hinter mir gelassen. Für mich beruflich war das Eindampfen von Makrocode auf vielleicht 500 oft verwendete Zeilen Basic oder Python unerlässlich. Stattdessen beschäftigen wir halt keine Idioten, die nicht wissen was eine Vorlage ist. Zumindest bleiben sie es nicht lange. Ich habe vor 14 Jahren sehr viel mehr mit der Gestaltung von Briefvorlagen, Datenquellen, Formularen, Berichten und wiederverwendbaren Kalkulationsmodellen verbracht als mit Makroprogrammierung. Wenn mal wieder ein Serienbrief rausgeht oder Etiketten bedruckt werden, die nicht aus einer bestehenden Datenquelle gepeist werden können, dann ist meine Aufgabe nicht, ein Programm zu schreiben sondern eine Datenquelle zusammenzustellen, so dass die Mädels diese mit wenigen Klicks in ihr neues Dokument (erstellt aus einer meiner Vorlagen) übernehmen können. Alles andere wäre Wahnsinn aber leider super-einfach in VBA weshalb Millionen User an VBA hängen wie der Junkie an der Nadel. Auch MS Office ließe sich weitestgehend Makrofrei bedienen, bloß weiß heute keiner mehr wie das geht.

1 Like

Was ist denn jetzt so schwierig? Einfach mal loslegen!
Starte irgendeinen Texteditor.

def HelloWorld2Calc(**args):
    doc = XSCRIPTCONTEXT.getDocument()
    view = doc.getCurrentController()
    cell = view.getCurrentSelection() #hoffentlich eine Zelle
    cell.setString('Hallo Welt!')

Speicher Dein Programm unter /user/Scripts/python/test.py
Öffne LibreOffice und navigiere Extras>Makros>Verwalten>Python… und schon kannst Du das Ding starten indem Du es unter “Meine Makros” > test> HelloWorld2Calc doppelklickst.
Die Beispielmakros unter “LibreOffice Makros” sind im Installationsverzeichnis abgelegt funktionieren aber genauso.
XSCRIPCONTEXT ist alles, was Du für Makroprogrammierung brauchst. Definiert ist das in irgendeinem der mitgelieferten Helferlein, das immer mit Deinen Makros geladen wird. Einfach erstmal so hinnehmen und loslegen.
Debugging ala print(var) mach ich unter Linux meist auf dem Terminal, indem ich LibreOffice per Kommandozeile starte. Die Python prints werden dann dort ausgegeben.
Für das Programmieren von Python Extensions gelten etwas andere Prozeduren. Extensions liefern zusätzliche UNO services und erscheinen nicht in der Makro-Hierarchie. Viel zu kompliziert für den Anfang.

1 Like

…und WIE sähe eine function aus, die ich aus einer calc.Zelle mit “=RechneMalWas(**args)” aufrufen bzw nutzen kann?

vielleicht so? :

def RechneMalWas(**args):
    *** Code***
    return ***Ergebnis

Geht so nicht. Das musst Du entweder in Basic machen oder ein richtiges Add-In erstellen. Die Funktionen eines Add-Ins erscheinen mit allen anderen Funktionen in der Benutzerschnittstelle z.B. im Formelassistenten aber nicht in den Makro-Dialogen.
Mein Lieblings-Add-In in Python: [Calc][oxt] A function for all python string methods (View topic) • Apache OpenOffice Community Forum weil es Textfunktionen hinzufügt, die in jeder Programmiersprache selbstverständlich sind aber weder in Calc noch in Basic vorhanden sind.
Dann habe ich mal den Quellcode eines Suduko-Solvers genommen, Input und Output in DataArrays umgewandelt und mein eigenes Add-In verpackt. Funktioniert super, ohne dass ich den Quellcode erklären könnte: PySudoku » Extensions
Was genau willst Du denn berechnen, wofür die normallen Tabellenfunktionen nicht gut genug sind?

Unter der Voraussetzung stimme ich @Villeroy zu, bau das um auf Vorlagen, Adressdatenbank vielleicht noch ein paar Serienbrief-dokumente und gut.

1 Like

Danke für eure Antworten.

also loslegen ist nicht so schwierig.
Die Python Examples von LO kann ich mir alle in PyCharm ansehen und nachvollziehen.

Ich kann auch neue Python Makros erstellen.

Das ist alles schon ganz nett, was mir weiterhin fehlt ist

  • die Funktionalität das mir schön während des programmieren die Funktionen aufgelistet werden die ein Objekt liefert und
  • ein Programm in PyCharm zu Debuggen.

Diese beiden Anforderungen noch gelöst zu bekommen wäre toll. Ich arbeite derzeit unter Win10, kann aber auch mal wieder ein Linux aufsetzen.

Warum soll es denn Python sein?

Für die erste Aufgabe die ich bewältigen möchte soll der Kontoauszug welcher als CSV vorliegt und Buchungssätze unserer Buchhaltungstabelle überführt werden. Manche Positionen sind wiederkehrend und eindeutig und können somit komplett fertig gemacht werden, wiederum andere zu 80% und bei manchen muss man eben vielleicht nochmal ein paar Zellen gelb einfärben das die Schatzmeister wissen das man dort nochmal händisch drüber gehen muss.

  • Sowas kann man auch ohne Makros machen, aber ich glaube das ist nicht zielführend und führt zu unendlich langen IFs als Zellenformeln.
  • sowas kann man auch in StarBasic machen, aber sobald ich auf die Methoden und Objekte zugreifen könnte wäre ich python deutlich schneller
  • man kann auch weiter Office und VBA nutzen, wir würden aber gern mit den “Großen” brechen

Ich bin imr nicht sicher ob meine Anforderungen umsetzbar sind, glaube aber das dies geht - nur durch die API etwas umständlicher. Außerdem glaube ich es gibt nicht den einen Weg sondern wahrscheinlich sogar mehrere. Leider finde ich als Einsteiger die Dokumentation an der Stelle nicht ausreichend. Da wird nicht auf die Verscheidenen Varianten und deren Vor- und Nachteile eingegangen und auch keine Variante von Anfang bis Ende beschrieben (so kommt es mir zumindest vor, weshalb bei mir die Frustration dahingehend schon gestiegen ist).

Aufgeben mag ich noch nicht wirklich, falls Ihr den Mut nicht verliert und auf meine Fragen eingehen könnt wäre das toll.

Versteif Dich doch nicht auf einen Editor. Das bringt doch nichts. Office macros sind auch keine Projekte mit tausenden Zeilen in dutzenden Modulen erstellt von dutzenden Mitarbeitern. Wir reden hier über hunderte Zeilen maximal. Mit MIRI kann man sich halbwegs bequem durch die Objekthierarchie hangeln. Was ist denn schon simpel UND perfekt?
Abgesehen davon: Die allermeisten Office-Makros sind pure Zeitverschwendung entstandan aus Ignoranz gegenüber der Anwendung. Wenn ich einen ganzen Nachmittag für so eine “Lösung” dran gebe, die dann vielleicht 10 Klick-Aktionen einspart, wie oft hätte ich die 10 Klicks ausführen können oder wie lange hätte es gedauert bis mir eine bessere Dokumentenstruktur, Absatzvorlagen, Zellvorlagen, Dokumentenvorlage, eine bessere Vorgehensweise einfefallen wäre? Makros verfestigen schlechte Strukturen und Arbeitsabläufe, indem sie sie rationalisieren. Was willst Du denn auch groß rationalisieren bevor Du zu 80% mit LibreOffice vertraut bist? Du weißt doch gar nicht, mit wen Du da in Python kommunizierst.

Das liegt einfach nur daran, dass diese API nicht für Einsteiger gemacht ist. Professionelle Programmierer sind sowas gewohnt. Ich habe sogar schon gelesen, dass Profis die UNO-Technologie genial finden weil der Entwicklungsaufwand für die Office-Programmierer denkbar gering ist. Und das ist bei Open Source Projekten wesentlich. Die Office-API fällt sozusagen als selbst-dokumentierendes Zubehör aus dem Compiler. EIne Brücke von UNO zu einer neuen Programmiersprache ist in wenigen Tagen von einer versierten Person zu bewerkstelligen. Umgekehrt ist der Office-Quellcode gar nicht mehr so arg kryptisch wenn man sich in UNO gut auskennt.
VBA ist dagegen eine zweite Office Suite für Programmieranfänger. Ich erinnere mich, dass man bei der Installation von Excel 8 (1997) den ganzen VBA-Kram abwählen konnte. Die Installation obne VBA war wesentlich kleiner.

Apropos Fußabdruck. Ich habe hier noch die Microsoft Viewer für Powerpoint, Excel und Word. Diese 3 Programme zeigen doc(x), rtf, ppt(x)und xls(x) so an wie MS Office. Die 4 Installationspakete sind genauso fett wie die Vollinstallation von OpenOffice, das eine Unzahl von Dateiformaten einigermaßen lesen und schreiben kann, einschließlich Python und Basic Runtime, Vectorgrafik, Datenbank, Formeleditor und allem Zubehör.