Word Dokument erstellen bzw ausfüllen



  • Hi.

    Ich habe unter http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc06023.php ein schönes Beispiel gefunden, wie man in einem Word Doukument Text einsetzt. Sowas funktioniert aber wohl nur mit Microsoft Word? Ich habe auf meinem Rechner OpenOffice mit Writer(Word) und da funktioniert das Exe Beispiel nicht, sondern sagt OLE Error ungültige Klassenzeichenfolge.

    Gibts irgendeine andere Möglichkeit Grafiken und Text in ein Dokument einzubetten? HTML kann zwar jeder, aber dort sind Grafiken ja extern und somit nicht verwendbar. Schon traurig das es keine Alternativen zu Word gibt.



  • Hallo

    MS Office bietet diese Fernzugriffssteuerung über OLE. Ob OpenOffice auch so eine bietet weiß ich jetzt nicht, aber selbst wenn dann wäre das Interface sicher etwas anders, so das du erstmal die Doku von OpenOffice durchsehen und dein Programm anpassen müßtest. Es gibt keinen Standard für OLE-Textverarbeitung...

    Aber eventuell lohnt es sich für dich OLE ganz fallenzulassen und die jeweils neuen XML-Container-Formate von MS Office und Openoffice zu benutzen. Das sind ja bei beiden nur ZIP-gepackte XML-Dateien, die ohne Fremdsoftware (aber mit Verständniss der internen Struktur) bearbeiteten werden können. Die jeweiligen Unterschiede zwischen dem Format von MS und OO sind dann zwar noh zu beachten, aber für einfache Ausfüll-Operation wahrscheinlich nicht relevant.

    bis bald
    akari



  • Interessanter Punkt.

    Da stellen sich dann aber zwei wichtige Fragen. Zum einen wer kann dieses Format abspielen? Ich denke mal dann muss man eine aktuelle Word Version kaufen. Wer MS Word hat, wird kein OpenOffice installieren wollen.

    Gibt es eine Komponente diesbezüglich? Muss ja sicher speziellen XML Richtlinien folgen und CBuilder hat auch keine ZIP Komponente/Funktion damit man es packen kann.



  • Hallo

    Ja der Benutzer braucht natürlich ein aktuelles MS Office oder OpenOffice. Das bräuchte er aber für die Anwendung der OLE-Schnittstelle aber auch.

    Für die ZIP-Komprimierung kannst du externe portable Bibliotheken wie zlib benutzen. Auch das reine XML-Parsing kannst du mit den XML-Klassen des Builders (ab Version 6, soviel ich weiß) erledigen. Dann must du noch auf Basis der Dokumentation des Formats die XML-Nodes durchsuchen und bearbeiten.

    bis bald
    akari



  • Hallo,

    nur zur Info ein kleines Beispiel wie OO mit OLE gehen würde.

    Wahrscheinlich ist nicht alles zu 100% richtig da mit Copy und Paste erzeugt.
    Das Original funktioniert aber einwandfrei. 😃

    Variant  __fastcall TOODok::MakePropertyValue(AnsiString PropName, bool PropValue)
    {
          Variant Struct;
          Struct = ServiceManager.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
          Struct.OlePropertySet("Name",PropName.c_str());
          Struct.OlePropertySet("Value",PropValue);
          return Struct;
    }
    
    void  __fastcall TOODok::fuelleOdtFeld(Variant oDestMastersFields,AnsiString FeldName,AnsiString Wert)
    {
    
        // erzeuge interne Feldbezeichnung
    
        AnsiString fname = "com.sun.star.text.FieldMaster.User." + FeldName;
    
        // prüfe ob Feld vorhanden 
    
        Variant b = oDestMastersFields.OleFunction("hasByName",fname.c_str());
    
        // wenn ja dann füllen
    
        if ( b)
            try {
                Variant feld = oDestMastersFields.OleFunction("getByName",fname.c_str());
                if (!(VarIsEmpty(feld) || VarIsNull(feld))) {
                    feld.OlePropertySet("Content",Wert.c_str());
                }
    
            } catch (...) {
        }
    }
    
    void __fastcall TOODok::druckeDokument(AnsiString DateiName)
    {
        Variant Desktop,Document;
        Variant ServiceManager =  CreateOleObject("com.sun.star.ServiceManager");
    
        if (VarType(ServiceManager) == varDispatch)
        {
            Desktop = ServiceManager.OleFunction("createInstance","com.sun.star.frame.Desktop");
    
        	// erzeuge Variant mit den Eigenschaften beim Öffnen 
    
        	Variant VariantArray(OPENARRAY(int,(0,1)),varVariant);
        	VariantArray.PutElement(MakePropertyValue("ReadOnly",false), 0);
        	VariantArray.PutElement(MakePropertyValue("Hidden",false), 1);    	   	
    
        	if (FileExists(DateiName)) {
    
    	    DateiName.printf("file:///%s",DateiName);
    
    	// Lade Dokument	
    
    	    Document = Desktop.OleFunction("LoadComponentFromURL",
    	                                   DateiName.c_str(), "_blank", 0, VariantArray);
    
    	// Initialisiere Dokuments		
    
    	    OleVariant oDestText = Document.OleFunction("GetText");
    	    Variant oDestFields = Document.OleFunction("getTextFields");
    
    	// Holle aller Benutzerfelder des Dokuments	
    
    	    Variant oDestMastersFields = Document.OleFunction("getTextFieldMasters");
    
    	    Variant docInfo =Document.OleFunction("getDocumentInfo");
    
                fuelleOdtFeld(oDestMastersFields,"Nachname","Müller");
                .
                .
                .
                .
    
                oDestFields.OleFunction("refresh");
    
    //	    Document.OleFunction("print",VariantArray);
    
        	}
    
        }	
    
    }
    


  • Es gibt eine API für das OpenOffice Paket, kann man sich auf der HP runterladen. Sind ca. 140MB, falls ich mich recht erinnere.

    Gruß,
    Doc


Anmelden zum Antworten