Seite 1 von 3

Makro: Datei unter mehreren Formaten abspeichern

Verfasst: So 11. Jan 2015, 19:53
von Mau
Liebe ExpertInnen,

ich muss eine ODT-Datei ziemlich oft zusätzlich in drei verschiedenen anderen Formaten abspeichern:
doc; txt; pdf
  • Die doc-Datei brauchen Kunden zum Weiterverarbeiten.
  • Die txt-Datei braucht mein Datei-Manager FreeCommander für Volltextsuche.
  • Die pdf-Datei brauchen Kunden zur Kontrolle des Layouts, falls ihnen beim Weiterverarbeiten mal etwas durcheinandergerät.
Ich habe mal zwei Test-Makros bei einer Muster-Datei laufen lassen (s. Dateianhang).

Der Makro bringt aber nur Nutzen, wenn er den jeweiligen Dateinamen mit Pfad ausliest und an eine Variable übergibt, durch die der Beispielfpfad und -name ersetzt wird.
Und außerdem gibt es möglicherweise noch ein Problem: So wie die beiden Makros jetzt aufeinanderfolgen, würde der zweite Durchlauf wahrscheinlich nicht die odt-Datei, sondern die vorher erzeugte txt-Datei ins doc-Format verwandeln. D.h. die odt-Datei müsste vorher wieder geöffnet worden sein.

Ich verstehe leider von VBA zu wenig, um das selbst zurechtzubasteln.

Gruß,
Mau

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Mo 12. Jan 2015, 11:03
von lessger
Hallo Mau,

ich habe im Moment keine Zeit, Dir das Makro zu schreiben, aber vielleicht helfen Dir die folgenden Tipps (oder es meldet sich sonst noch jemand):
  • Das Makro ist einfacher, wenn das Dokument bereits im .odt-Format gespeichert ist.
  • Dann kannst Du mit ThisComponent.GetURL() den vollständigen Dateipfad bekommen
  • Dann kannst Du mit GetFileNameWithoutExtension(...) den Dateinamen extrahieren und durch Hinzufügen eines anderen Typs den neuen Dateinamen zusammen bauen. (siehe http://www.dannenhoefer.de/faqstarbasic ... tools.html)
  • Dann rufst Du Deine Makros für Speichern als txt and doc auf, natürlich unter Nutzung der neuen Dateinamen
Umständlicher wird es, wenn Du auch den Fall abdecken willst, daß das Dokument noch nie gespecihert war (also "Unbenannt-x" heißt).

Ich hoffe, das hilft schon mal.

Grüße
Gerhard

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Mo 12. Jan 2015, 13:38
von Mau
Lieber Gerhard,
vielen Dank erst einmal für die Hinweise.
lessger hat geschrieben:
  • Das Makro ist einfacher, wenn das Dokument bereits im .odt-Format gespeichert ist.
Das ist es. Ich möchte den Makro aus dem Dokument heraus starten können, das zusätzlich in den drei anderen Formaten abgespeichert werden soll.
lessger hat geschrieben:
  • Dann kannst Du mit ThisComponent.GetURL() den vollständigen Dateipfad bekommen.
Der automatisch erzeugte Makro (s. meinen Dateianhang im ersten Beitrag) hat u.a. folgende Zeile:
document = ThisComponent.CurrentController.Frame
Ich dachte, damit würde der komplette Dateipfad bereits übergeben. Wenn das nicht der Fall ist, wozu dient die Zeile dann?
Und heißt die richtige Übergabe des Dateipfades dann vielleicht so:
document = ThisComponent.GetURL() ?
Oder muss ich dafür erst eine neue Variable deklarieren und verwenden?
lessger hat geschrieben:
Nach dem, was mein Makro schreibt, nehme ich an, dass der neue Dateiname sich aus drei Komponenten zusammensetzt:
"file:///" + GetFileNameWithoutExtension + ".txt") bzw. ".doc" bzw. ".pdf"
Richtig?
(Allerdings hat der Makro für die Abspeicherung in pdf einen schier endlosen Rattenschwanz von Attributen erzeugt, die wohl alle mit angegeben werden müssen. Dann sollte ich davon wahrscheinlich die Finger lassen.)
Wie baut man die drei Komponenten - vorausgesetzt, sie sind so richtig - zu einem einzigen String zusammen?
Den Befehl dazu fand ich unter dem von dir angegebenen Link nicht.
lessger hat geschrieben:
  • Dann rufst Du Deine Makros für Speichern als txt and doc auf, natürlich unter Nutzung der neuen Dateinamen
