Seite 1 von 2

Macro von der Kommandozeile ausführen und Resultat speichern

Verfasst: So, 06.02.2011 10:10
von rivella
Hi,

ich habe ein Makro erstellt, das eine CSV-Datei in eine Calc-Tabelle importiert und das Resultat speichert:

Code: Alles auswählen

Sub Ascii_2_CalcSheets
   oDoc = thisComponent
   oPlan = oDoc.getSheets().getByIndex(0)
   sURL = "D:\temp\temp.csv" ' unter Linux: "/tmp/test/temp.csv"
   sURL = ConvertToURL ( sURL )
   sOrigem = ""
   sFiltro = "Text - txt - csv (StarCalc)"
   sOpc = "9,34,76,1,"
   nModo = com.sun.star.sheet.SheetLinkMode.NORMAL
   oPlan.link(sURL, sOrigem, sFiltro, sOpc, nModo)
   oPlan.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
   url = ConvertToUrl("D:\temp\1.odt") ' unter Linux: "/tmp/test/1.ots"
   oDoc.StoreAsUrl(url,Array())  
End Sub 
Wenn ich die ots-Datei (z.B. test.ots) unter Windows öffne und das Makro ausführe, funktioniert alles wie erwartet.

Jetzt habe ich OO auf meinem Linux-Server installiert, das Macro aus dem Windows-Verzeichnis kopiert nach

Code: Alles auswählen

/usr/lib/openoffice/basis-link/share/basic/Gimmicks/CSVinsert.xba
und versucht, folgendes auszuführen

Code: Alles auswählen

/usr/lib/openoffice/program/soffice -headless -nologo -n "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets" /tmp/test/test.ots
Es passiert aber gar nichts, d.h. es wird keine Datei "/tmp/test/1.ods" erzeugt.

Könnte mir bitte jemand einen Tipp geben, wie ich das Problem lösen kann?

Vielen Dank im voraus

rivella

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 11:51
von Stephan
Könnte mir bitte jemand einen Tipp geben, wie ich das Problem lösen kann?
erstens eine message-box in Makro schreiben um festzustellen ob es überhaupt gestartet wird, z.B.:

Code: Alles auswählen

Msgbox "OK, gestartet"
zweitens gibt der Ausdruck:

Code: Alles auswählen

[...] "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets" /tmp/test/test.ots
für mich keinen Sinn, da es weder eine korrekte Parameterübergabe an das Makro ist, die wäre z.B.:

Code: Alles auswählen

[...] macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets("/tmp/test/test.ots")
noch das Makro überhaupt in der Lage ist einen Parameter entgegenzunehmen, weil in:

Code: Alles auswählen

Sub Ascii_2_CalcSheets
doch offensichlich garkein Parameter genannt ist, im Sinne

Code: Alles auswählen

Sub Ascii_2_CalcSheets(meinParameter As String)

Gruß
Stephan

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 12:34
von rivella
Hallo Stephan,

vielen Dank erstmal für Deine Antwort.

Eine Messagebox kann ich doch bei einem Kommandozeilenaufruf gar nicht ausgeben?

Mit der Parameterübergane hast Du natürlich recht. Das kommt aber erst dann in das Makro, wenn es auch funktioniert.
Ich habe ja jetzt alle Parameter (also die csv-Datei und den Ausgabedateinamen) im Makro selber stehen und den ots-Dateinamen im Kommandozeilenaufruf.

Viele Grüße

rivella

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 13:42
von komma4
Ein paar Anmerkungen:

* kopiere den Quelltext, keine XBA
* zum Testen mit MSGBOX den Parameter -headless weglassen
* kommst Du mit den Dateiendungen nicht etwas durcheinander?

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 13:47
von Stephan
Eine Messagebox kann ich doch bei einem Kommandozeilenaufruf gar nicht ausgeben?
deswegen schrieb ich:
"erstens eine message-box in Makro schreiben um festzustellen ob es überhaupt gestartet wird"

und das sollte doch wohl auch ohne das fehlende "s" (es muß "ins" heißen statt "in") zu verstehen sein und heißt:

schreibe irgendwo in das Makro (möglichst am Anfang) eine Zeile der Form:

Code: Alles auswählen

Msgbox "OK, gestartet"
um zu überprüfen ob das Makro überhaupt startet.
Mit der Parameterübergane hast Du natürlich recht. Das kommt aber erst dann in das Makro, wenn es auch funktioniert.
und wann soll dieser Zustand eintreten?
Derzeitig verwendest Du jedenfalls einen falschen Aufruf und ich verstehe nicht wie dieser funktionieren soll:

Code: Alles auswählen

[...] "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets" /tmp/test/test.ots
Wenn nun meine Vermutung das es sich bei diesem Ausdruck um den Versuch handelt einen Parameter ans Makro zu übergeben falsch ist, ist doch die Zeile noch längst nicht richtig denn sie ergibt keinen Sinn weil man meiner Ansicht nach ENTWEDER ein Makro starten kann ODER eine Vorlagendatei öffnen, aber doch nicht beides auf diese Art und Weise gleichzeitig - entscheide Dich also für Eines.


