Laden...

Late Binding bei einem Word-Template

Erstellt von nasenkalli vor 15 Jahren Letzter Beitrag vor 12 Jahren 4.367 Views
N
nasenkalli Themenstarter:in
23 Beiträge seit 2007
vor 15 Jahren
Late Binding bei einem Word-Template

Hallo Leute,

ich versuche gerade ein Word-Template mit Late Binding zu füllen.
Ein Teil des Template besteht aus einer Tabelle.
Nun möchte ich bestimmte Zellen mit Inhalt füllen.
Wie mach ich das und wie springe ich zu den einzelnen Zellen?
Folgenden Code habe ich bisher dazu geschrieben:


strDokument = @"\\EntsprechendesVerzeichnis\\Vorlage.dot"
object objApp_Late;
object objDocument_Late;
object objDocuments_Late;
object objActive_Late;
object[] Parameters = {};
object[] objFalse = new object[1];
objFalse[0] =true;

Type objClassType; 
objClassType = Type.GetTypeFromProgID("Word.Application"); 
objApp_Late = Activator.CreateInstance(objClassType);

objDocuments_Late = objApp_Late.GetType().InvokeMember( "Documents", 
BindingFlags.GetProperty, null, objApp_Late, Parameters );
						objDocuments_Late.GetType().InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, objDocuments_Late, new object[] {strDokument} );
						objDocuments_Late.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, objApp_Late,objFalse);

objDocument_Late = objDocuments_Late.GetType().InvokeMember( "Open", 
BindingFlags.InvokeMethod, null, objDocuments_Late, new object[]  strDokument});

objActive_Late = objDocument_Late.GetType().InvokeMember( "ActiveWindow",
BindingFlags.GetProperty, null, objDocument_Late, null );


Nun möchte ich die einzelnen Zellen, mit Inhalt füllen,
weiß aber nicht wie.
Ich hoffe ihr könnt mir weiterhelfen.
Danke euch.

Schöne Grüße

N
nasenkalli Themenstarter:in
23 Beiträge seit 2007
vor 15 Jahren

OK, hab mich nochmal intensiv die Suche genutzt und den folgenden Thread von Rainbird umgesetzt:
http://www.mycsharp.de/wbb2/thread.php?threadid=26520

Funktioniert auch soweit ganz gut.
Jetzt hab ich aber noch folgende Fragen:
1.Wie kann ich zu einer Textmarke springen?
2.Hier ist das Beispiel mit einem Bild gemacht, wie heißt den der zugehörige Member für Text?

// Laufende Word-Instanz holen
object word = Marshal.GetActiveObject("Word.Application");

// Metadaten von Word.Application abrufen
Type wordType=word.GetType();

// Dateiname festlegen
string fileName = @"C:\test.bmp";

// Aktuelles Dokument abrufen
object document = wordType.InvokeMember("ActiveDocument", BindingFlags.GetProperty, null, word, new object[0]);

// Absätz-Auflistung des Dokuemnts abrufen
object paragraphs=document.GetType().InvokeMember("Paragraphs",BindingFlags.GetProperty,null,document,new object[0]);

// 2. Absatz des Dokuments abrufen
object secondPara = paragraphs.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, paragraphs, new object[1] { 2 });

// Range des Absatzes abrufen
object range = secondPara.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, secondPara, new object[0]);

// Variablen für übrige ref-Parameter erzeugen            
object linkToFile = false;
object saveWithDocument = true;

// Bilder-Auflistung des Dokuemnts abrufen
object shapes = document.GetType().InvokeMember("InlineShapes", BindingFlags.GetProperty, null, document, new object[0]);

// Bild zufügen
shapes.GetType().InvokeMember("AddPicture", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, shapes, new object[4] { fileName, linkToFile, saveWithDocument, range });

Danke.

3.728 Beiträge seit 2005
vor 15 Jahren
Textmarken und Text

Hallo nasenkalli,

um zu einer Textmarke zu springen, verwendest Du die Goto-Methode des Document-Objekts. Für den Parameter "What" musst Du -1 (entspricht wdGotoBookmark) angeben und für den Parameter "Name" den Namen der Textmarke.

Text wird in Word hauptsächlich in Absätzen (Paragraphs) verwaltet. Du navigierst einfach zu der Stelle, an die Du Text schreiben möchtest (z.B. zu einer Textmarke) und verwendest dann die TypeText-Methode des Selection-Objekts.

Kennst Du den Marko-Recorder von Word?
Kennst Du die fantastische umfangreiche VBA-Hilfe von Word?

Diese beiden sollten Deine ständigen Begleiter sein, wenn Du Automatisierung über Reflection betreiben willst.

N
nasenkalli Themenstarter:in
23 Beiträge seit 2007
vor 15 Jahren

Hallo Rainbird,

habe deine Antwort erst jetzt gesehen und versuche es umzusetzen.
Werde mich melden wenn es geklappt hat.
Den Makrorecorder hab ich kaum genutzt bisher, genausowenig die VBA-Hilfe
muss ich zu meiner Schande gestehen.

Gruß
nasenkalli

M
3 Beiträge seit 2012
vor 12 Jahren

Hallo...ich klinke mich mal in den Thread ein (ist zwar schon alt), habe nämlich genau das gleiche Problem

im early binding läuft es ja so ab:

object Bookmark = (int)Microsoft.Office.Interop.Word.WdGoToItem.wdGoToBookmark;
 oWord.Selection.GoTo(ref Bookmark, ref missing, ref missing, ref NameBookMark);

und im late Binding auch mit der GoTo Methode wie Rainbird schon geschrieben hat, aber da bekomme ich immer Fehler, mein Code:


            Type comType = Type.GetTypeFromProgID("Word.Application");
            object word = Activator.CreateInstance(comType);

            word.GetType().InvokeMember("Visible", BindingFlags.OptionalParamBinding | BindingFlags.SetProperty, null, word, new object[1] { true });

            // Dateiname festlegen
            string template1 = @"C:\\Users\\Template.dot";

            // Aktuelles Dokument abrufen
            object documents = wordType.InvokeMember("Documents", BindingFlags.GetProperty, null, word, new object[0]);

            object document = documents.GetType().InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, documents,  new object[1]  {template1});    

             



// -> hier ist das Problem

             document.GetType().InvokeMember("Goto", BindingFlags.SetProperty | BindingFlags.OptionalParamBinding, null, document, new object[2] { -1, "Title" });
//oder 
//           object oMissing = System.Reflection.Missing.Value;
//           document.GetType().InvokeMember("Goto", BindingFlags.SetProperty | BindingFlags.OptionalParamBinding, null, document, new object[4] { -1,oMissing ,oMissing,  "Title" });
    
// ->


              object selection = wordType.InvokeMember("Selection", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, word, new object[0]);
              selection.GetType().InvokeMember("TypeText", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, selection, new object[1] { "Text hier " });
       

Fehler:

Ein Aufrufziel hat einen Ausnahmefehler verursacht.

Bist du da weiter gekommen Nasenkalli?

grüße, Christian

EDIT:
hab es hin bekommen mit


selection.GetType().InvokeMember("Goto", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, selection, new object[4] { -1, oMissing, oMissing, "Picture" });
selection.GetType().InvokeMember("TypeText", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, selection, new object[1] { "Text hier " });

Dann schreibt er den Text an den richtigen Textmarker