Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
Delphi 10.4 Sydney
|
AW: moderne Word-Anbindung
18. Sep 2014, 09:32
Ich habe schon mal eine Applikation geschrieben die Word Automation benutzt und Daten aus einer DB in Word einsetzt.
Die Word Dokumente enthalten Platzhalter mit #Platzhaltername# gekennzeichnet.
Somit kann man beliebige Platzhalter definieren und benötigt keine Serienbrieffunktion von Word.
Ich habe die "Microsoft Office 2000 Beispiele..." unter "Packages installieren" aktiviert und arbeite mit dem Word200 OLE Objekt, das funktioniert auch mit Word2013.
Hier einige Code-Auszüge:
Code:
//******************************************************************************
//***************** Word öffnen ************************************************
//******************************************************************************
Procedure ConnectToWord(sichtbar: Boolean);
Var
wFalse, TempFile: OleVariant;
Ziel, Dateiname: String;
Begin
wFalse := False;
{ Check if file exists }
If Not FileExists(Filename) Then
Begin
ShowMessage('Das Dokument ist nicht vorhanden');
Exit;
End;
With Form1 Do
Begin
Try
If (Not aktiv('Word.Application')) Then
Begin
WordOpen := False;
End;
WordApplication1.Connect;
Except
Showmessage('Word konnte nicht gestartet werden');
exit;
End;
If WordOpen Then
WordDocument1.Close(wFalse);
If Aendern Then
Begin
// Kopie von Worddatei anlegen und damit arbeiten bei Replace
Dateiname := FrmVerwaltungBriefe.BGrid.Cells[2, StrToInt(BriefIndex)];
Ziel := AppPath + '$TempDoc.doc';
Tools.CopyFile(Dateiname, Ziel);
TempFile := Ziel;
WordApplication1.Documents.OpenOld(TempFile, wFalse, wFalse, wFalse,
EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);
End
Else
// Wenn 'Brief laden' aufgerufen wurde, dann mit Orginaldatei arbeiten
WordApplication1.Documents.OpenOld(FileName, wFalse, wFalse, wFalse,
EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
WordApplication1.Visible := sichtbar;
WordOpen := True;
//WordApplication1.Activate;
End;
End;
//******************************************************************************
//***************** Word Beenden ***********************************************
//******************************************************************************
Procedure WordBeenden;
Begin
With Form1 Do
Begin
If WordOpen Then
Begin
Try
WordApplication1.Quit;
WordApplication1.Disconnect;
Except
End;
End;
End;
End;
//******************************************************************************
//***************** Word Replace Funktion **************************************
//******************************************************************************
{
Diese Funktion startet eine Word versteckte Instanz, öffnet eine Datei und
ersetzt (alle) Vorkommen von "SearchString" durch "ReplaceString".
Die Funktion ist ähnlich zur StringReplace() Funktion.
}
Procedure Word_StringReplace(SearchString, ReplaceString: String; ReplaceAll: Boolean);
Const
wdFindContinue = 1;
wdReplaceOne = 1;
wdReplaceAll = 2;
Var
_Search, _Replace, _Wrap, _ReplaceAll, F, T: OLEVariant;
Begin
// Application.ProcessMessages;
{ Initialisiere Parameter}
If ReplaceAll Then
_ReplaceAll := wdReplaceAll
Else
_ReplaceAll := wdReplaceOne;
_Search := SearchString;
_Replace := ReplaceString;
_Wrap := wdFindContinue;
F := False;
T := True;
{ Perform the search}
//FindText,Case,WholeWord,WildChars,SoundsLike,AllWordForms,Forward,Wrap,ReplaceWith,ReplaceTyp
Form1.WordApplication1.Selection.Find.ExecuteOld(
_Search, F, T, F, F, F, T, _Wrap, F, _Replace, _ReplaceAll);
// Application.ProcessMessages;
End;
//******************************************************************************
//********************** Formulare *******************************
//******************************************************************************
//******************************************************************************
//********************** Replace Brief ausgeben ********************************
//******************************************************************************
Procedure BriefReplace;
Var
i: Integer;
Begin
// Application.ProcessMessages;
Word_StringReplace('#Adr_Anrede#', Form1.QKundenAnrede.Text, True);
Word_StringReplace('#Adr_Vorname#', Form1.QKundenVorname.Text, True);
Word_StringReplace('#Adr_Name#', Form1.QKundenName.Text, True);
Word_StringReplace('#Adr_Strasse#', Form1.QKundenStrasse.Text, True);
Word_StringReplace('#Adr_PLZ#', Form1.QKundenPLZ.Text, True);
Word_StringReplace('#Adr_Ort#', Form1.QKundenOrt.Text, True);
Word_StringReplace('#GebDatum#', Form1.QKundenGebDatum.Text, True);
For i := 1 To FrmFelder.Grid.RowCount - 1 Do
Begin
Word_StringReplace('#' + WordFeld[i].Name + '#', WordFeld[i].Text, True);
End;
Application.ProcessMessages;
End;
|