Gruß
Stephan

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 14:57
von rivella
komma4 hat geschrieben:Ein paar Anmerkungen:

* kopiere den Quelltext, keine XBA
* zum Testen mit MSGBOX den Parameter -headless weglassen
* kommst Du mit den Dateiendungen nicht etwas durcheinander?
1. Ich hab doch den Quelltext kopiert!?
2. "headless" kann ich nicht weglassen, weil OO bei mir doch auf dem Webserver läuft.
3. Nein :)
Stephan hat geschrieben:
Mit der Parameterübergane hast Du natürlich recht. Das kommt aber erst dann in das Makro, wenn es auch funktioniert.
und wann soll dieser Zustand eintreten?
Derzeitig verwendest Du jedenfalls einen falschen Aufruf und ich verstehe nicht wie dieser funktionieren soll:

Code: Alles auswählen

[...] "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets" /tmp/test/test.ots
Wenn nun meine Vermutung das es sich bei diesem Ausdruck um den Versuch handelt einen Parameter ans Makro zu übergeben falsch ist, ist doch die Zeile noch längst nicht richtig denn sie ergibt keinen Sinn weil man meiner Ansicht nach ENTWEDER ein Makro starten kann ODER eine Vorlagendatei öffnen, aber doch nicht beides auf diese Art und Weise gleichzeitig - entscheide Dich also für Eines.
Ach so, ich bin davon ausgegangen, dass ich eine Tabellendatei öffnen und gleichzeitig ein Makro darauf loslassen kann.

Ich müsste jetzt also das Makro so umschreiben, dass ich es folgendermaßen aufrufe

Code: Alles auswählen

[...] "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets("/tmp/test/test.ots")
Ich probiere das mal aus und melde mich dann wieder.

Vielen Dank
rivella

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 15:30
von rivella
Ok, ich habe das Makro jetzt wie folgt geändert:

Code: Alles auswählen

Sub Ascii_2_CalcSheets (tabelle As String)
   ' tabelle = "/temp/test/test.ots" ' Das diente nur zum testen unter WIndows
   oDoc = StarDesktop.loadComponentFromURL(ConvertToUrl(tabelle), "_blank", 0, Array())
   csvfile = "/temp/test/temp.csv"
   ' oDoc = thisComponent
   oPlan = oDoc.getSheets().getByIndex(0)
   sURL = csvfile
   sURL = ConvertToURL ( sURL )
   sOrigem = ""
   sFiltro = "Text - txt - csv (StarCalc)"
   'sOpc = "9,34,0,1,1/1/2/1/3/2"
   sOpc = "9,34,76,1,"
   nModo = com.sun.star.sheet.SheetLinkMode.NORMAL
   oPlan.link(sURL, sOrigem, sFiltro, sOpc, nModo)
   oPlan.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
   url = ConvertToUrl(csvfile & ".ots")
   oDoc.StoreAsUrl(url,Array())  
End Sub 
Der Aufruf erfolgte durch

Code: Alles auswählen

