Seite 1 von 1

Python-Macro in *ODS einbinden

Verfasst: Mi 16. Jan 2019, 11:54
von many
Hey ihrs!

Ich habe ein Script geschrieben, dass ich gerne als Macro in eine LibreOffice-Tabelle einbinden möchte, da die Eingangsparameter sowieso in eine Tabelle eingetragen sein müssen.

Wie ich Python-Macros in LibreOffice einbinde und ausführe weiß ich. Aber ich möchte, dass die Macros in der *.ods implementiert sind. Der "normale" Weg scheint ja das Speichern im Python-Verzeichnis der Libre-Office-Version zu sein. Welche Wege gibt es da? Ich habe bereits nach Lösungen gesucht, finde aber nichts 100%ig passendes (oder ich habs nicht richtig verstanden).

Re: Python-Macro in *ODS einbinden

Verfasst: Mi 16. Jan 2019, 12:06
von many
Hey many, ich habe die Lösung gefunden ;)

http://christopher5106.github.io/office ... acros.html

Re: Python-Macro in *ODS einbinden

Verfasst: Mi 16. Jan 2019, 16:06
von many
Heyhey.
Ich bekomme mit der oben genannten Methode nur "kaputte" *.ods-Files. Hat irgendwer eine funktionierende Methode mit der ich mich einarbeiten kann? Ich würde das Script ungerne in BASIC umschreiben.

Re: Python-Macro in *ODS einbinden

Verfasst: Mi 16. Jan 2019, 18:15
von many
https://www.uni-due.de/~abi070/files/OO ... ericht.pdf

Ich hab es jetzt per Hand (durch die genannte PDF) geschafft eine *ods so zu manipulieren, dass die Python-Scripte implementiert sind. Damit habe ich ordentlich was gelernt und einfache Py-Scripte bekommen jetzt wohl öfter eine LibreCalc-GUI ;)

Re: Python-Macro in *ODS einbinden

Verfasst: Fr 18. Jan 2019, 22:59
von mikele
Hallo,
das Python-Script zum Einbinden von Python-Makros in eine ods-Datei finde ich spannend. Da es aber die geänderte META-INF/manifest.xml zusätzlich in das ods-Archiv schreibt (sodass dann zwei solche Dateien vorhanden sind), habe ich etwas weiter gesucht und zusammengeschustert.
Das Schnipsel aus https://stackoverflow.com/questions/513 ... ile-module führte zu

Code: Alles auswählen

import zipfile
import sys

macroname=sys.argv[2].split('/')[-1]

filename = sys.argv[1][:len(sys.argv[1])-4]+'_mit_Makro'+sys.argv[1][-4:]
print("Open file " + sys.argv[1])

doc = zipfile.ZipFile(sys.argv[1],'r')
manifest = []
for line in doc.open('META-INF/manifest.xml'):
  if '</manifest:manifest>' in line.decode('utf-8'):
    for path in ['Scripts/','Scripts/python/','Scripts/python/'+macroname]:
      manifest.append(' <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="%s"/>' % path)
  manifest.append(line.decode('utf-8'))
zout = zipfile.ZipFile (filename, 'w')
for item in doc.infolist():
    buffer = doc.read(item.filename)
    if (item.filename != 'META-INF/manifest.xml'):
        zout.writestr(item, buffer)
zout.writestr('META-INF/manifest.xml', ''.join(manifest))
zout.write(sys.argv[2], "Scripts/python/"+macroname)

zout.close()
doc.close()
print("File created: "+filename)
Abgespeichert in z. B. insert_macro.py kann es mit zwei Parametern versehen aufgerufen werden:

Code: Alles auswählen

python insert_macro.py tabellenkalkulationsdatei.ods macro.py
und bindet die Datei macro.py in die ods-Datei ein.
Getestet habe ich es unter Linux. Unter Windows wird wahrscheinlich die Zeile

Code: Alles auswählen

macroname=sys.argv[2].split('/')[-1]
in

Code: Alles auswählen

macroname=sys.argv[2].split('\')[-1]
geändert werden.
Die Python-Profis haben bestimmt noch ein paar Verbesserungsvorschläge.