![]() |
Word 2010 Vorlage.dot ausfüllen
Hallo,
hat jemand eine Quelle wo man hierzu etwas nachlesen kann, meine speziell XE2 und Word 2010. Auf unterschiedlichen Rechnern erhalte ich verschiedene Fehlermeldungen, OLE Fehler, Server Fehler, usw... auf einigen Rechnern funktioniert es auch. Ich will in eine bestehende Word Vorlage Felder mit Daten aus der Datenbank ausfüllen und diese entweder nur anzeigen oder gleich ausdrucken. Zur Zeit mache ich es so:
Delphi-Quellcode:
Was wäre hier richtig, mit oder ohne Application? Compilieren lässt sich beides.
procedure TFormMain.PrintVorlage(Ausdrucken : Boolean);
var Dokument : Variant; AnzahlAusdrucke : Integer; begin try AnzahlAusdrucke := StrToInt(EditPrinterCopy.Text); except AnzahlAusdrucke := 1; end; try // Es wird zuerst versucht, eine laufende Word-Instanz zu verwenden Dokument := GetActiveOleObject('Word.Application'); except try // Läuft Word noch nicht, wird eine neue Verbindung aufgebaut Dokument := CreateOleObject('Word.Application'); except // Schlägt sie fehl (Word nicht installiert), gibt es eine Fehlermeldung ShowMessage('Microsoft Word kann nicht gestartet werden !'); exit; end; end; // http://stackoverflow.com/questions/5913665/word-2010-automation-goto-bookmark //loop that waits for the normal template to load while Dokument.Templates.Count = 0 do Sleep(200); Dokument.Visible := not Ausdrucken; Dokument.Documents.Add(Template := Anwendungsverzeichnis + 'Vorlage\XYZ.dot'); try with Datenmodul.UniQueryDataGrid do begin Dokument.ActiveDocument.FormFields.Item('Nummer').Result := FieldByName('Nummer').AsString; Dokument.ActiveDocument.FormFields.Item('Jahreszahl').Result := FieldByName('Jahreszahl').AsString; // ... end; if Ausdrucken then begin if not CheckBoxStandarddrucker.Checked then Dokument.ActivePrinter := ComboBoxPrinter.Text; // Background := true -> bedeutet, daß das Makro fortgesetzt werden soll, während WinWord druckt. // Background := false -> setzt dann eben das Makro nicht fort. Dokument.PrintOut(Background := false, Range := 0, Item := 0, Copies := AnzahlAusdrucke, PageType := 0); //Dateien schließen Dokument.Documents.Close(SaveChanges := 0); //MSWord schließen Dokument.Quit; end; finally Dokument := unassigned; end; end;
Delphi-Quellcode:
Im Quellcode werden folgende Einträge rot unterstrichen: Template, Background, Range, Item, Copies, Pagetype, SaveChanges
Dokument.PrintOut(Background := false, Range := 0, Item := 0, Copies := AnzahlAusdrucke, PageType := 0);
Dokument.Application.PrintOut(Background := false, Range := 0, Item := 0, Copies := AnzahlAusdrucke, PageType := 0); Auch das muss man doch anders lösen ? Habe echt keine Ahnung... |
AW: Word 2010 Vorlage.dot ausfüllen
Korrekt ist es eigentlich ohne Application.
Delphi-Quellcode:
WordApp.PrintOut(FileName := '', Range := wdPrintAllDocument, Item := wdPrintDocumentContent, Copies := 1,
Pages := '', PageType := wdPrintAllPages, ManualDuplexPrint := False, Collate := True, Background := True, PrintToFile := False, PrintZoomColumn := 0, PrintZoomRow := 0, PrintZoomPaperWidth := 0, PrintZoomPaperHeight := 0); |
AW: Word 2010 Vorlage.dot ausfüllen
Hallo,
mir fällt da so einiges auf was nicht optimal ist. Zitat:
Zitat:
Delphi-Quellcode:
. Der Compiler kann nicht meckern, da
Dokument.StirbLangsam.JetztErstRecht
Delphi-Quellcode:
vom Typ Variant ist, wo alles drin sein kann. Erst zur Laufzeit kracht es.
Dokument
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
einbeliebigername. |
AW: Word 2010 Vorlage.dot ausfüllen
Danke @einbeliebigername für die ausführliche Antwort / Hilfe.
Ich habe das ganze jetzt umgeschrieben. Jetzt habe ich nur noch eine Frage: Wie kann ich mehrere Word Dateien öffnen, der neue Code öffnet Word genau 1x, ein erneuter Aufruf öffnet kein neues Word Dokument?
Delphi-Quellcode:
uses
..., Word_TLB, Office_TLB; procedure TFormMain.PrintVorlage(Ausdrucken : Boolean); var WordApp : TWordApplication; Dokument : TWordDocument; FileName : OleVariant; AnzahlAusdrucke : Integer; begin try AnzahlAusdrucke := StrToInt(EditPrinterCopy.Text); except AnzahlAusdrucke := 1; end; FileName := Anwendungsverzeichnis + 'Vorlage\XYZ.dot'; try WordApp := TWordApplication.Create(Self); Dokument := TWordDocument.Create(Self); WordApp.Connect; WordApp.Documents.Open2000(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); Dokument.ConnectTo(WordApp.ActiveDocument); WordApp.Visible := not Ausdrucken; with Datenmodul.UniQueryDataGrid do begin Dokument.FormFields.Item('Nummer').Result := FieldByName('Nummer').AsString; Dokument.FormFields.Item('Jahreszahl').Result := FieldByName('Jahreszahl').AsString; // ... end; if Ausdrucken then begin if not CheckBoxStandarddrucker.Checked then WordApp.ActivePrinter := ComboBoxPrinter.Text; Dokument.PrintOut; Dokument.Close; WordApp.Quit; end; finally Dokument.Free; WordApp.Free; end; end; |
AW: Word 2010 Vorlage.dot ausfüllen
Hallo,
Zitat:
Delphi-Quellcode:
auch ein
WordApp.Documents
Delphi-Quellcode:
geben.
Add
Zitat:
Delphi-Quellcode:
sollte man nicht benutzt. Unter Umständen kann der Benutzer während der Programmausführung ein anderes Dokument aktivieren. Macht der Benutzer dies zum falschen Zeitpunkt, greift man über
ActiveDocument
Delphi-Quellcode:
auf das Falsche zu. Die Open- und Add-Methoden geben eigentlich das geöffnete/erzeugte Dokument zurück.
ActiveDocument
Auch auf sowas wie CurrentSelection und Zwischenablage sollte man bei der Word-/Excel-Automation verzichten. Diese Automationen sind nicht die Schnellsten. Vor allem wenn viele Seiten erzeugt werden sollen, kann das eine Weile dauern. Genug Zeit für den Benutzer mal schnell noch mit Verwendung der Zwischenablage eine E-Mail weiter zuschreiben. Der Benutzer macht das: 3. Strg+X 5. Cursor eine Absatz nach unten 8. Strg+V Und dein Program macht parallel das: 1. CopyToClipboard 2. ChangeCursor 4. PasteFromClipboard 6. SelectNextArea 7. CopyToClipboard 9. ChangeCursor 10. PasteFromClipboard Die Zahlen geben die Reihenfolge an, wie der Rechner das gerade in diesem Moment abarbeitet. Wenn der Benutzer nicht die Funktion Strg+Z kennt, wird er bestimmt richtig sauer. Vor allem wenn er die ultimative Antwort auf alle Fragen ausgeschnitten hat. einbeliebigername. |
AW: Word 2010 Vorlage.dot ausfüllen
Danke @einbeliebigername hat mir alles sehr geholfen, jetzt läuft es. :thumb:
Delphi-Quellcode:
procedure TFormMain.PrintVorlage(Ausdrucken : Boolean);
var WordApp : TWordApplication; Dokument : TWordDocument; FileName, SaveChanges, Background, Copies : OleVariant; begin FileName := Anwendungsverzeichnis + 'Vorlage\XYZ.dot'; SaveChanges := wdDoNotSaveChanges; Background := false; try Copies := StrToInt(EditPrinterCopy.Text); except Copies := 1; end; try WordApp := TWordApplication.Create(Self); Dokument := TWordDocument.Create(Self); WordApp.Connect; WordApp.Visible := not Ausdrucken; Dokument.ConnectTo(WordApp.Documents.Add(FileName, EmptyParam, EmptyParam, EmptyParam)); with Datenmodul.UniQueryDataGrid do begin Dokument.FormFields.Item('Nummer').Result := FieldByName('Nummer').AsString; Dokument.FormFields.Item('Jahreszahl').Result := FieldByName('Jahreszahl').AsString; // ... end; if Ausdrucken then begin if not CheckBoxStandarddrucker.Checked then WordApp.ActivePrinter := ComboBoxPrinter.Text; Dokument.PrintOut(Background, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, Copies, EmptyParam, EmptyParam); Dokument.Close(SaveChanges, EmptyParam, EmptyParam); WordApp.Quit; end; finally WordApp.Disconnect; Dokument.Free; WordApp.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz