使用签名ID打开XML文档ContentControls问题

时间:2010-04-22 18:47:48

标签: ms-word interop openxml word-contentcontrol

我有一个使用内容控件生成Open XML文档的应用程序。

要创建新的内容控件,我使用Interop和方法ContentControls.Add。此方法返回添加的内容控件的实例。

我有一些逻辑可以保存内容控件的ID以便稍后引用它,但在某些计算机中我遇到了一个奇怪的问题。

当我访问刚刚创建的Content Control的ID属性时,它返回一个带有数字id的字符串,问题是当这个值太大时,我保存文档后,如果我查看 document.xml ,<w:id/>元素的<w:sdtPr/>元素具有负值,即我从Id得到的值的等效符号生成的控件的属性。

例如:

var contentControl = ContentControls.Add(...);
var contentControlId = contentControl.ID;
// the value of contentControlId is "3440157266"

如果我保存文档并在Package Explorer中打开它,则内容控件的Id为“-854810030”而不是“3440157266”。

我发现了什么:

((int)uint.Parse("3440157266")).ToString()  returns "-854810030"

知道为什么会这样吗?此问题很难复制,因为我不控制生成的控件的IdId由Interop库自动生成。

3 个答案:

答案 0 :(得分:1)

以32位二进制格式显示时,-854810030和3440157266是一样的!

答案 1 :(得分:0)

MSDN documentation of the ContentControl.ID Property

中提到了问题
  

在运行时获取ID属性值时,它将作为无符号值返回。但是,当保存为Office Open XML文件格式时,它将保存为签名值。如果您的解决方案尝试将以编程方式返回的值映射到以文件格式保存的值,则必须检查从此属性获取的值的未签名和签名版本。

正如Claude Martel所提到的,-854810030和3440157266是同一性的。您可以通过将已签名的Int32转换为未签名的UInt32

来轻松进行检查
var id = Convert.ToInt32("-854810030 ");
UInt32 uId = (uint) id;

Assert.AreEqual(3440157266, uId);

答案 2 :(得分:-1)

我过去曾遇到过同样类型的问题。身份证不可靠,因为它似乎没有长期存在。我所做的是存储了内容控件.Tag的名称,以便我以后可以访问它。