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.



  • Hallo

    Suchfunktion benutzen! Zum Beispiel das hier habe ich mit *word* gefunden.

    bis bald
    akari



  • 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;
    //---------------------------------------------------------------------------
    #endif
    

    CPP-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.


Anmelden zum Antworten