OpenXML - 在合并文档时,子弹点转换为编号列表

时间:2016-11-25 15:17:51

标签: c# ms-word format openxml

我有两个文档尝试部分合并。

我从文档A中获取一些位于RTF内容控件中的部分,并使用AppendChild和CloneNode(true)将内容控件的open selection的所有子元素复制到文档B中的另一个sdtContent (深度克隆):

sdtContent

问题是,如果我的源文档A中的内容(列表项)使用项目符号点格式化,则文档B中的结果将被编号为列表项。

当我克隆它时,为什么不是源代码中的结果样式?我认为它会保持它的风格,因为我不操纵它。在文档B中似乎也没有格式化问题。我可以手动插入项目符号或编号列表。

我甚至创建了两个完整的新单词文档,并且发生了相同的事情,因此现有文件肯定不会出现问题。

更新 我发现文档中有一个单独的编号定义(https://msdn.microsoft.com/en-us/library/office/ee922775(v=office.14).aspx),它不是我复制的节点的一部分。当我克隆节点时,此信息不包含在其中,它位于单独的编号定义中。有没有办法将节点复制到新文档并告诉它保留编号定义中的编号样式?另一种选择是手动检查克隆节点是否包含foreach (var srcChildElement in sourceDocumentSdtContentBlockNode.ChildElements) { targetSdtContentBlock.AppendChild(srcChildElement.CloneNode(true); } 元素,如果是,也提取定义(包括更改和重新分配ID) - 更喜欢复制元素的复杂方法,希望是一个: - )

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好吧,我确实设法解决了这个问题。如前所述,编号信息存储在单独的部分(或文档zip内的文件)中: https://msdn.microsoft.com/en-us/library/office/ee922775(v=office.14).aspx

从源代码的NumberingDefinitions(在NumberingPart中)我复制了必要的内容(段落中有numPr)。通过查找numId的{​​{1}}来查看目标文件。

我将numPr元素以及相应的num元素克隆到目标。这样做我还替换了ID(使用目标中现有的元素ID递增1),如abstractNumnumIdabstractNumId(十六进制值),以确保不会任何冲突。

有点工作,但非常可行。