Home » Tutorials » Third-Party-Komponenten » OLE-Automation von MS Office

OLE-Automation von MS Office

Datenübergabe an Word

Zwei wichtige Anwendungen ist der Seriendruck und die Erstellung eines Dokuments, das Daten aus einer Delphi-Anwendung erhält.

Der Seriendruck

Als Grundlage hierzu benötigt man ein entsprechend vorbereitetes Dokument und die dazugehörige Datendatei, am einfachsten eine CSV-Datei, die sehr einfach mit Delphi erstellt werden kann. Als Vorlage kannst Du die beiden mitgelieferten Dateien (Daten.txt und SerienDruck.doc) im Sourceverzeichnis verwenden. Evtl. musst Du das *.doc vorher noch in Word öffnen und die Datendatei wegen der Pfadänderung noch mal neu verknüpfen. Wenn beim Öffnen des Dokumentes eine Fehlermeldung kommt, einfach auf „Datenquelle suchen” klicken und „Date.txt” im Projektverzeichnis auswählen.
Nun geht’s an die Anwendung. Füge in ein neues Projekt ein TOpenDialog und eine TButton-Komponente ein. Die Caption des Buttons wird in „Seriendruck” geändert. Erzeuge wie oben im OnCreate ein WordApplication und diesmal auch eine WordDocument-Instanz (von TWordDocument) und vergiss die beiden nicht freizugeben…
In das OnClick-Ereignis des Buttons kommt:

procedure TForm1.Button1Click(Sender: TObject);
var  FileName, NewFile : OleVariant;
  Mail: MailMerge;  
  Pause : OleVariant;
begin
  if OpenDialog1.Execute then
    FileName:=OpenDialog1.FileName
  else
    exit;  
  NewFile:=ExtractFilePath(FileName)+'Brief.doc';
  WordApplication.Connect;
  WordApplication.Documents.OpenOld(FileName, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam,
    EmptyParam);
  WordDocument.ConnectTo(WordApplication1.ActiveDocument);
  WordApplication.Visible:=True;
  Pause:=True;
  Mail:=WordDocument.MailMerge;
  Mail.Destination := wdSendToNewDocument;
  Mail.Execute(Pause);'
  ShowMessage('Fertig');
  WordDocument.Close;
  WordDocument.Disconnect;
  WordDocument.ConnectTo(WordApplication1.ActiveDocument);
  WordDocument.SaveAs(newFile);
  WordDocument.Disconnect;
  WordApplication.Quit;
  WordApplication.Disconnect;
end;

Die Parameter die bei COM Verwendung finden, sind vom Typ OleVariant. Ab Delphi 4 steht für leere Parameter der spezielle Platzhalter EmptyParam zur Verfügung.
Achtung: Seit Delphi 6 muss die Unit Variants eingebunden werden!
Als erstes wird die Anwendung mit Word verbunden und das vorgefertigte Dokument geöffnet. Anschließend wird TWordDocument mit dem Dokument verbunden. Nun wird ein Inteface-Zeiger auf das Mail-Objekt gesetzt (Mail:=WordDocument.MailMerge;), mit dem die eigentliche Funktion schließlich aufgerufen wird (Mail.Execute(Pause);). Nun kann das Original geschlossen werden und die TWordDocument Komponente mit dem fertigen Serienbrief verknüpft werden, das unter dem angegebenen Namen abgespeichert wird. Zum Schluss wird Word geschlossen.

Datenübergabe

Im letzten Beispiel soll eine Rechnung erstellt werden. Als Datengrundlage steht hier normalerweise eine Datenbank. Hier werde ich aber „nur” hart-codierte Daten verwenden.
Zuerst musst Du aber das Dokument vorbereiten. Um Daten empfangen zu können, müssen in das Dokument Textmarke eingefügt werden. Diese Textmarke bekommen eindeutige Namen, über die auf die Textmarken zugegriffen werden können. Positioniere den Cursor im Dokument an der Stelle, an der die Daten erscheinen sollen. Klicke anschließend im Menü auf Einfügen ->
Textmarke. Gib einen Namen ein und klicke auf „Hinzufügen”. Das Fenster schließt sich wieder. Wenn im Dokument nichts zu sehen ist, klicke im Hauptmenü auf Extras -> Optionen und aktiviere unter „Anzeigen” die Textmarken. Nun müsste an der Stelle, an der Du die Textmarke eingefügt hast, ein senkrechter Strich erscheinen. Füge nun weitere Textmarken in das Dokument ein. Die Textattribute an der Stelle der Textmarken können natürlich nach Belieben gesetzt werden. Speichere anschließend das Dokument ab.
Öffne in Delphi eine neue Anwendung und füge wieder eine TWordApplication, eine TWordDocument, ein TOpenDialog und eine TButton Komponente in das Formular ein. In das OnClick-Ereignis kommt:

var FileName:OleVariant;
  vWhat, vBookmark:OleVariant;
begin
  if OpenDialog1.Execute then
    FileName := OpenDialog1.FileName
  else
    exit;
  WordApplication.Connect;
  WordApplication.Documents.OpenOld(FileName, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam);
  WordDocument.ConnectTo(WordApplication1.ActiveDocument);
  WordApplication.Visible := True;
  vWhat:=wdGoToBookmark;
  vBookmark:='Name';
  WordApplication.Selection.GoTo_(vWhat,emptyParam,emptyParam,vBookmark);
  WordApplication.Selection.TypeText('Max Mustermann'#13'Dorfstraße 100');
end;

Nach dem altbekannten Aufruf von Word und dem Laden des vorbereiteten Dokuments, werden die benötigten Variablen vorbereitet. vWhat bezeichnet die Art des Objektes zu dem gesprungen werden soll und vBookmark bezeichnet den Namen des Objektes, in unserem Fall den Namen der Textmarke. Mit dem Funktionsaufruf WordApplication.Selection.GoTo_ wird zu dem Objekt gesprungen und der Text mit WordApplication.Selection.TypeText der Text an Word übergeben. Dabei können auch mehrzeilige Texte übergeben werden, indem #13 mit in den String eingebaut wird.