Word Serienbrieffelder füllen



  • So, ich hab jetzt sehr lange gesucht (auch hier) und bin zu keinem Ergebnis gekommen.

    Ich habe einen Word-Serienbrief und will nun die einzelnden Felder anspringen und sie Manuel füllen. Ich möchte sie natürlich mit den Namen die sie im Dokument haben ansprechen können. Mein Programm sieht nun wie folgt aus:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include <utilcls.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "Word_XP_srvr"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	Variant word_app;
    	Variant my_docs;
    	Variant my_selection;
    	Variant this_doc;
    	AnsiString  docData;
    	// FileOpen-Dialog aufrufen
    	if (OpenDialog1->Execute()) {
    		docData = OpenDialog1->FileName;
    	} else {
            docData = NULL;
    	}
    
    	try {
    		word_app  	 = Variant::CreateObject("word.application");
    		my_docs   	 = word_app.OlePropertyGet("documents");
    		my_selection = word_app.OlePropertyGet("Selection");
    
    		if (docData != NULL) {
    			// Wenn ein Word-Dokument gewählt wurde, dieses öffnen ...
    			this_doc = my_docs.OleFunction("Open", docData.c_str());
    
    			FillDocument(this_doc, my_selection);
    
    		} else {
    			//... sonst neues erstellen.
    			my_docs.OleProcedure("Add");
            }
    
    		// Word-Dokument sichtbar machen.
    		word_app.OlePropertySet("Visible", (Variant)true);
    
    		// Drucken
    		if(!word_app.IsEmpty()) {
    			word_app.OlePropertyGet("Application").OleProcedure("PrintOut");
    		}
    
    		// Word-Dokument schließen.
    		//! TODO Kann nicht beendet werden wärend noch im Druck.
    		//word_app.OlePropertyGet("Application").OleProcedure("Quit");
    	} catch(...) {
    		Application->MessageBoxA("Kein Microsoft Word auf dem PC installiert.","Error", MB_OK|MB_ICONERROR);
        }
    
    }
    //---------------------------------------------------------------------------
    
    void TForm1::FillDocument(Variant this_doc, Variant selection) {
    
    }
    

    In der Funktion FillDocument(Variant this_doc, Variant selection) will ich die Felder im Dokument nun entsprechend füllen. (Möglichst nicht nach Daten welche in einer Datenbank stehen, sondern von Hand).

    Ich hab vieles versucht und unternommen, auch vieles was ich hier im Forum gefunden hab, aber nichts hat geholfen .. vllt hab ichs auch einfach nur falsch verstanden, wo find ich z.B. eine Auflistung der Befehle die es gibt wie sie in z.B. OlePropertyGet stehen? also ich meine jetzt z.B. folgende: "Add", "Visible", "Application", "documents", "selection" usw.

    Würde mich freuen wenn mir hier jemand etwas auf die Sprünge helfen könnte, ich steig da nämlich nich so ganz durch. ^^

    MfG &'nd thx



  • Hallo

    phiLue schrieb:

    wo find ich z.B. eine Auflistung der Befehle die es gibt wie sie in z.B. OlePropertyGet stehen? also ich meine jetzt z.B. folgende: "Add", "Visible", "Application", "documents", "selection" usw.

    In der Word VBA-Hilfe. Diese ganzen Word-spezifischen OLE-Befehle haben nichts mit dem Builder zu tun, deshalb wirst du in der Builder-Hilfe nichts dazu finden. Aber da der OLE-Mechanismus eben die ganzen VBA-Strukturen verfügbar macht ist die VBA-Hilfe die erste Anlaufstelle. Am besten programmierst du den reinen Platzhalter-finden-und-ersetzen-Teil erstmal in VBA, dann kannst du diesen leichter nach OLE übersetzen.

    Das Problem Platzhalter in Word zu ersetzen hatten wir in verschiedenen Varianten hier schon öfters, zum Beispiel hier.

    bis bald
    akari



  • Vielen dank, das hat mich schon mal ein stück weiter gebracht 🙂

    Jetzt hab ich das Problem das ich es über die komponenten TWordDocument und TWordApplication machen soll ... funktioniert wohl auch soweit ganz gut nur hab ich ein Problem mit der Methode TWordApplication->Documents->Open():

    Open(VARIANT* FileName/*[in]*/, 
                                             VARIANT* ConfirmConversions/*[in,opt]*/, 
                                             VARIANT* ReadOnly/*[in,opt]*/, 
                                             VARIANT* AddToRecentFiles/*[in,opt]*/, 
                                             VARIANT* PasswordDocument/*[in,opt]*/, 
                                             VARIANT* PasswordTemplate/*[in,opt]*/, 
                                             VARIANT* Revert/*[in,opt]*/, 
                                             VARIANT* WritePasswordDocument/*[in,opt]*/, 
                                             VARIANT* WritePasswordTemplate/*[in,opt]*/, 
                                             VARIANT* Format/*[in,opt]*/, VARIANT* Encoding/*[in,opt]*/, 
                                             VARIANT* Visible/*[in,opt]*/, 
                                             VARIANT* OpenAndRepair/*[in,opt]*/, 
                                             VARIANT* DocumentDirection/*[in,opt]*/, 
                                             VARIANT* NoEncodingDialog/*[in,opt]*/, 
                                             Word_xp::WordDocument** prop/*[out,retval]*/) = 0; // [18]
    

    Wenn ich ihm nur den FileName übergebe hängt er sich in der Funktion ständig auf, ich denke mal es liegt daran das ich sonst überall EmptyParam übergeben habe, ich ihm aber ja als letzten Parameter ein Word_xp::WordDocument** Object übergeben muss. Da dieses aber leider ein Interface ist und ich keine Klasse kenne die davon abgeleitet ist und ich auch nirgendwo eine Dokumentation dazu finde komm ich an der Stelle leider nicht weiter ... vllt könnt ihr mir hier an der Stelle noch einmal helfen, wäre nett, danke schonmal 🙂


Anmelden zum Antworten