Vba MS Word:如何解决Range.WordOpenXML/Range.InsertXML中的bug?

Vba MS Word:如何解决Range.WordOpenXML/Range.InsertXML中的bug?,vba,ms-word,vsto,office-interop,office-automation,Vba,Ms Word,Vsto,Office Interop,Office Automation,Range.WordOpenXML似乎适合获取某个范围内的任意单词内容,应该可以使用Range.InsertXML将其还原为原始形式 这通常是可行的,但在某些情况下会失败:恢复的内容与原始内容不同。见下面的例子。VBA和.NET互操作/VSTO中都会出现问题 有人知道是否有更好的、真正可靠的方法来保存和恢复内容吗 或者你能告诉我们如何解决当前的奇怪行为吗?从我们的角度来看,这些行为都是错误的 提前感谢, J.K 演示问题的最简单方法是VBA: 私有openXml作为字符串 公共子初始化() T

Range.WordOpenXML似乎适合获取某个范围内的任意单词内容,应该可以使用Range.InsertXML将其还原为原始形式

这通常是可行的,但在某些情况下会失败:恢复的内容与原始内容不同。见下面的例子。VBA和.NET互操作/VSTO中都会出现问题

有人知道是否有更好的、真正可靠的方法来保存和恢复内容吗

或者你能告诉我们如何解决当前的奇怪行为吗?从我们的角度来看,这些行为都是错误的

提前感谢,

J.K


演示问题的最简单方法是VBA:

私有openXml作为字符串
公共子初始化()
ThisDocument.ContentControls.Add wdContentControlRichText
端接头
公共子测试()
openXml=ThisDocument.ContentControls(1).Range.WordOpenXML
'ContentControl的内容现在保存在openXML中。
'在对内容控件进行可能的中间操作后,我们将稍后
'要还原原始内容:
ThisDocument.ContentControls(1).Range.InsertXML openXml
端接头
如何复制:将代码复制到空的.docm文件中。运行
Initialize()
添加RichText内容控件。将内容和/或格式添加到内容控件,如下所述。然后运行
Test()
保存和恢复内容控件的内容。最后将恢复的内容与原始内容进行比较


不可靠的例子:

(1) 包含单个段落(包括终止段落分隔符)的RichText ContentControl(“CC”):检索到的WordOpenXML等于从包含单个段落(不包含段落分隔符)的CC中获取的WordOpenXML。结果并不奇怪:在这两种情况下,Range.InsertXML之后都不会恢复段落中断。换句话说:如果原始内容包含段落分隔符,WordOpenXML无法提取正确的XML

(2) 包含单个图像(没有其他图像)的CC在没有图像的情况下恢复,即与原始图像不同。但是,如果它包含的内容超过图像,则不存在此类问题

(3) 如果从未访问过页眉部分,则前面的示例适用。至少在VBA中——我没有使用VSTO/interop进行深入检查——一旦将插入位置设置到页眉中,行为就会改变:恢复的内容总是包含最后一个段落分隔符,即使原始内容没有。保存和重新打开文档不会让Word忘记(仅仅)访问页眉,这显然触发了这种奇怪的行为


(4) 如果内容控件末尾的文本格式设置为居中、右对齐或完全对齐,则在恢复时会添加额外的段落分隔符。当您返回默认的左对齐方式时,这种行为就会消失。

您是否查看了有关添加设置的存储信息?@Bouryepes:“添加设置”的确切含义是什么?你认为有哪些信息?如果是内容控件的内容:问题不在于存储位置,而在于数据的正确检索和恢复。Thanx用于澄清。