Zugriff auf MS-Word-Dokument
-
Hallo,
möchte aus dem Programm auf ein MS-Word-Dokument zugreifen und nach bestimmte Textpasagenb ändern. Gibt es Schnittstellen dafür? Hat jemand ein Beispiel?
Gibt es Quellcodebeispiele? Bitte schreibt etwas.
-
-
Danke dir akari.
-
Hallo,
habe nun eindlich mal das Beispiel von [url]
http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/main/snip_cnt.htm
[/url]
ausprobiert. Die EXE-Datei lief einwandfrei. Danach habe ich den Quelltext in mein Programm eingearbeitet. Nun entstand folgendes Problem.
Die im Word-Dokument makierten Textstellen (Textmarken in Word) wurden nicht wie gewünscht von dem Programm ersetzt. Ziel war es, die makierten Textpasagen durch Texte aus TLabel-Objekten zu ersetzen.
Leider wurden die Texte hintereinander in die erste Zeile geschrieben.
Ich dachte nun, dass es am Programm liegt oder aber am Dokument. Konnte aber keinen Fehler fesstellen. Daher Compilierte ich das Beispiel von der oben aufgeführten Seite neu. Siehe da, es entstand das Gleiche Problem bei der Ausführung.
Wie ich schnell sehr schnell feststellte, wurde das Beispielprogramm mit dem C++ Builder 5 geschrieben und compiliert. Ich hingegen nutze das Developer Studio 2006
(C++ Builder). Somit habe ich nun ein Problem das in den Griff zu bekommen. Ich werde nun meinen Queltext Posten in der Hoffnung, dass jemand mir an den entscheidenen Stellen einen Tip geben kann.Headerdatei:
//--------------------------------------------------------------------------- #ifndef CertifcateH #define CertifcateH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include "Certifcate.h" #include <ComObj.hpp> #include <utilcls.h> #include "CRCTest.h" //--------------------------------------------------------------------------- // Definiton der Variablen für die Übergabe an "GoTo"-Funktion typedef enum WdGoToItem { wdGoToBookmark = 0xFFFFFFFF, wdGoToSection = 0, wdGoToPage = 1, wdGoToTable = 2, wdGoToLine = 3, wdGoToFootnote = 4, wdGoToEndnote = 5, wdGoToComment = 6, wdGoToField = 7, wdGoToGraphic = 8, wdGoToObject = 9, wdGoToEquation = 10, wdGoToHeading = 11, wdGoToPercent = 12, wdGoToSpellingError = 13, wdGoToGrammaticalError = 14, wdGoToProofreadingError = 15 } WdGoToItem; class TForm_Certificate : public TForm { __published: // Von der IDE verwaltete Komponenten TPanel *Panel_Certificate; TPanel *Panel_Date; TRadioGroup *RG_Language; TLabel *Label1; TLabel *Label2; TEdit *Edit_Start; TEdit *Edit_Ende; TLabel *Label3; TLabel *Label4; TButton *Button1; TButton *Button2; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // Benutzer-Deklarationen // Initialisierung des Word OLE-Servers bool __fastcall InitOleServer(Variant &vOLEWord); // Word-Dokument erzeugen, ggf. speichern und/oder drucken void __fastcall CreateDocument(Variant &vOLEWord, AnsiString slTemplateFile, AnsiString slSaveFile, bool blPrint); // Beenden des Word OLE-Servers void __fastcall TerminateOleServer(Variant &vOLEWord); public: // Benutzer-Deklarationen __fastcall TForm_Certificate(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm_Certificate *Form_Certificate; //--------------------------------------------------------------------------- #endifCPP-Datei
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Certifcate.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm_Certificate *Form_Certificate; //--------------------------------------------------------------------------- __fastcall TForm_Certificate::TForm_Certificate(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- //****************************************************************************** // Start und Beenden des OLE-Servers // Initialisierung des Word OLE-Servers bool __fastcall TForm_Certificate::InitOleServer(Variant &vOLEWord) { vOLEWord = Unassigned; try { // vielleicht läuft Word ja bereits (wenn nicht, wird hier // eine Exception generiert - aber die ist ja behandelt :) vOLEWord = GetActiveOleObject("Word.Application"); return false; } catch(...) { try { // vielleicht läuft Word ja bereits... vOLEWord = CreateOleObject("Word.Application"); return true; } catch(Exception& e) { // Wahrscheinlich kein Word auf dem Rechner... Application->MessageBox(e.Message.c_str(),"OLE-Error",MB_ICONERROR); vOLEWord = Unassigned; } } return true; } //------------------------------------------------------------------------------ // Beenden des Word OLE-Servers void __fastcall TForm_Certificate::TerminateOleServer(Variant &vOLEWord) { // Word OLE-Server beenden: if(!vOLEWord.IsEmpty()) { vOLEWord.OlePropertyGet("Application").OleProcedure("Quit"); vOLEWord = Unassigned; } } //****************************************************************************** //****************************************************************************** // Word-Dokument erzeugen, ggf. speichern und/oder drucken void __fastcall TForm_Certificate::CreateDocument(Variant &vOLEWord, AnsiString slTemplateFile, AnsiString slSaveFile, bool blPrint) { try { // falls Word-Fenster sichtbar sein soll, // muss folgende Zeile aktiviert werden: // vOLEWord.OlePropertySet("Visible", true); // Falls die Vorlagen-Datei nicht existiert, schimpfen und beenden: if(!FileExists(slTemplateFile)) { Application->MessageBox("Vorlagendatei nicht gefunden !", "Abbruch",MB_ICONERROR); return; } // Referenz auf die "Documents"-Eigenschaft besorgen Variant vDokuments = vOLEWord.OlePropertyGet("Documents"); // neues Dokument mit slTemplateFile als Dokumentenvorlage erzeugen: vDokuments.Exec(Procedure("Add") << slTemplateFile << 0); //-------------------------------------------------- // Formular-Felder ausfüllen //-------------------------------------------------- // Referenz auf die "Selection"-Eigenschaft besorgen Variant vSelection = vOLEWord.OlePropertyGet("Selection"); // Zu Textmarke "Name" gehen: vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "Name"); // den Text aus dem Eingabefeld eintragen: vSelection.OleProcedure("TypeText",(VARIANT) ((Variant)Form_Main->EditName->Text.c_str())); // Zu Textmarke "Start" gehen: vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "Start"); // den Text aus dem Eingabefeld eintragen: vSelection.OleProcedure("TypeText",(VARIANT) ((Variant)Edit_Start->Text.c_str())); // Zu Textmarke "Ende" gehen: vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "Start"); // den Text aus dem Eingabefeld eintragen: vSelection.OleProcedure("TypeText",(VARIANT) ((Variant)Edit_Ende->Text.c_str())); // Zu Textmarke "USER" gehen: vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "USER"); // den Text aus dem Eingabefeld eintragen: vSelection.OleProcedure("TypeText",(VARIANT) ((Variant)Form_Main->PwName->Text.c_str())); // Zu Textmarke "Password" gehen: vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "Password"); // den Text aus dem Eingabefeld eintragen: // vSelection.OleProcedure("TypeText",(VARIANT) // ((Variant)Form_Main->PwCRC->Text.c_str())); // ggf. drucken: if(blPrint) vOLEWord.OlePropertyGet("Application").OleProcedure("PrintOut"); // ggf. speichern: Variant vActiveDocument = vOLEWord.OlePropertyGet("ActiveDocument"); if(slSaveFile != EmptyStr) vActiveDocument.Exec(Procedure("SaveAs") << slSaveFile << 0 << 0 << "" << 1 << "" << 0 << 0 << 0 << 0 << 0 ); // "gespeichert"-Flag in Word setzen, damit keine Nachfragen kommen vActiveDocument.OlePropertySet("Saved", true); // Datei schließen: vActiveDocument.Exec(Procedure("Close")); } catch(Exception& e) { Application->MessageBox( e.Message.c_str(),"OLE-Error",MB_ICONERROR); } } //------------------------------------------------------------------------------ void __fastcall TForm_Certificate::Button1Click(TObject *Sender) { // OLE-Server initialisieren, die Variable blWordStarted // wird auf true gesetzt falls Word nicht bereits aktiv war Variant vOLEWord; bool blWordStarted = InitOleServer(vOLEWord); // Falls die Initialisierung des OLE-Servers erfolgreich, // Dokument erzeugen und speichern: if(!vOLEWord.IsEmpty()) CreateDocument(vOLEWord, ExtractFilePath(ParamStr(0))+"seavis_password_5_DE_xxx.doc", ExtractFilePath(ParamStr(0))+"seavis_password.doc", false); // Word nur beenden, wenn es von uns zuvor gestartet wurde: if(blWordStarted) TerminateOleServer(vOLEWord); } //--------------------------------------------------------------------------- void __fastcall TForm_Certificate::Button2Click(TObject *Sender) { // OLE-Server initialisieren, die Variable blWordStarted // wird auf true gesetzt falls Word nicht bereits aktiv war Variant vOLEWord; bool blWordStarted = InitOleServer(vOLEWord); // Falls die Initialisierung des OLE-Servers erfolgreich, // Dokument erzeugen und drucken: if(!vOLEWord.IsEmpty()) CreateDocument(vOLEWord, ExtractFilePath(ParamStr(0))+"seavis_password_5_DE_xxx.doc", EmptyStr, true); // Word nur beenden, wenn es von uns zuvor gestartet wurde: if(blWordStarted) TerminateOleServer(vOLEWord); } //---------------------------------------------------------------------------Bitte helft mir.
-
Hallo, ich konnte bis jetzt leider noch immer keine passende Lösung finden. Aber vieleicht hat hier doch noch jemand eine Lösung.