有没有办法分配Id';s到Open XML SDK 2.5中的段落

本文关键字:SDK XML Open 段落 分配 Id 有没有 | 更新日期: 2023-09-27 18:28:21

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

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

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

提前感谢!

有没有办法分配Id';s到Open XML SDK 2.5中的段落

Content Controls(std)就是为此而设计的,尽管我不确定设计者是否考虑过"瞄准"文档中的每一段。。。

早在2003/2007年,就可以在Word文档中添加自定义XML标记,这正是您想要的。但微软在2009年左右的一次专利诉讼中败诉,不得不撤回该功能。因此,内容控件实际上是您唯一的好选择。

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

好的,我做了一个小的研究,你可以用严格的OpenXML来做,但只有在你用Word打开文件之前。Word将删除它无法读取的所有内容。

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

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