Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

wiki:libreofficepython [2017/10/04 22:27]
nils-rennebarth gelöscht
— (aktuell)
Zeile 1: Zeile 1:
-====== Datenbank Zugriff und Scripts zur Listengenerierung ====== 
- 
-BioOffice hat im Hintergrund eine Microsoft-SQL Datenbank laufen (Diese läuft auf einer virtuellen Windows Maschine namens bodb) Auf diese Datenbank - genauer auf einen eigens generierten View davon - greifen Python Skripte zu um in LibreOffice - Calc Listen vollautomatisch zu generieren. Dies sind momentan folgende 
-  * Waagenliste,​ also die neben den Obst/​Gemüse Waagen aushängende Liste für Selbstabwieger 
-  * Kassenliste Obst/​Gemüse 
-  * Kassenliste Brot Schäfer 
-  * Kassenliste Brot Weber 
-Der folgende Text erklärt, im Detail, wie die Skripte funktionieren und was man wissen muss um sie weiterzuentwickeln,​ insbesondere die Verbindung Python <-> LibreOffice 
- 
-===== Datenbankzugriff ===== 
-Ich habe jtds, eine als jdbc Treiber ausgelegter MS-SQL Client ausgewählt weil ich damit schon gearbeitet habe und weiß dass und wie es geht, und weil es sowohl für Windows als auch für Linux - wo meine Entwicklung stattfindet - verfügbar ist. Unter debian ist es das Paket ''​libdts-java''​. 
- 
-Für LibreOffice muss man nun eine Datenquelle erstellen, jedenfalls habe ich keinen anderen Weg gefunden unter LibreOffice+Python die Datenbank anzusprechen:​ 
-  * In LibreOffice-Base "​Datenbank auswählen"​ -> Mit existierender Datenbank verbinden wählen und als Type JDBC wählen 
-  * Als Datasource URL <​code>​jdbc:​ jtds:​sqlserver://​bodb:​1433/​Extras;​password=-BioOffice-</​code>​ 
-  * Als JDBC Driver class ''​net.sourceforge.jtds.jdbc.Driver''​ 
-  * Als User name ''​sa''​ 
-Dann unter dem Namen ''​bodb''​ speichern. Das ist der Name der später in Python benutzt wird um die Datenquelle zu referenzieren. 
- 
-LibreOffice muss der Standard Java Classpath wo auch libtds installiert ist explizit mitgeteilt werden. Unter Linux dazu in LibreOffice -> Tools -> Optionen -> LibreOffice -> Advanced -> Java Options -> Class Path ''/​usr/​share/​java''​ hinzufügen. Unter Windows im selben Menu stattdessen das jtds .jar Archiv direkt hinzufügen. Vorher braucht man natürlich in beiden Fällen im LibreOffice ​ eine Java Runtime Umgebung. 
- 
-===== Python als Scriptsprache für LibreOffice===== 
-Unter Windows wird diese standardmäßig mitinstalliert. Unter Debian/​Ubuntu braucht es das 
-Paket ''​libreoffice-script-provider-python''​. Python Skripte müssen in das Unterverzeichnis ''​Scripts/​python''​ des Benutzerprofils (wo das bei libreoffice ist, siehe weiter unten). Der Filename des Scripts (ohne die ''​.py''​ - Endung) und Verzeichnisse darunter werden bei der Auswahl von auszuführenden Makros als Baum angezeigt, und die top level Funktionen in den Files als Blätter, die man laufen lassen kann. 
- 
-Ist im selben Verzeichnis wie das Skript ein Verzeichnis namens ''​pythonpath'',​ dann wird es zum Suchpfad für Python-Module des Skripts hinzugefügt. 
- 
-Basic Skripte sind im Verzeichnis ''​basic''​ des Benutzerprofils,​ in auf ''​.xba''​ endenden Dateien, ansonsten ist die Baumstruktur dieselbe. 
- 
-==== Shortcut für Makro generieren ==== 
-Ein Makro von der LibreOffice Benutzeroberfläche aus aufzufen ist ziemlich umständlich:​ Tools- -> Macros -> Run Macros, zwei weitere Klicks um den Baum zu öffnen, dann das Makro auswählen und Run drücken, also sollte man sich zum Testen schnell ein Shortcut generieren, das in unserem Fall dann auch gleich für die Endbenutzerin taugt. Das Makro - genauer die top-level Funktion - muss allerdings schon existieren um den Shortcut anzulegen, der Inhalt ist aber egal. Es reicht, parallel die Makro Datei zu editieren, Neustart von LibreOffice ist nicht nötig. 
- 
-Den Shortcut also erzeugen mit Tools ->​Customize -> Toolbars, neuen Toolbar anlegen, dabei darauf achten dass dieser nicht dokumentspezifisch ist, und dann von Macros das gewünschte Makro auswählen. 
- 
-Makros können auch an Events statt an Icons in Toolbars gebunden werden, das geht mit dem Reiter Events statt Toolbars. 
- 
-==== Direkte Interaktion mit LibreOffice von der python Kommandozeile ==== 
-Ein ziemlich cooles Feature zum Entwickeln ist die Fernsteuerung einer LibreOffice Instanz von der python Kommandozeile aus. Details unter https://​bitbucket.org/​t2y/​unotools 
-Das python Paket ''​unotools''​ erlaubt es, mit einem laufenden LIbreOffice Prozess über einen lokalen Socket zu kommunizieren,​ vorausgesetzt,​ man startet LibreOffcie mit 
-<​code>​ 
-libreoffice --calc --accept="​socket,​host=localhost,​port=2002;​urp;​StarOffice.ServiceManager"​ 
-</​code>​ 
-Der Ausgangspunkt um mit LibreOffice zu reden ist ein Objekt 
-der Klasse ''​context''​. In einem Makro das 
-von innerhalb von LibreOffice aufgerufen wird ist eine Instanz in der globalen Variable 
-''​XSCRIPTCONTEXT''​ zu finden. In einer interaktiven python session bekommt man es 
-wie folgt: 
-<​code>​ 
-import uno 
-localContext = uno.getComponentContext() 
-resolver = localContext.ServiceManager.createInstanceWithContext( 
-  "​com.sun.star.bridge.UnoUrlResolver",​ 
-  localContext 
-) 
-ctx = resolver.resolve( 
-  "​uno:​socket,​host=localhost,​port=2002;​urp;​StarOffice.ComponentContext"​ 
-) 
-</​code>​ 
-Als nächstes braucht man einen ServiceManager,​ Desktop und model. In einem Makro bekommt man sie mit 
-<​code>​ 
-ctx = XSCRIPTCONTEXT.getComponentContext() 
-smgr = ctx.ServiceManager 
-desktop = XSCRIPTCONTEXT.getDesktop() 
-model = desktop.getCurrentComponent() 
-</​code>​ 
-In einer interaktiven Session dagegen mit 
-<​code>​ 
-smgr = ctx.ServiceManager 
-desktop = smgr.createInstanceWithContext("​com.sun.star.frame.Desktop",​ ctx) 
-model = desktop.getCurrentComponent() 
-</​code>​ 
-Nebenbei können Skripte auch in einem Dokument direkt untergebracht werden, das ja 
-eigentlich eine .zip Datei ist. Python Skripte kommen in das ''​Scripts/​python''​ Unterverzeichnis der 
-Zip-Root und müssen im Manifest ''​META-INF/​manifest.xml''​ erwähnt sein. 
- 
-Methoden und Properties von XSCRIPTCONTEXT 
-  * **getDocument** Liefere das momentane Dokument 
-  * **getDesktop** Liefere das Desktop Objekt 
- 
-==== Zusammenhang mit Basic ==== 
-Die meiste Dokumentation im Netz erwähnt Basic als Programmiersprache,​ und die Methoden 
-und Objekte die dort erwähnt werden sind dieselben. Man muss jedoch ''​CreateUnoService''​ 
-ersetzen durch: 
-<​code>​ 
-context.getServiceManager().createInstanceWithContext("​service-string",​ context) 
-</​code>​ 
-Und wenn CreateUnoService Argumente braucht muss man ''​createUnstanceWithArgumentsAndContext''​ nehmen. Mehr unter 
-https://​wiki.openoffice.org/​wiki/​Python/​Transfer_from_Basic_to_Python 
- 
- 
-===== Benutzung von Uno ===== 
-**Uno** ist der Kurzname für die von OpenOffice/​LibreOffice verwendete Klassen und Interface Struktur. API Referenz in  
-http://​www.openoffice.org/​api/​docs/​common/​ref/​com/​sun/​star/​module-ix.html 
- 
-Die generelle Längeneinheit ist 1/100 mm 
- 
- 
- 
-==== Introspektion ==== 
-==== Tabellenkalkulation benutzen ==== 
-Ein calc Dokument enthält ein oder mehrere Sheets. Ein neues Dokument erhält man mit 
-  calc = desktop.loadComponentFromURL( 
-    "​private:​factory/​scalc",​ "​_blank",​ 0, () 
-  ) 
-  sheet = calc.Sheets.getByIndex(0) 
-Das öffnet auch ein neues Fenster, das defaultmäßig ein neues Sheet mit Index 0 enthält. 
-Ein neues Sheet in einem existierenden Dokument: 
-  calc.Sheets.insertNewByName("<​name>",​ position) 
-  sheet = calc.Sheets.getByIndex(position) 
-Die Property ''​Name''​ kann man zum Setzen/​Erhalten des Namens nutzen. Ein Sheet kann mit 
-  calc.Sheets.removeByName("<​name>"​) 
-auch wieder löschen. Testen ob eins mit einem Namen vorhanden ist geht mit 
-  calc.Sheets.hasByName("<​name>"​) 
-und alle Namen bekommt man mit 
-  calc.Sheets.getElementNames() 
-die Reihenfolge ist jedoch beliebig und entspricht nicht den Indices. 
-Das momentan aktive Sheet entspricht der Property ''​calc.CurrentController.ActiveSheet''​ 
-(set und get möglich) 
- 
-==== Seiteneigenschaften ==== 
- 
-==== Datenbank benutzen ==== 
- 
-===== Pfade in Libre Office ===== 
-===== Hilfreiche URLs ===== 
-  *  https://​wiki.openoffice.org/​wiki/​Python_as_a_macro_language 
-  * https://​wiki.openoffice.org/​wiki/​Documentation/​BASIC_Guide/​Formatting_Spreadsheet_Documents 
-  * http://​www.openoffice.org/​api/​docs/​common/​ref/​com/​sun/​star/​module-ix.html