AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Word-Datei einbinden, bearbeiten, speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Word-Datei einbinden, bearbeiten, speichern

Ein Thema von AJ_Oldendorf · begonnen am 23. Jun 2021 · letzter Beitrag vom 28. Jun 2021
Antwort Antwort
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#1

Word-Datei einbinden, bearbeiten, speichern

  Alt 23. Jun 2021, 09:51
Hallo zusammen,
ich habe schon ein bisschen was im Forum gefunden, würde aber gerne mal meine Aufgabe erklären und suche ein paar Antworten dazu.

Ich möchte aus meinem Programm heraus eine vorhandene Word-Datei öffnen, diese mit Word bearbeiten und anschließend unter einem vorgegebenen Namen wieder abspeichern. Die Original Word-Datei soll selber gar nicht geändert werden. Diese dient wie eine Vorlage, das bearbeitete Dokument soll einen Dateinamen bekommen, den ich aus meinem Programm vorgebe. Geht das so überhaupt?

Ich habe schon bzgl. der OLE Schnittstelle gelesen. Gibt es eine Übersicht, aller möglichen Befehle, damit ich das oben beschriebene realisieren/testen kann?
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
213 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Word-Datei einbinden, bearbeiten, speichern

  Alt 23. Jun 2021, 10:35
Hallo,

auf die Frage "Geht das so überhaupt?" ist die Antwort ja.

Ein paar Tipps:

word2010.pas ist eine gute Hilfe.

Mach dich vertraut mit dem Word Format dotx (Type Word Vorlage)

Wenn du "Hallo Word" hast dann melde dich bitte.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Word-Datei einbinden, bearbeiten, speichern

  Alt 23. Jun 2021, 11:39
Danke, die Pas-Datei kannte ich noch gar nicht

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin

  try
    WordApp.Documents.Open('D:\Test1.docx');

  finally

  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WordApp.ActiveDocument.SaveAs('D:\Test2.docx');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WordApp := CreateOLEObject('Word.Application');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  WordApp := Unassigned;
end;
Damit kann ich eine Datei öffnen und wieder abspeichern.
Komischerweise bleibt am Ende aber immer die Tilde-Datei der Test2.docx vorhanden und die Test2.docx scheint von irgendeinem Prozess in Verwendung zu sein, weil ich sie auch nicht löschen kann im Explorer.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.443 Beiträge
 
Delphi 7 Professional
 
#4

AW: Word-Datei einbinden, bearbeiten, speichern

  Alt 23. Jun 2021, 13:11
Wenn Du im Taskmanager nachschaust, wirst Du feststellen, dass Word noch läuft (und das geöffnete Dokument nicht geschlossen wurde und (vermutlich) jeder ButtonClick eine weitere Wordinstanz erstellt).

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  vParam : OleVariant;
begin
  // Aktuelles Dokument unter neuem Namen speichern.
  WordApp.ActiveDocument.SaveAs('D:\Test2.docx');
  // Aktuelles Dokument (ohne Änderungen zu speichern) schließen.
  vParam := wdDoNotSaveChanges;
  WordApp.ActiveDocument.Close(vParam);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  WordApp.Quit; // Word beenden.
  WordApp := Unassigned;
end;
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Word-Datei einbinden, bearbeiten, speichern

  Alt 23. Jun 2021, 13:25
Ok, danke.
Wenn der User aber Word manuell schließt, dann kommt im Destroy eine Fehlermeldung, weil Word nicht mehr offen ist.
Kann man denn verhindern, dass der User diese Instanz manuell beendet? Das öffnen und schließen sollte nur aus meiner Anwendung gehen

Oder gibt es ein Event, welches man verknüpfen könnte, um auf das geschlossene Word zu reagieren?

Eine Sache noch, wenn ich zwischen dem Button1 (öffnen) und dem Button2 (speichern mit SaveAs) an dem Word Dokument änderungen vornehme, werden diese in meinem zweiten Word Dokument immer gespeichert, egal ob ich "wdDoNotSaveChanges" oder "wdSaveChanges" mit anschließenden Close aufrufe. Was bringt mir also das mit den beiden Parametern?

Geändert von AJ_Oldendorf (23. Jun 2021 um 13:32 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.443 Beiträge
 
Delphi 7 Professional
 
#6

AW: Word-Datei einbinden, bearbeiten, speichern

  Alt 23. Jun 2021, 14:01
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Try
    WordApp.Quit; // Word beenden.
  Except
    // Fehlermeldung ausgeben oder sonstwas machen oder Fehler ignorieren.
  end;
  Try
    WordApp := Unassigned;
  Except
    // Fehlermeldung ausgeben oder sonstwas machen oder Fehler ignorieren.
  end;
end;
SaveAs speichert das Dokument so, wie es gerade ist. Wenn man was ändert, speichert man die Änderungen natürlich mit. Das Originaldokument sollte aber ohne Änderungen geschlossen werden.

wdDoNotSaveChanges bzw. wdSaveChanges beziehen sich auf das WordApp.ActiveDocument.Close und werden diesem als Parameter übergeben. WordApp.ActiveDocument.SaveAs weiß davon nix.

WordApp.ActiveDocument.Close(wdSaveChanges) speichert Änderungen im aktiven Dokument und schließt es.
WordApp.ActiveDocument.Close(wdDoNotSaveChanges) verwirft Änderungen im aktiven Dokument und schließt es.
WordApp.ActiveDocument.SaveAs('Dokumentenname.docx ') speichert das aktive Dokument, so wie es gerade ist, unter dem angegebenen Namen.
Es wäre mal zu prüfen, ob sich durch SaveAs das aktive Dokument ändert (vermutlich ja).

Mal folgende Annahme:

Button1Click

Dann Änderungen machen

Button2Click

Dann sind die Änderungen im Dokument unter neuem Namen gespeichert.
Das per SaveAs gespeicherte Dokument entspricht damit nicht mehr dem mit Button1Click geöffneten Dokument.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WordApp.Documents.Open('D:\Test1.docx');
  WordApp.ActiveDocument.SaveAs('D:\Test2.docx');
  // Hier sind die Dokumente Test1.docx und Test2.docx (noch) gleich.
end;

// Jetzt was im Dokument ändern.
procedure TForm1.Button2Click(Sender: TObject);
var
  vParam : OleVariant;
begin
  // Aktuelles Dokument (ohne Änderungen zu speichern) schließen.
  vParam := wdDoNotSaveChanges;
  WordApp.ActiveDocument.Close(vParam);
  // Damit dürften dann die Änderungen in der per SaveAs erstellten Kopie
  // nicht enthalten sein.
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz