Announcement

Collapse
No announcement yet.

Word und Tabellen

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

  • Word und Tabellen

    Hallo,<BR>
    <BR>
    ich möchte in meiner Anwendung einen Ausdruck generieren und diesen vom Anwender<BR>noch bearbeiten lassen. Ich habe viel gelesen, aber mir fehlt einfach mal ein Beispiel, wie ich eine<BR>Word-Vorlage gestallten muss, damit meine Master/Detail-Daten (Angebot mit einzelnen Positionen)<BR> korrekt erscheinen.<BR><P>Ich habe auch bereits die Quickreport-Export-Komponenten von gnostice<BR>
    probiert. Sieht zwar gut aus aber die Ausgabe läßt sich nur mühsam formatieren.<BR><P>freue mich über jede Anregung, da ich leider kein Word-Experte bin.

  • #2
    Hallo,

    das folgende Beispiel stammt aus meinem Buch <I>COM/DCOM/COM+ mit Delphi</i> (siehe <i>http://www.software-support.biz/sus/sus_buch/psecom,id,4,nodeid,11,_language,de.html</i>) und wird auf der Seite 483ff näher beschrieben (auf der Buch-CD ist auch das vollständige Beispielprojekt inklusive DOT-Vorlage):
    <pre>
    <font color="#000080"><i>{ ************************************************** **************
    Typ : Hauptformular
    Autor : Andreas Kosch
    Compiler : Delphi 4.02 CSS
    Betriebssystem : Windows 98
    Beschreibung : Komponente für den Einsatz von Microsoft Word
    als Report-Engine. Zur Anpassung an ein Projekt
    sind die folgenden Schritte notwendig:
    <br>
    1. DOT-Vorlage für Word erstellen, indem für jedes Feld der Ergebnis-
    menge ein FORMULARTEXT-Feld vorgesehen wird:
    - Datei Neu | Neues Formular
    - Ansicht | Symbolleisten | Formular
    - FORMULARTEXT-Felder an die entsprechenden Stellen plazieren
    - FORMULARTEXT-Felder via rechter Maus (Eigenschaften) konfigurieren,
    wobei der Feldname auf den einzufügenden Dataset-Feldnamen
    gesetzt wird.
    - Details zu einem MASTER-Datensatz werden als Tabelle eingefügt,d.h.
    in der DOT-Vorlage muß eine Tabelle vorhanden sein.
    2. Datasets zuweisen
    3. Via OSWordReport.Execute wird der Report ausgeführt. Ist die
    Eigenschaft Preview auf TRUE gesetzt, zeigt Word den generierten
    Report Seite für Seite an. Ist Preview auf FALSE, wird der
    Report gleich ausgedruckt.
    ************************************************** ************** }</i></font>
    <br>
    <b>unit</b> OSWordReport;
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    Dialogs, Db;
    <br>
    <b>type</b>
    <font color="#000080"><i>// Forward-Deklaration</i></font>
    TOSWordReport = <b>class</b>;
    <font color="#000080"><i>// Ereignisse von TOSWordReport</i></font>
    TOSReportEvent = <b>procedure</b>(Sender: TOSWordReport; <b>var</b> Word: OleVariant) <b>of</b> <b>object</b>;
    <br>
    TOSWordReport = <b>class</b>(TComponent)
    <b>private</b>
    <font color="#000080"><i>{ Private declarations }</i></font>
    FWordSrv : OleVariant;
    FWordDoc : OleVariant;
    FTemplateName : <b>string</b>;
    FMaster : TDataSet;
    FDetail : TDataSet;
    FReportHeaderPrint : TOSReportEvent;
    FReportFooterPrint : TOSReportEvent;
    FPageHeaderPrint : TOSReportEvent;
    FDetailPrint : TOSReportEvent;
    FPageFooterPrint : TOSReportEvent;
    FPreview : Boolean;
    <b>procedure</b> CheckWord;
    <b>procedure</b> DoDetail;
    <b>protected</b>
    <font color="#000080"><i>{ Protected declarations }</i></font>
    <b>public</b>
    <font color="#000080"><i>{ Public declarations }</i></font>
    <b>constructor</b> Create(AOwner: TComponent); <b>override</b>;
    <b>destructor</b> Destroy; <b>override</b>;
    <b>procedure</b> Execute;
    <b>published</b>
    <font color="#000080"><i>{ Published declarations }</i></font>
    <b>property</b> TemplateName: <b>String</b>
    <b>read</b> FTemplateName <b>write</b> FTemplateName;
    <b>property</b> MasterDataset: TDataSet
    <b>read</b> FMaster <b>write</b> FMaster;
    <b>property</b> DetailDataset: TDataSet
    <b>read</b> FDetail <b>write</b> FDetail;
    <b>property</b> ReportHeaderPrint: TOSReportEvent
    <b>read</b> FReportHeaderPrint <b>write</b> FReportHeaderPrint;
    <b>property</b> ReportFooterPrint: TOSReportEvent
    <b>read</b> FReportFooterPrint <b>write</b> FReportFooterPrint;
    <b>property</b> PageHeaderPrint: TOSReportEvent
    <b>read</b> FPageHeaderPrint <b>write</b> FPageHeaderPrint;
    <b>property</b> DetailPrint: TOSReportEvent
    <b>read</b> FDetailPrint <b>write</b> FDetailPrint;
    <b>property</b> PageFooterPrint: TOSReportEvent
    <b>read</b> FPageFooterPrint <b>write</b> FPageFooterPrint;
    <b>property</b> Preview: Boolean
    <b>read</b> FPreview <b>write</b> FPreview;
    <b>end</b>;
    <br>
    <b>procedure</b> <b>Register</b>;
    <br>
    <b>implementation</b>
    <br>
    <b>uses</b> ComObj, OSWordReportWait;
    <br>
    resourcestring
    cWORDSERVERNAME = 'word.application'; <font color="#000080"><i>// Word97-Objekt</i></font>
    <br>
    <b>procedure</b> <b>Register</b>;
    <b>begin</b>
    RegisterComponents('OSTOOLS', [TOSWordReport]);
    <b>end</b>;
    <br>
    <b>constructor</b> TOSWordReport.Create(AOwner: TComponent);
    <b>begin</b>
    <b>inherited</b> Create(AOwner);
    <b>if</b> <b>not</b> (csDesigning <b>in</b> ComponentState) <b>then</b>
    FWordSrv := CreateOleObject(cWORDSERVERNAME);
    <b>end</b>;
    <br>
    <b>destructor</b> TOSWordReport.Destroy;
    <b>begin</b>
    <b>if</b> <b>not</b> (csDesigning <b>in</b> ComponentState) <b>then</b>
    FWordSrv.Quit(False);
    <b>inherited</b> Destroy;
    <b>end</b>;
    <br>
    <b>procedure</b> TOSWordReport.CheckWord;
    <b>begin</b>
    <b>if</b> VarIsEmpty(FWordSrv) <b>then</b>
    <b>raise</b> Exception.Create('Word-Automation ist fehlgeschlagen!');
    <b>end</b>;
    <br>
    <font color="#000080"><i>{ Detail-Datensätze werden in die Tabelle im Dokument eingefügt }</i></font>
    <br>
    <b>procedure</b> TOSWordReport.DoDetail;
    <b>var</b>
    i : Integer;
    iColumn : Integer;
    aWordTable : OleVariant;
    aField : TField;
    <b>begin</b>
    CheckWord;
    aWordTable := FWordDoc.Tables.Item(1);
    <font color="#000080"><i>// Detail-Dataset vom ersten bis zum letzten Datensatz auslesen</i></font>
    <b>with</b> FDetail <b>do</b>
    <b>begin</b>
    First;
    <b>while</b> <b>not</b> EOF <b>do</b>
    <b>begin</b>
    iColumn := 0;
    <b>for</b> i := 0 <b>to</b> FieldCount-1 <b>do</b>
    <b>begin</b>
    aField := Fields[i];
    <b>if</b> aField.Visible <b>then</b>
    <b>begin</b>
    Inc(iColumn);
    aWordTable.Cell(RecNo, iColumn).Range.Text := aField.DisplayText;
    <b>end</b>;
    <b>end</b>;
    <font color="#000080"><i>// Ereignisbehandlungsmethode zugewiesen ?</i></font>
    <b>if</b> Assigned(FDetailPrint) <b>then</b>
    FDetailPrint(self, FWordSrv);
    <font color="#000080"><i>// nächster Datensatz -&gt; neue Zeile an die Tabelle anfügen</i></font>
    Next;
    aWordTable.Rows.Add;
    <b>end</b>;
    <b>end</b>;
    <b>end</b>;
    <br>
    <b>procedure</b> TOSWordReport.Execute;
    <b>var</b>
    vWordDOT : OleVariant;
    vWordFormFields : OleVariant;
    vWordField : OleVariant;
    aTField : TField;
    i : Integer;
    <b>begin</b>
    CheckWord;
    OSWordWaitFrm := TOSWordWaitFrm.Create(self);
    <b>try</b>
    <font color="#000080"><i>// Word oder Hinweise-Formular anzeigen?</i></font>
    <b>if</b> FPreview <b>then</b>
    FWordSrv.Visible := True
    <b>else</b>
    OSWordWaitFrm.Visible := True;
    <font color="#000080"><i>// Ereignisbehandlungsmethode ?</i></font>
    <b>if</b> Assigned(FReportHeaderPrint) <b>then</b>
    FReportHeaderPrint(self, FWordSrv);
    <font color="#000080"><i>// Hauptdatenquelle auswerten</i></font>
    <b>with</b> FMaster <b>do</b>
    <b>begin</b>
    First;
    <b>while</b> <b>not</b> EOF <b>do</b>
    <b>begin</b>
    Application.ProcessMessages;
    <b>if</b> OSWordWaitFrm.Stop <b>then</b>
    Break;
    <font color="#000080"><i>// neues Dokument von der Vorlage anlegen</i></font>
    vWordDOT := FTemplateName;
    FWordSrv.Documents.Add(vWordDOT);
    FWordDoc := FWordSrv.ActiveDocument;
    <font color="#000080"><i>// Referenz auf die Dokument-Textformularfelder holen</i></font>
    vWordFormFields := FWordDoc.FormFields;
    <font color="#000080"><i>// Felder des aktuellen Datensatzes auslesen</i></font>
    <b>for</b> i := 0 <b>to</b> FieldCount-1 <b>do</b>
    <b>begin</b>
    aTField := Fields[i];
    <font color="#000080"><i>// wenn das Feld sichtbar ist -&gt; in Report aufnehmen</i></font>
    <b>if</b> aTField.Visible <b>then</b>
    <b>begin</b>
    <font color="#000080"><i>// Verbindung Textformularfeldname zu DataSet-Feldname herstellen</i></font>
    vWordField := aTField.FieldName;
    vWordFormFields.Item(vWordField).Result := aTField.DisplayText;
    <b>end</b>;
    <b>end</b>;
    <font color="#000080"><i>// Ereignisbehandlungsmethoden zugewiesen ?</i></font>
    <b>if</b> Assigned(FPageHeaderPrint) <b>then</b>
    FPageHeaderPrint(self, FWordSrv);
    <font color="#000080"><i>// Detail-DataSet berücksichtigten ?</i></font>
    <b>if</b> Assigned(FDetail) <b>then</b>
    DoDetail;
    <b>if</b> Assigned(FPageFooterPrint) <b>then</b>
    FPageFooterPrint(self, FWordSrv);
    <b>if</b> FPreview <b>then</b>
    <b>begin</b>
    FWordDoc.PrintPreview;
    <b>if</b> MessageDlg('Weitermachen?', mtConfirmation, [mbYes, mbNo], 0)=mrNo <b>then</b>
    <b>begin</b>
    FWordDoc.ClosePrintPreview;
    FWordDoc.Close(False);
    break;
    <b>end</b>;
    FWordDoc.ClosePrintPreview;
    <b>end</b>
    <b>else</b>
    <b>begin</b>
    FWordDoc.PrintOut(False);
    <b>end</b>;
    FWordDoc.Close(False);
    Next;
    <b>end</b>;
    <b>end</b>;
    <b>if</b> Assigned(FReportFooterPrint) <b>then</b>
    FReportFooterPrint(self, FWordSrv);
    <b>finally</b>
    OSWordWaitFrm.Release;
    <b>end</b>;
    <b>end</b>;
    <br>
    <b>end</b>.</pre&gt

    Comment

    Working...
    X