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