[/list][/list]
Also so:?
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///" + document + ".txt"
args1(1).Name = "FilterName"
args1(1).Value = "Text"

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

Gruß,
Mau

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Mo 12. Jan 2015, 20:25
von mikele
Hallo,
anbei eine Variante.
Das Makro exportiert die Datei in den gleichen Ordner wie die Originaldatei einmal als pdf und einmal als txt. Die Datei selbst bleibt odt.
Beim pdf-export habe ich es bei den Standardexportoptionen belassen (ansonsten musst du den "Rattenschwanz" mit als Parameter übergeben).

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Mo 12. Jan 2015, 22:14
von mikele
Hallo,

ich vergaß ja noch den Word-Export.

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Di 13. Jan 2015, 17:46
von Mau
Liebe(r) Mikele,

hier nochmal mit Anhang:

ich habe mir den Makro abgeschrieben und versuche gerade zu verstehen, was in den einzelnen Zeilen passiert.

Zwei Fragen dazu:
  1. Wo bekommt man im Internet eine genaue Erklärung der Aufgabe und Syntax der verschiedenen von dir verwendeten Befehle/Funktionen? In einem Beitrag zu diesem Thema gab lessger den Link http://www.dannenhoefer.de/faqstarbasic ... tools.html an; der hat aber den Mangel, dass er keine Suchfunktion hat, und die Untertitel geben nicht genügend deutliche Hinweise, was man wo findet. Außerdem werden Syntax und Argumente nicht genau genug erläutert. Worauf stützt du dich bei der Programmierung?
  2. Die automatisch erzeugten Makros fangen alle anders an als deine (im Anhang findest du die Programmzeilen meines [automatisch erzeugten] Ausgangsmakros). Ich möchte darauf aufbauen und entsprechend deiner Programmierung umarbeiten. (Es sei denn, du kannst mir erklären, warum die nicht braucht.)
    Es geht dabei um die Zeilen in meinem Ausgangsmakro unterhalb der ersten beiden rem-Zeilen. Ab der dritten rem-Zeile läuft ja mit entsprechenden Abänderungen das gleiche ab wie im Ausgangsmakro.
Ansonsten ganz herzlichen Dank!

Gruß,
Mau

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Di 13. Jan 2015, 19:55
von lessger
Hallo Mau,
Wo bekommt man im Internet eine genaue Erklärung der Aufgabe und Syntax der verschiedenen von dir verwendeten Befehle/Funktionen? In einem Beitrag zu diesem Thema gab lessger den Link http://www.dannenhoefer.de/faqstarbasic ... tools.html an; der hat aber den Mangel, dass er keine Suchfunktion hat, und die Untertitel geben nicht genügend deutliche Hinweise, was man wo findet. Außerdem werden Syntax und Argumente nicht genau genug erläutert.
ich fürchte, "das" Lehrbuch zu Starbasic und LO Programmierung wirst Du nicht finden. Ich selbst fand den Dannenhöfer als Starthilfe schon sehr nützlich, und suchen kannst Du per Google auch bei ihm.

Grundsätzlich ist es halt eine Frage, wieviel Du schon kannst. Brauchst Du erst eine Einführung in das spezielle Basic? Eine knappe Einführung in Starbasic gibt es z.B. hier: https://wiki.openoffice.org/wiki/DE/Mak ... c_Tutorial oder (schon etwas bejahrt, aber immer noch gut als Einführung) http://toolittle.org/downloads/StarOffi ... torial.pdf.

