[gelöst] Makro zum Abspeichern einer .ods als .xml

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] Makro zum Abspeichern einer .ods als .xml

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Di, 05.05.2015 10:12

Karolus hat geschrieben:Hallo

An der Stelle muss ich mal meine Bedeutung als Python-experte schmälern:
Meine Lösung hat einen gravierenden Fehler, sobald der Benutzer xml-steuerzeichen wie <>.. eingibt, wird eine kaputte xml-datei erzeugt - besser wäre da der Einsatz einer xml-Library die sich um das escapen der Steuersequenzen kümmert.

Vielleicht repariere ich das noch....
Mit diesem Fehler denke ich kann ich leben. Die gewünschten Werte benötigen keine <> als Zeichen, sodass ich da auch nicht mit Problemen rechnen. Wenn doch, lässt sich dies organisatorisch regeln.
Für mich brauchst du dieses Script nicht nochmal überarbeiten.

An dieser Stelle nochmal vielen Dank. Es funktioniert wunderbar. Habe die Tabelle nun noch mit ein paar Funktionen erweitert und nun eine tolle Lösung für den geplanten Einsatzzweck.

Re: Makro zum Abspeichern einer .ods als .xml

von Karolus » Do, 30.04.2015 23:45

Hallo

An der Stelle muss ich mal meine Bedeutung als Python-experte schmälern:
Meine Lösung hat einen gravierenden Fehler, sobald der Benutzer xml-steuerzeichen wie <>.. eingibt, wird eine kaputte xml-datei erzeugt - besser wäre da der Einsatz einer xml-Library die sich um das escapen der Steuersequenzen kümmert.

Vielleicht repariere ich das noch....

Re: Makro zum Abspeichern einer .ods als .xml

von Stephan » Do, 30.04.2015 23:21

Nachtrag:

Wenn ich die vorstehenden (rhetorischen) Fragen aufgeworfen habe, dann natürlich nicht um die Bedeutung der Hilfe von Karolus zu schmälern (zumal ich diese gerate in der Frage Python außerordentlich wichtig finde, denn darin ist Karolus hier im Forum der absolute Experte), sondern weil ich es immer wieder kurios finde wie wenig Effizienz bei Unternehmen eine Rolle zu spielen scheint wenn es um freie Software geht, denn im Gegensatz zu MS Office wo es ganz selbstverständlich ist sich von IT-Dienstleistern helfen zu lassen scheint es bei freien Office-Programmen niemanden zu stören massenhaft Zeit aufzuwenden um sich Lösungen zusammenzusuchen die man für kleines Geld hätte erledigen lassen können.


Gruß
Stephan

Re: Makro zum Abspeichern einer .ods als .xml

von Stephan » Do, 30.04.2015 23:03

Was würde ich manchmal nur ohne Foren und Leute wie euch machen.
Das was die meisten kommerziellen Softwareanwender tun? IT-Dienstleister beauftragen solche Dinge zu lösen?


Gruß
Stephan

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Do, 30.04.2015 22:08

Hallo,

vielen vielen Dank! Das ist ja echt klasse! Es funktioniert.

Was würde ich manchmal nur ohne Foren und Leute wie euch machen. :-)

LG
Robert

Re: Makro zum Abspeichern einer .ods als .xml

von Karolus » Do, 30.04.2015 21:44

Hallo

pastebin

Code: Alles auswählen

# -*- coding: utf-8 -*-

import uno
from os import path
import sys
if sys.version_info.major < 3:
    import io
    open = io.open

HEADER=(u'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n'
         '<Computerliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n\t')

FOOTER = u'\n</Computerliste>'
node = u'\t<Computer>\n{}\n\t</Computer>'.format
inode = u'\t\t<{0}>{1}</{0}>'.format


def export_to_xml(event):    
    doc = event.Source    
    filepath, _ = path.splitext(uno.fileUrlToSystemPath(doc.URL))
    xmlpath = filepath + '.xml'   
    exportsheet = doc.Sheets.getByIndex(0)
    cursor = exportsheet.createCursor()
    cursor.gotoStartOfUsedArea(False)
    cursor.gotoEndOfUsedArea(True)
    data = cursor.DataArray
    tags, data = data[0], data[1:]
    
    with open(xmlpath, 'w', encoding='utf8') as xmlfile:
        xmlfile.write( HEADER )
        for row in data:
            xmlfile.write( node('\n'.join(inode(tag, entry) 
                            for tag, entry in zip(tags, row)
                            if entry)))
        xmlfile.write( FOOTER )
Siehe angehängtes Dokument, die Funktion ``export_to_xml(...)`` ist dem Dokument-Ereignis:
→Extras→Anpassen→Ereignisse→→ `Dokument sichern` zugeordnet

dh. bei jedem Speichern wird eine <dateiname>.xml im gleichen Verzeichnis geschrieben.
test-Userdata.ods
(14.74 KiB) 163-mal heruntergeladen

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Do, 30.04.2015 15:17

