Automatisierung von OpenOffice mit Delphi

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
Werbung & Infos:

Aktuelles Bitdefender Angebot


Verwandte Themen: