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

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

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

Beitrag 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
Zuletzt geändert von teufelschultz am Di, 05.05.2015 10:12, insgesamt 1-mal geändert.
mikeleb
*******
Beiträge: 1408
Registriert: Fr, 09.12.2011 16:50

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
Gruß,
mikeleb
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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?
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag von Karolus »

Hallo

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

Wie sieht der Kopf und der `root-node` der xml aus ?
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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!
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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.
Dateianhänge
Discovery-Userdata.zip
(653 Bytes) 135-mal heruntergeladen
Discovery-Userdata.xlsm
(24.27 KiB) 111-mal heruntergeladen
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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 )
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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.
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
teufelschultz
**
Beiträge: 21
Registriert: Do, 13.11.2014 21:48

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro zum Abspeichern einer .ods als .xml

Beitrag 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
Antworten