Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Late Binding bei einem Word-Template
nasenkalli
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

Late Binding bei einem Word-Template

beantworten | zitieren | melden

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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von nasenkalli am .
private Nachricht | Beiträge des Benutzers
nasenkalli
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von nasenkalli am .
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Textmarken und Text

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
nasenkalli
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von nasenkalli am .
private Nachricht | Beiträge des Benutzers
Minski
myCSharp.de - Member



Dabei seit:
Beiträge: 3

beantworten | zitieren | melden

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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Minski am .
private Nachricht | Beiträge des Benutzers