Als nächsten Schritt mußt Du das LO API lernen. Dazu solltest Du zumindest ein Grundverständnis von objekt-orientierter Programmierung haben. Du solltest Dir auch klar darüber sein, daß das API seeeeehr umfangreich und mächtig ist und es da einiges zu Lernen gibt. Nichts für mal schnell und nebenbei. Am besten geht es wirklich mit Beispielen und Ausprobieren. Auch der Makrorekorder, den Du für Deine Makros benutzt hast, ist keine dumme Idee. Wie aller generierter Code, ist er halt oft ein bißchen umständlich, aber immerhin findet man raus wie etwas geht - oft schneller als per API Doku.
Die automatisch erzeugten Makros fangen alle anders an als deine (im Anhang findest du die Programmzeilen meines [automatisch erzeugten] Ausgangsmakros). Ich möchte darauf aufbauen und entsprechend deiner Programmierung umarbeiten. (Es sei denn, du kannst mir erklären, warum die nicht braucht.)
Es geht dabei um die Zeilen in meinem Ausgangsmakro unterhalb der ersten beiden rem-Zeilen. Ab der dritten rem-Zeile läuft ja mit entsprechenden Abänderungen das gleiche ab wie im Ausgangsmakro.
Ja, da sind wir schon mittendrin in den Kozepten des API. Der Makrorekorder-Code nutzt einen Dispatcher, dem ein Befehl mitgegeben wird, und der Dispatcher ruft dann wieder eine Routine auf, um den Befehl auszuführen. Die Zeile

Code: Alles auswählen

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
erzeugt diesen Dispatcher, der etwas weiter unten dann benutzt wird.

Mikele nutzt das LO API direkt zum Speichern eines Dokuments, ohne den Umweg über den Dispatcher. Er braucht nur einen Verweis auf das aktive Dokument, und das macht er über

Code: Alles auswählen

oDoc = ThisComponent
Mikele macht genau das Gleiche wie Dein Makro, nur einfacher. Er hätte genauso gut allerdings auch Deine aufgezeichneten Makros abändern können.

Grüße
Gerhard

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Mi 14. Jan 2015, 22:09
von Mau
Lieber Gerhard,
danke für die ausführlichen Hinweise.
lessger hat geschrieben:
Mau hat geschrieben:Wo bekommt man im Internet eine genaue Erklärung der Aufgabe und Syntax der verschiedenen von dir verwendeten Befehle/Funktionen? In einem Beitrag zu diesem Thema gab lessger den Link http://www.dannenhoefer.de/faqstarbasic ... tools.html an; der hat aber den Mangel, dass er keine Suchfunktion hat, und die Untertitel geben nicht genügend deutliche Hinweise, was man wo findet. Außerdem werden Syntax und Argumente nicht genau genug erläutert.
ich fürchte, "das" Lehrbuch zu Starbasic und LO Programmierung wirst Du nicht finden. Ich selbst fand den Dannenhöfer als Starthilfe schon sehr nützlich, und suchen kannst Du per Google auch bei ihm.
Na, dann werd ich da mal ein bisschen gründlicher herumstöbern.
lessger hat geschrieben:Grundsätzlich ist es halt eine Frage, wieviel Du schon kannst. Brauchst Du erst eine Einführung in das spezielle Basic? Eine knappe Einführung in Starbasic gibt es z.B. hier: https://wiki.openoffice.org/wiki/DE/Mak ... c_Tutorial oder (schon etwas bejahrt, aber immer noch gut als Einführung) http://toolittle.org/downloads/StarOffi ... torial.pdf.
Nein und ja. Als man die WordPerfect-Makros noch unter DOS programmieren konnte, habe ich sehr umfangreiche Makros geschrieben, von denen zwei sogar in Computer-Zeitschriften abgedruckt wurden und einer in abgewandelter Form später sogar in den Programmcode von WP integriert wurde. Aber das heutige BASIC ist in der Tat derart mächtig und methodisch so anders, dass ich schon "abgeschnallt" habe, als WP seine Makrosprache auf VBA-Basic umstellte, und zwar auf genau die objektorientierte Programmierung, von der du auch sprichst.
lessger hat geschrieben:Als nächsten Schritt mußt Du das LO API lernen. Dazu solltest Du zumindest ein Grundverständnis von objekt-orientierter Programmierung haben. Du solltest Dir auch klar darüber sein, daß das API seeeeehr umfangreich und mächtig ist und es da einiges zu Lernen gibt. Nichts für mal schnell und nebenbei.
Ist mir klar. Und die Zeit habe ich leider nicht.
lessger hat geschrieben:
Das Ding sieht gut aus.
lessger hat geschrieben:[*]Eine systematische Dokumentation des API findest Du hier http://api.libreoffice.org/ oder http://www.openoffice.org/api/. Aber das wird Dir erst helfen, wenn Du schon recht gut weißt was Du tust.
[*]Ein Tool, mit dem Du Dir die Objekte zur Laufzeit ansehen kannst, ist ebenfalls unersetzlich. Dazu gibt es die Extension MRI. [/list]
Nee, das ist ein Universum für sich.
lessger hat geschrieben:Am besten geht es wirklich mit Beispielen und Ausprobieren. Auch der Makrorekorder, den Du für Deine Makros benutzt hast, ist keine dumme Idee. Wie aller generierter Code, ist er halt oft ein bißchen umständlich, aber immerhin findet man raus wie etwas geht - oft schneller als per API Doku.
Richtig, genau so möchte ich auch vorgehen. So bin ich auch schon vorgegangen beim Belegen verschiedener Tasten mit diversen Makros, die verschiedene Sonderzeichen (Türkisch) erzeugen. Da musste ich den Code so umarbeiten, dass der Makro nicht mit dem Zeichen zusammen auch das Schriftformat bestimmte; das habe ich auch hingekriegt. :D
lessger hat geschrieben:Mikele nutzt das LO API direkt zum Speichern eines Dokuments, ohne den Umweg über den Dispatcher. Er braucht nur einen Verweis auf das aktive Dokument, und das macht er über

