OpenXML - 项目符号点在合并文档时转换为编号列表

OpenXML - Bullet Points get transformed to numbered list when merging documents

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

我从文档 A 中取出一些位于 RTF 内容控件中的部分,然后使用 AppendChild 和 CloneNode(真)(深度克隆):

foreach (var srcChildElement in sourceDocumentSdtContentBlockNode.ChildElements)
{
    targetSdtContentBlock.AppendChild(srcChildElement.CloneNode(true);
}

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

为什么克隆后的样式与源样式不同?我认为它会保持它的风格,因为我不操纵它。在文档 B 中,似乎也没有格式问题。我可以毫无问题地手动插入项目符号或编号列表。

我什至创建了两个全新的 word 文档并且发生了同样的事情,所以肯定不是现有文件的问题。

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

有什么想法吗?

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

从来源的NumberingDefinitions(在NumberingPart)我复制了必要的(段落中有一个numPr)。通过查找 numPr.

numId 到目标文件

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

有点工作但非常可行。