Laden...

Aus Word 2003 per COM einzelnes Mergefield auslesen

Erstellt von Cratsh vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.453 Views
Hinweis von herbivore vor 13 Jahren

Abgeteilt von Allgemeiner COM-Wrapper für Späte Bindung

C
Cratsh Themenstarter:in
4 Beiträge seit 2008
vor 13 Jahren
Aus Word 2003 per COM einzelnes Mergefield auslesen

Ich buddel mal das alte Thema raus, ist ja noch ein FAQ.
Ich hab ein Projekt, welches diverse Office Versionen ab 2003 unterstützen soll. Daher habe ich nun mit Reflection gearbeitet und das funktioniert auch soweit, aber bei Word hab ich da ein Problem gefunden.
Ich lade ein Template (dot) und dieses enthält Mergefields.
über die Dokument.Fields habe ich diese zwar im Zugriff und ich kann auch die korrekte Menge auslesen, aber ich schaffe es einfach nicht auf jedes einzelne Field zuzugreifen.
Ich habs über GetEnumerator versucht, aber komme damit nicht an das entsprechende Ziel, vielleicht hat ja jemand eine Idee für mich.

C
Cratsh Themenstarter:in
4 Beiträge seit 2008
vor 13 Jahren

Zur Info:
Ich hab nicht gewusst, dass die PIAs abwärtskompatibel sind und konnte das auch nirgends so richtig rauslesen. Also meine Software läuft auch mit anderen (neueren) Officeversionen, vondaher ist die Frage zwar nicht hinfällig aber es wäre auch nicht tragisch wenns keiner beantworten kann. (Mich interessiert die Antwort natürlich trotzdem)

61 Beiträge seit 2009
vor 13 Jahren

Genau dasselbe habe ich vor kurzem gemacht.

Unter der Verwendung des Com-Wrapper von Rainbird habe ich ein Word-Dokument geöffnet und alle Formularfelder (oder auch Mergefields) ausgelesen und ausgewertet.

Dank des Com-Wrapper läuft es sogar auf Office 2007 (habe es auf einen PC mit Office 2003 entwickelt).

Mein Vorgehen
Jedoch bin ich ohne Enumeration dadurch gegangen.
Ich habe die Document.Fields als ComObject ausgelesen.
Dann eine For-Schleife gebaut.
Als Hochwert habe ich den Wert aus Fields über den Com-Wrapper von Count genommen.
Anschließend habe ich nur die Aufrufe über Fields.Item(int index) oder Fields.get_Item(int index) gemacht. Ich würde beim Com-Wrapper beides mal probieren.

In der Zeit vor fünf Minuten ist Jetzt die Zukunft. Jetzt ist die Gegenwart. Die Zeit, in der ich zu erzählen begonnen habe, ist die Vergangenheit von Jetzt und die Zukunft von der Gegenwart der Zeit, fünf Minuten bevor ich zu erzählen begann.

C
Cratsh Themenstarter:in
4 Beiträge seit 2008
vor 13 Jahren

Aber du hast die ComObjekte dann in der Forschleife gecastet in Fields oder?
Wie hast du sonst das Fields.get_Item ausgeführt?

Also wie gesagt mit der PIA von 2003 läuft mein Projekt auch ohne Comwrapper mit Office 2010.

61 Beiträge seit 2009
vor 13 Jahren

Aber du hast die ComObjekte dann in der Forschleife gecastet in Fields oder?
Wie hast du sonst das Fields.get_Item ausgeführt?

Also wie gesagt mit der PIA von 2003 läuft mein Projekt auch ohne Comwrapper mit Office 2010.

Wenn man den Com-Wrapper verwendet macht es ja keinen Sinn das ganze noch zu Casten. Dann könnte ich ja gleich die Objeke des PIA-Bibliothek benutzen.
Am besten ich zeige mal wie ich das gelöst habe...

Mein Code sieht (ungefähr) so aus:


ComObject mergeFields = null;
ComObject mergeField = null;
try
{
     mergeFields = document.GetObjectReturningProperty("Fields");
     int count = (int)mergeFields.GetProperty("Count");
     for (int i = 0; i < count; i++)
     {
          mergeField = mergeFields.GetObjectReturningFunction("Item", i);

          // ... Code mit dem Field-Objekt
     }
}
finally
{
     if(mergeFields != null)
          mergeFields.Dispose();
     if(mergeField != null)
          mergeField.Dispose();
}

In der Zeit vor fünf Minuten ist Jetzt die Zukunft. Jetzt ist die Gegenwart. Die Zeit, in der ich zu erzählen begonnen habe, ist die Vergangenheit von Jetzt und die Zukunft von der Gegenwart der Zeit, fünf Minuten bevor ich zu erzählen begann.