MS Ofiice OLE Autmatisierung



  • Servus Gemeinde,

    Ich bin auf der Suche nach einer Möglichkeit wie man Word nutzen kann um einen verschiedene Dinge in einen einfachen Report zu schreiben. Meine bisherigen Bemühungen zeigen immhin schon mal Word, das wars dann aber leider auch schon. Das liegt ganz einfach darin begründet das ich sowas noch nie gemacht habe, und die CodeGear C++ Builder 2007 Hilfe schweigt sich zu diesem Thema trotz Updates auch leider ganz schön aus.

    TWordApplication *WordApplication = NULL;
    	TWordDocument *WordDocument 	  = NULL;
    	try{
    		WordApplication = new TWordApplication(this);
    		WordDocument = new TWordDocument(WordApplication);
    		}
    		catch(Exception &e){
    			Application->MessageBoxA("Word nicht da!","Fehler",MB_ICONERROR);
    			return;
    			}
    
    		WordApplication->Visible = true;
    

    Immerhin wird schon mal ein leeres Word angezeigt. 🙂 So, nun meine Frage(n). Wie öffne ich ein neues Dokument und wie kann ich dann da Text,Bilder und Tabellen einfügen???

    MfG
    TFX



  • Das Problem hatte ich auch mal 😉

    Hab allerdings weit weniger Sachen damit machen müssen, kann dir ja trotzdem das posten, damit du zumindest Anhaltspunkte hast:

    [..]
      TWordApplication* wa = new TWordApplication(NULL);
      [..]
    
      wa->ConnectKind = ckNewInstance;
      wa->Connect();
    
      wa->set_Visible(true);
    
      wa->Documents->Open(
          OleVariant(StringToOleStr(ParamStr(2))), // FileName : der Name der zu ladenden Datei mit Pfad!
          OleVariant(false), // ConfirmConversions : ob die Datei konvertiert werden soll/muß
          OleVariant(false), // ReadOnly : ob die Datei schreibgeschütz geöffnet werden soll
          OleVariant(false), // AddToRecentFiles : ob die Datei in die Liste der letzten geöffneten Dateien angefügt werden soll
          OleVariant(StringToOleStr("")), // PasswordDocument : Kennwort zum Öffnen des Dokuments
          OleVariant(StringToOleStr("")), // PasswordTemplate : Kennwort zum Öffnen der Vorlage
          OleVariant(false), // Revert : ob Änderungen verworfen werden und Datei neu geöffnet werden soll, wenn Datei bereits geöffnet ist
          OleVariant(StringToOleStr("")), // WritePasswordDocument : Kennwort zum Speichern des Dokuments
          OleVariant(StringToOleStr("")), // WritePasswordTemplate : Kennwort zum Speichern der Vorlage
          OleVariant(wdOpenFormatAuto), // Format : Das Dateikonvertierungsprogramm zum Öffnen
          OleVariant(), // Encoding : Das zu verwendende Dokumentcodierung zum Öffnen
          OleVariant(true) // Visible : ob das Dokument in einem sichtbaren Fenster geöffnet werden soll
          );
    
      TWordDocument* wd = new TWordDocument(NULL);
      wd->ConnectTo(wa->ActiveDocument);
    
      // Fügt alle als Parameter übergebene Dateien in das Dokument ein
      for (int i = 2; i <= ParamCount(); ++i) {
        wa->Selection->EndKey(OleVariant(wdStory));
        wa->Selection->InsertFile(ConvertToWideChar(ParamStr(i).c_str()), OleVariant(StringToOleStr("")));
        if (i < ParamCount()) {
          wa->Selection->EndKey(OleVariant(wdStory));
          wa->Selection->InsertBreak(OleVariant(wdPageBreak));
        }
      }
    

    Ansonsten hilft viel Googeln dazu am meisten^^
    Das Dumme ist, dass ich auch unterschiede zwischen den Compilern festgestellt habe (das hier lief mit BCB 6, während es beim 2006er nicht ganz so klappte)
    Na ja, aber viel Glück!



  • soo, ich muss das hier leider nochmal ein wenig pushen.. 😃 Also, ich hab mittlerweile mitbekommen wie man Text und Bilder in ein Word Doc einfügt per OLE. Gelöst hab ich das über Textmarken im Word Doc die man sehr leicht anspringen kann.Was man dann an dieser Marke einfügt scheint Word relativ egal zu sein, jedenfalls bekomme ich so auch die Bilder ins Doc. Gemacht hab ich das so:
    im Header (*.h)

    #include "word_xp_srvr.h"
    #include <OleServer.hpp>
    
    //im private der Klasse dann
    private:	// Benutzer Deklarationen
    	TWordApplication* WordApplication;
    

    in der *.cpp

    WordApplication = new TWordApplication(this);
    WordApplication->Connect();
    WordApplication->Visible = true;
    OleVariant FileName = ExtractFilePath(Application->ExeName)+"Vorlage.doc";
    WordApplication->Documents->OpenOld(FileName, EmptyParam, EmptyParam,
    									 EmptyParam, EmptyParam, EmptyParam,
    									 EmptyParam, EmptyParam, EmptyParam,
    									 EmptyParam);
    
    OleVariant vWhat, vBookmark;
    vWhat = wdGoToBookmark;
    
    // anspringen der Textmarke und Text einfügen
    vBookmark = "NameTextMarke";
    WordApplication->Selection->GoTo(vWhat,EmptyParam,EmptyParam,vBookmark);
    WordApplication->Selection->Text = StringToOleStr("Mein Text hier");
    
    // Bild an der Textmarke einfügen
    vBookmark = "NameTextMarke";
    WordApplication->Selection->GoTo(vWhat,EmptyParam,EmptyParam,vBookmark);
    WordApplication->Selection->InlineShapes->AddPicture(StringToOleStr(ExtractFilePath(Application->ExeName)+"Dummy.jpg"));
    WordApplication->Quit(OleVariant(false),EmptyParam,EmptyParam);  // beenden, ohne Speichern
    WordApplication->Disconnect();
    

    So weit so gut. Allerdings such ich immernoch nach einer Möglichkeit wie ich eine Tabelle ins Word Doc bekomme und die gleich noch ausfüllen kann. Hast da jemand noch irgendwelche Vorschläge/Tipps oder gar Code ?!? Wär schön wenn man das dann auch mal endgültig klären könnte und das ganze vllt noch den Weg in die FAQ finden würde. Ich weiß, da gibts was zu EXCEL , aber halt eben rein gar nix zu WORD.

    so long
    TFX


Anmelden zum Antworten