🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Python-Macro in *ODS einbinden

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
many
Beiträge: 4
Registriert: Mi 16. Jan 2019, 11:44

Python-Macro in *ODS einbinden

Beitrag von many » Mi 16. Jan 2019, 11:54

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

many
Beiträge: 4
Registriert: Mi 16. Jan 2019, 11:44

Re: Python-Macro in *ODS einbinden

Beitrag von many » Mi 16. Jan 2019, 12:06

Hey many, ich habe die Lösung gefunden ;)

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

many
Beiträge: 4
Registriert: Mi 16. Jan 2019, 11:44

Re: Python-Macro in *ODS einbinden

Beitrag von many » Mi 16. Jan 2019, 16:06

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.

many
Beiträge: 4
Registriert: Mi 16. Jan 2019, 11:44

Re: Python-Macro in *ODS einbinden

Beitrag von many » Mi 16. Jan 2019, 18:15

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 ;)

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: Python-Macro in *ODS einbinden

Beitrag von mikele » Fr 18. Jan 2019, 22:59

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.
Gruß,
mikele


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten