Seite 1 von 2

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

Verfasst: Mi, 29.04.2015 12:38
von teufelschultz
Hallo,

ich möchte folgendes in einem OpenOffice Calc Dokument erreichen:

Die Tabelle "Testtabelle.ods" ist in einem Pfad abgespeichert.
Sofern Änderungen an dieser Tabelle vorgenommen und gespeichert werden, soll eine gleichnamige .xml (Microsoft Excel 2003 XML) angelegt werden.
Das dachte ich auch erreicht zu haben, indem ich den Prozess des Abspeichers mittels "Makro aufzeichen" festgehalten und dieses Makro über Extras > Anpassen > Ereignisse dem Ereigniss "Dokument sichern" zugeordnet habe. Das Zuweisen des Makros zu dem Ereignis wird aber trotz Speichern des Dokuments nicht in dem Dokument gespeichert. Nach erneuten Öffnen des Dokuments ist diese Zuweisung wieder verloren.
Jemand eine Idee dafür?
Hier das Makro:

Code: Alles auswählen

REM  *****  BASIC  *****


sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///D:/_Temp/Testtabelle.xml"
args1(1).Name = "FilterName"
args1(1).Value = "MS Excel 2003 XML"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())


end sub
Allerdings wird daraufhin die Testtabelle.xml geöffnet. Wenn der Nutzer jetzt weitere Änderungen vornimmt, landen diese ausschließlich in dem xml-Dokument und nicht dem ods-Dokument.

Deswegen hatte ich die Idee, das dass Makro OpenOffice anschließend schließt.
Dazu habe ich im Internet recherchiert und einige Sachen ausprobiert. Leider alle ohne Erfolg.

Die zweite und bessere Alternative wäre, das beim Speichern das xml-File zwar angelegt, aber nicht geöffnet wird.

Hat einer ne Idee wie ich eine der beiden Varianten erreichen können?

Des weiteren gefällt mir an dem o. g. Makro nicht, dass der Pfad fest definiert ist. Kann man irgendwie auch als Pfad den aktuellen Pfad der .ods verwenden?

Bezüglich der Makro-Programmierung habe ich leider nur sehr geringe Kenntnisse. Ich hoffe ihr könnt mir helfen. Vielen Dank.

Gruß

Robert

Re: Makro zum Abspeichern einer .ods als .xml

Verfasst: Mi, 29.04.2015 16:30
von mikeleb
Hallo,

mit folgendem Makro wird eine zur ods-Datei gleichnamige xml-Datei im gleichen Ordner gespeichert, genauer gesagt exportiert. Die ods-Datei bleibt also aktiv udn steht für weitere Bearbeitungen zur Verfügung.

Code: Alles auswählen

Sub Main
	oDoc=Thiscomponent
	sUrl=oDoc.geturl()
	for i=1 to len(sUrl)
		if mid(sUrl,i,1)="/" then slash=i
		if mid(sUrl,i,1)="." then punkt=i
	next
	sPfad=left(sUrl,slash)
	sName=mid(sUrl,slash+1,punkt-slash-1)
	Dim arg(1) as New com.sun.star.beans.PropertyValue
	arg(0).Name = "URL"
	arg(0).Value = sPfad & sName & ".xml"
	arg(1).Name = "FilterName"
	arg(1).Value = "MS Excel 2003 XML"
	oDoc.storetoUrl(arg(0).Value,arg())
End Sub

Re: Makro zum Abspeichern einer .ods als .xml

Verfasst: Mi, 29.04.2015 17:38
von teufelschultz
Vielen Dank für die schnelle Antwort. :-)

Leider musste ich feststellen, das dass Dateiformat Excel 2003 XML mir nichts bringt.
Das XML-Dokument muss folgende Struktur haben:

Code: Alles auswählen

XML:
<Buch>
<ID> 1 </ID>
<Name>Abenteuer X</Name>
<Autor> Bla </Autor>
<Preis>19,95</Preis>
<Umsatzsteuer> 19 </Umsatzsteuer>
<Gewicht> 0,5 </Gewicht>

<ID> 2 </ID>
<Name>Drama Y</Name>
<Autor> Blubb</Autor>
<Preis>19,95</Preis>
<Umsatzsteuer> 19 </Umsatzsteuer>
<Gewicht> 0,5 </Gewicht>

<ID> 3 </ID>
<Name>Lyrik Z</Name>
<Autor> Bla</Autor>
<Preis>19,95</Preis>
<Umsatzsteuer> 19 </Umsatzsteuer>
<Gewicht> 0,5 </Gewicht>

</Buch>
/code]
In OpenOffice dann so:
Zeile 1: ID, Name, Autor, Preis, Umsatzsteuer, Gewicht
Zeile 2: 1; Abenteuer X; Bla; 19,95; 19; 0,5
Zeile 3: 2; Drama Y; Blubb; 19,95; 19; 0,5

Im Prinzip will ich das gleiche erreichen wie in folgenden Thread für Excel:
http://forum.chip.de/office/exceltabelle-xml-erstellen-1522322.html

In Excel muss man dafür ein XML Schema importieren und kann dieses dann verändern und abspeichern/exportieren.
Geht das auch in OpenOffice?

LG
Robert

Re: Makro zum Abspeichern einer .ods als .xml

Verfasst: Mi, 29.04.2015 18:07
von Karolus
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.

Re: Makro zum Abspeichern einer .ods als .xml

Verfasst: Mi, 29.04.2015 18:18
von teufelschultz
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

Verfasst: Mi, 29.04.2015 18:37
von Karolus
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

Verfasst: Mi, 29.04.2015 18:42
von teufelschultz
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

Verfasst: Do, 30.04.2015 09:28
von teufelschultz
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.

Re: Makro zum Abspeichern einer .ods als .xml

Verfasst: Do, 30.04.2015 11:34
von Karolus
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

Verfasst: Do, 30.04.2015 12:00
von teufelschultz
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

Verfasst: Do, 30.04.2015 15:13
von Karolus
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

Verfasst: Do, 30.04.2015 15:17
von teufelschultz
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

Verfasst: Do, 30.04.2015 21:44
von Karolus
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

Verfasst: Do, 30.04.2015 22:08
von teufelschultz
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

Verfasst: Do, 30.04.2015 23:03
von Stephan
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