Karolus hat geschrieben: Eine Frage habe ich noch: in deinem Beispiel ist der Root-tag <Computerliste ...> ....</Computerliste> -- ist der Tag-Name fix vorgegeben oder auch variabel?
Es gibt nur diese eine Liste. Von daher ist der Tag fix. Das einzig variable an der Liste ist, dass neue Spalten Zeilen hinzukommen. Also ein Computer 7, 8, 9 usw.. Ich hoffe das beantwortet deine Frage.

Re: Makro zum Abspeichern einer .ods als .xml

von Karolus » Do, 30.04.2015 15:13

teufelschultz hat geschrieben:Okay, AOO ist überall vollständig installiert.
Und das Standard-Speicher-Format wurde nicht verändert, steht also jeweils auf .ods usw..

Könntest du denn mit den gelieferten Angaben so ein Script erstellen? Das wäre echt klasse. :D
Eine Frage habe ich noch: in deinem Beispiel ist der Root-tag <Computerliste ...> ....</Computerliste> -- ist der Tag-Name fix vorgegeben oder auch variabel?

Falls variabel - bräuchte ich noch irgendwie die Information welcher Name ? die ist aus der Ausgangstabelle nicht auslesbar, auch im VBA-code finde ich nur eine Zuordnung:

Code: Alles auswählen

objMapToExport = ActiveWorkbook.XmlMaps("Computerliste_Zuordnung")

was aber auch nur nahelegt das eventuell verschiedene Maps existieren, ohne das ich an die Informationen selbst rankomme

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Do, 30.04.2015 12:00

Okay, AOO ist überall vollständig installiert.
Und das Standard-Speicher-Format wurde nicht verändert, steht also jeweils auf .ods usw..

Könntest du denn mit den gelieferten Angaben so ein Script erstellen? Das wäre echt klasse. :D

Re: Makro zum Abspeichern einer .ods als .xml

von Karolus » Do, 30.04.2015 11:34

Hallo
Ist zum Verwenden des pythonscripts eine separate Software auf den Arbeitsplätzen notwendig?
Das wäre nämlich etwas schwierig, da wir eine sehr große Anzahl an Arbeitsplätzen betreuen.
Es braucht lediglich eine Vollinstallation von AOO oder LibreOffice auf allen Arbeitsplätzen, und das Script selbst muss natürlich auch überall `installiert` werden oder in den "Arbeitsdokumenten" enthalten sein.

Was gar nicht geht, ist ein Standard-speicher-format .xls oder .xlsm ( in dem Fall bleibt besser ganz bei Excel )

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Do, 30.04.2015 09:28

Im Anhang habe ich nun eine Beispieltabelle hinzugefügt.
Zum einem ist die derzeit verwendete Excel-Tabelle enthalten und das daraus resultierende XML-Dokument. (Die XML musste ich zippen, xml konnte ich nicht hochladen)

Ist zum Verwenden des pythonscripts eine separate Software auf den Arbeitsplätzen notwendig?
Das wäre nämlich etwas schwierig, da wir eine sehr große Anzahl an Arbeitsplätzen betreuen.
Dateianhänge
Discovery-Userdata.zip
(653 Bytes) 135-mal heruntergeladen
Discovery-Userdata.xlsm
(24.27 KiB) 113-mal heruntergeladen

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Mi, 29.04.2015 18:42

Ich habe die konkrete Tabelle jetzt leider nicht griffbereit.
Ich kann dir das morgen früh hier posten.
Wäre echt cool wenn das funktioniert. Schon mal vielen Dank für die Antworten bisher!

Re: Makro zum Abspeichern einer .ods als .xml

von Karolus » Mi, 29.04.2015 18:37

Hallo

Natürlich geht das - ich sehe da keine Probleme.

Wie sieht der Kopf und der `root-node` der xml aus ?

Re: Makro zum Abspeichern einer .ods als .xml

von teufelschultz » Mi, 29.04.2015 18:18

Hallo,

davon verstehe ich ja noch weniger ;-)

Vielleicht zur Erklärung der geplante Ablauf:

Die Mitarbeiter sollen in die Open Office Tabelle die entsprechende Einträge/Werte erfassen.
Beim Abspeichern dieser Tabelle soll das entsprechende xml-file entstehen.
Das XML-File wird zur weiteren Verwendung in einem anderen Produkt benötigt, deswegen auch diese vorgeschriebene Struktur.

Um jedoch DropDown Felder, bedingte Formatierung und co. verwenden zu können, soll die Erfassung über die OpenOffice Tabelle erfolgen.

Ich vermute bei diesem geplanten Ablauf hilft ein python Script nicht oder?

Re: Makro zum Abspeichern einer .ods als .xml

von Karolus » Mi, 29.04.2015 18:07

Hallo

Für diese einfache flache Struktur muss man nicht unbedingt ein xml-Schema bemühen, das geht auch "quasi per Hand" mit 20 Zeilen Pythoncode.

Nach oben