Code: Alles auswählen

oDoc = ThisComponent
Mikele macht genau das Gleiche wie Dein Makro, nur einfacher. Er hätte genauso gut allerdings auch Deine aufgezeichneten Makros abändern können.
Ja, das wäre zur Vergleichbarkeit mit den bestehenden Makros besser gewesen. (Klingt etwas undankbar, ist aber nicht so gemeint.)

Gruß,
Mau

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: Do 15. Jan 2015, 18:17
von lessger
Hallo Mau,

Deine Punkte kann ich gut nachvollziehen. Nur das MRI Tool will ich Dir nochmal warm ans Herz legen. Sobald Du mit dem LO API arbeitest, ist das einfach unersetzlich. Viele Methoden und Eigenschaften des API sind weitgehend selbsterklärend, so ist MRI auch Dokumentationsersatz. Und für Debugging ist es sowieso wundervoll.

Grüße
Gerhard

Re: Makro: Datei unter mehreren Formaten abspeichern

Verfasst: So 18. Jan 2015, 21:34
von Mau
Lieber Gerhard,
lessger hat geschrieben:Nur das MRI-Tool will ich Dir nochmal warm ans Herz legen. Sobald Du mit dem LO API arbeitest, ist das einfach unersetzlich. Viele Methoden und Eigenschaften des API sind weitgehend selbsterklärend, so ist MRI auch Dokumentationsersatz. Und für Debugging ist es sowieso wundervoll.
Ich habe mir die Dateien heruntergeladen, habe aber im Moment keine Zeit, mich damit zu befassen.

Ich habe jetzt mal mikeles Skript in meinen Makro eingearbeitet (s. Anhang). Ich möchte ihn aber erst testen, wenn du und mikele ihn sich noch einmal angesehen habt. Vor allem habe ich das Gefühl, dass bei mir entweder die Zeile 29 überflüssig ist oder, weil bei mir der Dispatcher eingesetzt ist, die Zeilen 25 und 28 umgearbeitet werden müssen.

Gruß,
Mau