/usr/lib/openoffice/program/soffice -headless -nologo -nofirststartwizard -norestore -n "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets('/temp/test/test.ots')"
Unter Windows funktioniert es, wenn ich das Makro aus dem Makroeditor aufrufe, unter Linux von der Kommandozeile aus nicht :(

cu
rivella

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 19:02
von Axel Richter
Hallo rivella,
rivella hat geschrieben:Der Aufruf erfolgte durch

Code: Alles auswählen

/usr/lib/openoffice/program/soffice -headless -nologo -nofirststartwizard -norestore -n "macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets('/temp/test/test.ots')"
1. Lass das -headless -nologo -nofirststartwizard -norestore erst Mal weg, damit Du ggf. Fehler angezeigt bekommst.

2. Es gibt bei Dir eine Makro-Bibliothek "Gimmicks" und darin ein Modul "CSVinsert" mit dem Makro darin? Ruf Mal einfach nur soffice auf und dann dort Extras-Makros-Verwalten... und schau nach, ob Du das dort findest.

3. In Starbasic können Strings nicht durch einfache Anführungsstriche eingeschlossen werden. Der Makro-Aufruf muss also lauten:
"macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets(\"/temp/test/test.ots\")"

4. Wenn es dann ers Mal klappt, wirst Du sehen, dass Dein Command-Aufruf nicht zum Ende kommt. Wie auch? Du startest im Makro Stardesktop ohne es zu beenden und er Nutzer hat aber auch kein Fenster, was er schließen könnte. Füge also am Ende des Makros noch

Code: Alles auswählen

Stardesktop.terminate()
ein.

viele Grüße

Axel

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 19:15
von rivella
Hallo Alex,

vielen Dank für Deine Hilfe.
Axel Richter hat geschrieben:1. Lass das -headless -nologo -nofirststartwizard -norestore erst Mal weg, damit Du ggf. Fehler angezeigt bekommst.
Das kann ich nicht machen, weil OO auf einem Webserver läuft, ohne GUI. Wie bekomme ich eine ensprechende Ausgabe auf Kommandozeilenebene?
Axel Richter hat geschrieben:2. Es gibt bei Dir eine Makro-Bibliothek "Gimmicks" und darin ein Modul "CSVinsert" mit dem Makro darin? Ruf Mal einfach nur soffice auf und dann dort Extras-Makros-Verwalten... und schau nach, ob Du das dort findest.
Ich habe einfach im Verzeichnis /usr/lib/openoffice/basis-link/share/basic/Gimmicks/ die Datei CSVinsert.xba erstellt und dort den Makrocode aus der entsprechenden Windowsdatei eingefügt. Reicht das oder muss ich das Makro in OO noch irgendwo anmelden? Bitte bedenke, dass ich OO _nur_ aud Kommandozeilenebene nutzen kann.
Axel Richter hat geschrieben:3. In Starbasic können Strings nicht durch einfache Anführungsstriche eingeschlossen werden. Der Makro-Aufruf muss also lauten:
"macro:///Gimmicks.CSVinsert.Ascii_2_CalcSheets(\"/temp/test/test.ots\")"
Ok.
Axel Richter hat geschrieben:4. Wenn es dann ers Mal klappt, wirst Du sehen, dass Dein Command-Aufruf nicht zum Ende kommt. Wie auch? Du startest im Makro Stardesktop ohne es zu beenden und er Nutzer hat aber auch kein Fenster, was er schließen könnte. Füge also am Ende des Makros noch

Code: Alles auswählen

Stardesktop.terminate()
ein.
Das habe ich jetzt gemacht. Danke.

Nachdem ich die Punkte 3 und 4 beachtet habe, bekomme ich im Verzeichnis /temp/test/ leider immer noch keine Datei temp.csv.ots erzeugt :(

Bis dann
rivella

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 19:39
von Axel Richter
Hallo rivella,
rivella hat geschrieben:Das kann ich nicht machen, weil OO auf einem Webserver läuft, ohne GUI.
*argh*
Sorry, das hatte ich nicht gelesen. Aber das wird nicht funktionieren. Irgendein X-System wird in jedem Fall benötigt, und wenn es eine VM ist. Siehe Diskussionen http://www.google.de/#q=linux+openoffice+without+X.

Ohne X kannst Du das, meiner Meinung nach, nur lösen, wenn Du eine Software schreibst - oder findest -, welche Dir aus der CSV direkt das OOo-Calc-OTS-Archiv mit den entsprechenden XMLs usw. darin erstellt; im OpenDocument-Dateiformat eben.

viele Grüße

Axel

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 19:54
von rivella
@Alex
Verflucht, so etwas hatte ich schon befürchtet :?

Danke für Deine Hilfe. Falls ich doch noch eine Lösung finde, poste ich sie hier.

Bis dann
rivella

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 20:15
von hol.sten
rivella hat geschrieben:Verflucht, so etwas hatte ich schon befürchtet :?
Wenn du OOo unter *nix ohne GUI betreiben willst, musst du entweder dennoch einen XServer bereit stellen oder dich an einer totally headless Installation versuchen: Und du musst mindestens einmal durch OOo's First Start Wizard oder den Parameter -nofirststartwizard verwenden. Aber den Parameter habe ich in dieser Diskussion zumindest einmal bereits gefunden.

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: So, 06.02.2011 20:21
von Axel Richter
Hallo rivella,
Axel Richter hat geschrieben:wenn Du eine Software schreibst - oder findest -, welche Dir aus der CSV direkt das OOo-Calc-OTS-Archiv mit den entsprechenden XMLs usw. darin erstellt; im OpenDocument-Dateiformat eben.
http://sourceforge.net/apps/mediawiki/c ... =Main_Page
ungetestet.

Bitte Erfahrungen damit dann eventuell hier mitteilen.

viele Grüße

Axel

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: Mo, 07.02.2011 00:05
von Karolus
Hallo
@Axel
rivella will doch von odf nach csv wandeln, nicht umgekehrt !

@rivella
ich hab dazu http://sgdoqoweb.uqar.qc.ca/software/odf2csv/odf2csv gefunden, vielleicht ist da das richtige dabei.

Gruß Karo

Re: Macro von der Kommandozeile ausführen und Resultat speic

Verfasst: Mo, 07.02.2011 06:52
von rivella
Karolus hat geschrieben:rivella will doch von odf nach csv wandeln, nicht umgekehrt !
Eben nicht ;) Ich wollte eine CSV Datei in ein OTS-Template einfügen.