Automatisierung von OpenOffice mit Delphi am Beispiel eines Briefdokumentes, bei dem ein neues Dokument auf Basis eines Templates erstellt wird und die darin enthaltenen Variablen/Platzhalter durch Datenbankinhalte ersetzt werden. Abschließend wird das Dokument gespeichert.
Dieser Beitrag beschreibt die Automatisierung von OpenOffice mit Hilfe von Delphi. Die Automatisierung von Microsoft Office wird oft beschrieben, und Beispiele finden sich auch genug, so dass, zumindest für einfache Aufgaben, es für erfahrene Programmierer keinen größeren Schwierigkeitsgrad bedeutet, MS Office anzusteuern.Bei OpenOffice ist dies etwas schwieriger, zumindest hapert es doch oft an einem einfachen einführenden Beispiel
Um die Sache für andere, die vor dem gleichen Problem stehen mögen, zu erleichtern, wird an einem Beispiel (siehe Anmerkungen in den Prozeduren) gezeigt, wie man
- OpenOffice von Delphi aus startet
- Ein neues Dokument öffnet, welches ein vorbereitetes Template verwendet
- Wie man Variablen in diesem Dokument mit Inhalten, z.B. aus einer Datenbank ersetzt
- Wie man dieses Dokument speichert
- Was zu beachten ist beim Automatisierungsprozess von OpenOffice
Als Template wird eine beliebige Vorlagendatei erstellt (*.ott). Dabei werden Platzhalter in das Dokument eingefügt im Format {Variable}.
Diese Variablen werden zur Laufzeit dann durch die Inhalte der entsprechenden, gleichnamigen, Datenbankfelder ersetzt.
Wichtig: selber arbeite ich nicht mit OpenOffice, bin also kein Experte für dessen API. Es ging mir nur darum eine Teilaufgabe zu lösen, die benötigt wurde, nicht um ein tieferes Verständnis der Materie. Das nachfolgende Beispiel bietet aber Grundlagen, die zur Lösung eigener Aufgaben als Basis verwendet werden können.
Zur Lösung der Aufgabe werden zwei Prozeduren und eine Funktion benötigt:
Procedure ReplaceOOText führt die Ersetzungsfunktionen im Dokument durch
Function ConvertToOOUrl passt einen Dateinamen an die Erfordernisse von OpenOffice an (Unix-Stil)
Procedure SchreibeBrief schließt erstellt ein neues Dokument, ersetzt die Platzhalter, z.B. mit Datenbankinhalten und speichert das Dokument am Ende.
Benötigt wird im Units-Abschnitt die Unit Variants!
procedure ReplaceOOText(document: Variant; SearchTxt, ReplaceTxt: string; Headers: boolean = true); var ErsetzenDescriptor: variant; begin ErsetzenDescriptor := Document.createReplaceDescriptor; ErsetzenDescriptor.SearchString := SearchTxt; ErsetzenDescriptor.ReplaceString := ReplaceTxt; ErsetzenDescriptor.ReplaceAll(ErsetzenDescriptor); end; function ConvertToOOUrl(pfad: string): string; // OpenOffice benötigt Pfadangaben im Unixstil, // daher werden '\' in '/' umgewandelt // Außerdem wird ein file:/// vorangestellt var rueckgabe: string; i: Integer; begin rueckgabe := 'file:///'; while (Pos('\', pfad) > 0) do begin i := Pos('\', pfad); delete(pfad, i, 1); Insert('/', pfad, i); end; rueckgabe := rueckgabe + pfad; result := rueckgabe; end; procedure SchreibeBrief; var WordP, desktop, document, loadParams : Variant; varList:TStringlist; datei:String; begin datei:=''; savedialog := TSaveDialog.Create(nil); try saveDialog.FileName := ''; savedialog.filter := 'odt|*.odt'; savedialog.DefaultExt := 'ODT'; if savedialog.Execute() then datei:=savedialog.FileName; finally savedialog.free; end; IF length(datei)=0 then exit; try WordP := CreateOleObject('com.sun.star.ServiceManager'); // Wichtig ist hier auf Groß- und Kleinschreibung zu achten! except on e: exception do begin showmessage('OpenOffice wurde auf Ihrem System nicht gefunden, oder konnte nicht gestartet werden. Überprüfen Sie Ihre Office Installation'); exit; end; end; try desktop := WordP.CreateInstance('com.sun.star.frame.Desktop'); // Wichtig ist hier auf Groß- und Kleinschreibung zu achten! except on e: exception do begin showmessage('Es ist ein Fehler beim Ausführen des Automatisierungsobjektes aufgetreten. Überprüfen Sie Ihre Office Installation.'); exit; end; end; try Document := Desktop.LoadComponentFromURL(ConvertToOOUrl(IhreVorlageDatei), '_blank', 0, VarArrayCreate([0, -1], varVariant)) // Wichtig: wird als erster Parameter der Name eine OpenOffice Vorlagendatei übergeben, // so wird ein neues Dokument auf Basis dieser Vorlage erstellt except on e: exception do begin showmessage('Es ist ein Fehler beim Ausführen des Automatisierungsobjektes aufgetreten. Überprüfen Sie Ihre Office Installation.'); exit; end; end; varList := TStringlist.Create; try varList.add('Nachname'); varList.add('Vorname'); varList.add('PLZ'); varList.add('Ort'); varList.add('Strasse'); for i := 0 to VarList.Count - 1 do ReplaceOOText(document,'{'+varlist.strings[i]+'}',mytable.FieldByName(varlist.Strings[i]).AsString,false); document.storeAsURL(ConvertToOOUrl(ExpandUNCFileName(dateieinfach)), VarArrayCreate([0, -1], varVariant)); if sysutils.FileExists(datei) = false then showmessage('Die Datei ' + datei + ' wurde nicht erstellt') else showmessage('Die Datei ' + datei + ' wurde erstellt') finally varList.free; end; end; Viel Spaß beim Testen und Weiterentwickeln