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













