MS-Word:如何解决 Range.WordOpenXML / Range.InsertXML 中的错误?

问题描述

Range.WordOpenXML 似乎适合获取 Range 的任意 Word 内容,并且应该可以使用 Range.InsertXML 将其恢复为原始形式。

这通常有效,但在某些情况下会失败:恢复的内容与原始内容不同。请参阅下面的示例。在 VBA 和 .NET interop / VSTO 中都会出现问题。

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

或者您能告诉我们如何解决当前在我们看来是错误的奇怪行为吗?

提前致谢,

J.K


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

Private openXml As String

Public Sub Initialize()
  ThisDocument.ContentControls.Add wdContentControlRichText
End Sub

Public Sub test()
  openXml = ThisDocument.ContentControls(1).Range.WordOpenXML
  ' The ContentControl's contents Now are saved in openXML.
  
  ' After a possible intermediate manipulation of the content control we later
  ' want to restore the original contents:
  ThisDocument.ContentControls(1).Range.InsertXML openXml
End Sub

如何复制:将代码复制到空的 .docm 中。运行 Initialize()添加 RichText 内容控件。将内容和/或格式添加内容控件,如下所示。然后运行 ​​test() 以保存和恢复内容控件的内容。最后将恢复的内容与原始内容进行比较。


不可靠的例子:

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

(2) 在没有图像的情况下恢复包含单个图像(并且没有其他任何内容)的 CC,即与原始图像不同。但是,如果它包含的不仅仅是图像,则没有这样的问题。

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)