Hi!
Ich brauche dringedn Hilfe, bin kanpp am verzweifeln.
Ich will aus C# in word ein bild einfügen, und zwar unbedingt mit late binding.
mit early binding ist es leicht, aber mitlate binding schaff ichs einfach nicht.
early binding gehts so:
string fileName = "d://x.bmp"; //the picture file to be inserted
Object oMissed = doc.Paragraphs[2].Range; //the position you want to insert
Object oLinkToFile = false; //default
Object oSaveWithDocument = true;//default
doc.InlineShapes.AddPicture(fieldName, ref oLinkToFile, ref oSaveWithDocument, ref oMissed);
aber mit late binding schaff ich es einfach nicht das range object zu bekommen. kann immer nur am anfang einfügen! so hab ichs versucht, aber kommt eine exception:
object para = wordDocument.GetType().InvokeMember("get_Item", BindingFlags.GetProperty, null, wordDocument, new object[1] {2});
wirft nur eine exception.
Wäre super wenn mit wer helfen könnte. im netz find ich NUR early binding beispiele.
danke!
Hi!
Die Exception lautet:
Unbekannter Name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))
Auch wenn Item wie eine normale Property aussieht, ist es keine. So funktioniert es:
// 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 });
Hallo!
Hab grade gesehen, ich hab vorher den falschen code fürs late binding gepostet, aber fehlermeldung bleibt gleich:
*/das wordDocument hol ich ordnungsgemäß und funktioniert auch, dann hol ich das paragraphs objekt:*/
object para = wordDocument.GetType().InvokeMember("Paragraphs", BindingFlags.GetProperty, null, wordDocument, null);
//das geht nocht
/*aber dann will ich ein range objekt aus dem paragraphs array holen, in early binding sag ich einfach paragraphs[2], das geht bei late binduing sowieso nicht, aber folgendes leider auch nciht: */
object range = para.GetType().InvokeMember("get_Item", BindingFlags.GetProperty, null, para, new object[1] { 2 });
/*hier fliegt die exception: Unbekannter Name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) */
Ich vermut mal es ist ne einfache sache wenn mans weiß, aber ich komm nicht drauf...
Danke für Eure Hilfe!
Danke Rainbird, du bist der Beste!
Werd das gleich mal probieren!
Hallo!
Das von rainbird gepostete funktioniert super!
Ohne euch überstrapazieren zu wollen, vielleicht kann mir noch jemand sagen, ob ich vielleicht ein range objekt irgendwie auch über eine suche im dokument bekommen kann.
also in pseudcode meine ich das so:
range = document.find("§§§MYPLACEHOLDER§§§");
wie ich sowas mit text ersetze habe ich schon herausen, aber ich bekomme dabei kein range objekt, das ich fürs einfügen eines bildes verwenden könnte...
danke!
Es gibt auch ne Edit Funktion, 3 Beiträge hintereinander müssen nicht sein! Danke
Baka wa shinanakya naoranai.
Mein XING Profil.
Du kannst Dir vom Document ein Range-Objekt zurückgeben lassen in dem Du Start und Ende angibst. Mit Start und Ende sind jeweils Zeichenpositionen (also z.B. das 4561te Zeichen) gemeint.
Ich möchte Dir allerdings ans Herz legen, die Bilder nicht per Zeichenfolgenposition oder per "3ter Absatz von links" einzufügen. Verwende lieber XML-Tags zum festlegen der Bildposition. Oder Textmarken (wobei ich persönlich Textmarken nicht mag; Ist rein subjektiv). Dann kommen die Bilder auch dann noch an die richtige Stelle, wenn der Benutzer das Dokument verändert.
Hm, hatte mich damit schon kurz beschäftigt, aber irgendwie ist es mir auch nicht so recht gelungen via late binding eine textmarke zurückzubekommen bzw. wie kann ich die dann verwenden um das bild einzufügen, da brauch ich doch ein range objekt, oder?
Bin was word anbindungen und besonders late binding betrifft leider ein rookie.
danke.
Späte Bindung ist ganz leicht, wenn man folgende Regeln beherzigt:
*Aufrufe verketten geht nicht (Für jeden Punkt immer ein eigener InvokeMember-Aufruf)
*Original-Namen verwenden und nicht die COM-Wrapper-Namen (Es heißt z.B. Item und nicht get_Item)
*BindingFlags.OptionalParameterBinding immer verwenden, wenn Methoden optionale Parameter haben
Hallo!
Danke für die Hilfe!
Ich hab mittlerweile auch festgestellt, dass es eigentlich nicht schwierig ist, wenn man sich etwas Zeit nimmt und eben genau das beachtet, was du gepostet hast.