Freitag, 17. Dezember 2010

Eine ContentControl Id ist eine Id ist nicht immer die gleiche Id

Heute wäre ich fast wieder auf eine kleine, alte Nicklichkeit von Word und dem OpenXml hereingefallen…
Innerhalb von Word habe ich ein Inhaltssteuerelement angelegt und dessen interne Id ermittelt. Diese wird von der Word API als String bereitgehalten. Die MSDN Auskunft dazu ist eindeutig:
Returns a String that represents the identification for a content control. Read-only.
Diese Id wird nun intern von uns als Zahl weiterverarbeitet. – Soweit kein Problem. Aus

long id = long.Parse(contentControl.Id);

erhalte ich die Id 2857609749.

Jetzt musste ich aber anhand dieser Id das Inhaltssteuerelement in der document.xml ermitteln. Zu meiner ersten großen Überraschung war aber keines mit dieser Id zu finden?! Nach etwas Suchen stellte sich heraus, dass das Inhaltssteuerelement anscheinend unter der Id –1437357547 in dem Dokument abgelegt war.

Innerhalb der Word API wird anscheinend die Darstellung als unsigned Wert, also ohne negative Vorzeichen bevorzugt, während innerhalb der Dokumentstruktur auch negative Vorzeichen verwendet werden.

Es bleibe also nichts andere übrig, als zwischen den verschiedenen Darstellungen zu konvertieren.

In meinem Fall lag der String-Wert ohnehin schon als long vor. Daher konnte ich folgenden Aufruf nutzen, um den Word API Wert, in den zu der document.xml zu konvertieren:

long ccid = Convert.ToInt64((int)id);

Der umgekehrte Weg, von der Darstellung aus der document.xml in den von Word bevorzugten Wert erfolgt dann folgendermaßen:

long ccid = Convert.ToInt64((uint)id);

Oder mit noch etwas mehr Konvertierungsaufwand lassen sich die Werte direkt aus dem String-Wert konvertieren:

long ccid = Convert.ToInt64((uint)long.Parse(contentControl.Id));

… Das bietet sicherlich auch noch Optimierungspotential…

Kick It on dotnet-kicks.de