Announcement

Collapse
No announcement yet.

Variablen in Word-Dokumentenvorlage ausfüllen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Variablen in Word-Dokumentenvorlage ausfüllen

    Hallo,
    ich möchte in einer Word-Dokumentenvorlage (VORLAGE.DOT) definierte, variable Bereiche mit Daten aus einer Datenbank oder dem Inhalt eines TEdit-Feldes ersetzen. Z.B. einen Bereich "KundenName" mit dem entsprechenden Kundennamen ersetzen. Gibt es da evtl. einen simplen Lösungsweg?
    Weiterhin muß ich ganze Word-Tabellen-Inhalte mit dem Inhalt einer DB füllen. Muß ich hierzu jedem Tabellen-Feld einen anderen Feldbezeichner geben, oder reicht das angeben von Spalten-Bezeichnern? (u.U. werden die Einträge so umfangreich, daß die Tabelle sich auf mehrere Seiten erstreckt, mit definiertem, festen Kopf- und Fußbereich). Hat jemand so etwas schon gelöst und könnte mir evtl. einen Auszug seiner Lösung dazu anbieten?
    Jürgen

  • #2
    Hallo,

    ein Delphi-Controller kann über den Automation-Weg in Word auf verschiedenen Wegen Daten übergeben: <b>Textmarken</b>, <b>DOKVARIABLE</b> und <b>FORMULARTEXT</b>. Angenommen, in einer DOT-Vorlagen werden FORMULARTEXT-Felder an die entsprechenden Stellen plaziert und mit einem Spaltennamen aus einer Datenbanktabelle versehen. Dann wäre die folgende automatische Datenübergabe möglich (ohne das im Programm eine zusätzliche Zeile geschrieben werden muß). Das Beispiel stammt aus einem Beispielprojekt meiner Session <b>COM I</b> der diesjährigen Entwicklerkonferenz:
    <pre>
    procedure TOSWordReportEx.Execute;
    var
    vWordDOT : OleVariant;
    aWordFormFields : FormFields;
    vWordField : OleVariant;
    vDocSave : OleVariant;
    aTField : TField;
    i : Integer;
    begin
    CheckWord;
    OSWordWaitFrm := TOSWordWaitFrm.Create(self);
    try
    // Word oder Hinweise-Formular anzeigen?
    if FPreview then
    FWordSrv.Visible := True
    else
    OSWordWaitFrm.Visible := True;
    // Ereignisbehandlungsmethode ?
    if Assigned(FReportHeaderPrint) then
    FReportHeaderPrint(self, FWordSrv);
    // Hauptdatenquelle auswerten
    with FMaster do
    begin
    First;
    while not EOF do
    begin
    Application.ProcessMessages;
    if OSWordWaitFrm.Stop then
    Break;
    // neues Dokument von der Vorlage anlegen
    vWordDOT := FTemplateName;
    FWordSrv.Documents.Add(vWordDOT, EmptyParam);
    FWordDoc := FWordSrv.ActiveDocument;
    // Referenz auf die Dokument-Textformularfelder holen
    aWordFormFields := FWordDoc.FormFields;
    // Felder des aktuellen Datensatzes auslesen
    for i := 0 to FieldCount-1 do
    begin
    aTField := Fields[i];
    // wenn das Feld sichtbar ist -> in Report aufnehmen
    if aTField.Visible then
    begin
    // Verbindung Textformularfeldname zu DataSet-Feldname herstellen
    vWordField := aTField.FieldName;
    aWordFormFields.Item(vWordField).Result_ := aTField.DisplayText;
    end;
    end;
    // Ereignisbehandlungsmethoden zugewiesen ?
    if Assigned(FPageHeaderPrint) then
    FPageHeaderPrint(self, FWordSrv);
    // Detail-DataSet berücksichtigten ?
    if Assigned(FDetail) then
    DoDetail;
    if Assigned(FPageFooterPrint) then
    FPageFooterPrint(self, FWordSrv);
    if FPreview then
    begin
    FWordDoc.PrintPreview;
    if MessageDlg('Weitermachen?', mtConfirmation, [mbYes, mbNo], 0)=mrNo then
    begin
    FWordDoc.ClosePrintPreview;
    vDocSave := False;
    FWordDoc.Close(vDocSave, EmptyParam, EmptyParam);
    Break;
    end;
    FWordDoc.ClosePrintPreview;
    end
    else
    begin
    OleVariant(FWordDoc).PrintOut;
    end;
    vDocSave := False;
    FWordDoc.Close(vDocSave, EmptyParam, EmptyParam);
    Next;
    end;
    end;
    if Assigned(FReportFooterPrint) then
    FReportFooterPrint(self, FWordSrv);
    finally
    OSWordWaitFrm.Release;
    end;
    end;
    procedure TOSWordReportEx.DoDetail;
    var
    i : Integer;
    iColumn : Integer;
    aWordTable : Table;
    aField : TField;
    begin
    CheckWord;
    // das erste Tabellenobjekt im Dokument auswählen
    aWordTable := FWordDoc.Tables.Item(1);
    // Detail-Dataset vom ersten bis zum letzten Datensatz auslesen
    with FDetail do
    begin
    First;
    while not EOF do
    begin
    iColumn := 0;
    for i := 0 to FieldCount-1 do
    begin
    aField := Fields[i];
    if aField.Visible then
    begin
    Inc(iColumn);
    aWordTable.Cell(RecNo, iColumn).Range.Text := aField.AsString;
    end;
    end;
    // Ereignisbehandlungsmethode zugewiesen ?
    if Assigned(FDetailPrint) the

    Comment


    • #3
      Hallo Andreas, besten Dank für den Tip. Nun werde ich mir doch vorab Deine COM1-HTML ziehen (ursprünglich wollte ich ja auf die CD zur Konferenz warten...). Mal sehen ob ich damit mein Problem lösen kann. Gruß Jürge

      Comment

      Working...
      X