有什么方法可以将 Id 分配给 Open XML SDK 2.5 中的段落?

Is there any way to assign Id's to paragraphs in Open XML SDK 2.5?

我正在开发一个必须使用 Office Open XML SDK 2.5 创建 word 文档的应用程序。我现在的想法是,我将从一个空主体的模板开始(因此我已经定义了所有名称空间等),然后向其中添加 Paragraphs。如果我需要图像,我将添加 ImageParts 并尝试为 ImagePart 提供包含图像的预定义段落部分中的 ID。我会将段落作为 xml 存储在数据库中,获取我需要的段落,如果需要,填充 in/modify 一些值并将它们插入到我的 word 文档中。但这是棘手的部分,我怎样才能轻松地以某种方式插入它们,这样我就不必查询它们的内容以便稍后找到其中一个段落?换句话说,我需要 Id。我有一些选择:

  1. 对于每个可能的段落,手动创建一个 SdtBlock。此 SdtBlock 将具有一个与数据库中每个段落的 ID 相匹配的 ID。虽然这看起来像很多手动工作,但我宁愿能够更轻松地创建未来的 word 文档...... 我选择了这种方法,但我插入了 Building Blocks,它可以存储在具有特定标记名的模板中。
  2. 创建段落,从开发者工具中复制xml,然后手动添加一个ParagraphId。不过,这似乎更像是一场噩梦,因为对于未来的每个新段落,我都必须创建新的 Id 等。而且不可能插入表格,因为没有办法 (afaik) 给那些 Id。
  3. 使用书签来了解在何处插入数据。我也不太喜欢这个,因为每个人都可以看到书签。我知道我可以替换它们,但是我没有办法在以后识别各个段落。
  4. **** 我的数据库,只需在模板中添加所有内容 :D 通过删除书签及其内容来删除我不需要的段落。这个想法似乎是最糟糕的,因为我不想依赖于一个包含我需要生成的每个单词文件的所有可能内容的模板文件。

任何有 OpenXml 经验的人都知道哪种方法最好?也许还有另一种更好的方法,我完全忽略了?理想的解决方案是我可以在 Office Word 中添加 ID,但这是不行的,因为我还没有找到任何可以这样做的方法。

提前致谢!

好的,我做了一个小调查,您可以在严格的 OpenXML 中进行,但只能在您在 Word 中打开文件之前进行。 Word 将删除它无法读取的所有内容。

using (WordprocessingDocument document = WordprocessingDocument.Open(path, true)) {
    document.MainDocumentPart.Document.Body.Ancestors().First()
       .SetAttribute(new OpenXmlAttribute() {
           LocalName = "someIdName",
           Value = "111" });
}

例如,我将属性 "someIdName" 设置为某个随机元素,该属性在 OpenXML 中不存在。您可以在任何地方设置它并将其用作 id

内容控件 (std) 就是为此而设计的,尽管我不确定设计者是否考虑过 "targeting" 文档中的每一段...

在 2003/2007 年的日子里,可以将自定义 XML mark-up 添加到 Word 文档,这正是您正在寻找的。但微软在 2009 年左右输掉了一场专利诉讼,不得不取消该功能。所以内容控件真的是你唯一的好选择。

您的方法可能会与 BuildingBlocks 概念相结合。 BuildingBlocks 是作为有效 Word Open XML 存储在 Word 模板文件中的 Word 内容。它们可以分配到 "galleries" 并进行分类。有一个 BuildingBlock 类型的内容控件,它可以与特定的画廊和类别相关联,这可能在一定程度上帮助您,并且可以替代将内容存储在数据库中。