问题描述
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 (将#修改为@)