【问题标题】:OpenXML - Bullet Points get transformed to numbered list when merging documentsOpenXML - 合并文档时项目符号点被转换为编号列表
【发布时间】:2016-11-25 15:17:51
【问题描述】:

我有两个文档要部分合并。

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

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) - 更喜欢一种不太复杂的方法来复制元素并希望有一个:-)

有什么想法吗?

【问题讨论】:

    标签: c# ms-word format openxml


    【解决方案1】:

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

    我从源代码的NumberingDefinitions(在编号部分中)复制了必要的内容(段落中有numPr)。通过查找numIdnumPr 到目标文件。

    我将num 元素和对应的abstractNum 元素克隆到目标。为此,我还替换了 ID(使用目标中的现有元素 ID 全部加 1),例如 numIdabstractNumIdnsid(十六进制值),以确保不会发生任何冲突。

    有点工作,但非常可行。

    【讨论】:

    • 顺便说一句:我强烈建议使用 OpenXML PowerTools 来合并文档(使用 DocumentBuilder 类)。使用 PowerTools,您不必再次发明轮子...
    猜你喜欢
    • 2010-12-28
    • 2015-12-20
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多