学习C#调用OpenXml操作word文档的基本用法(23:学习术语表管理类)

OpenXml中使用GlossaryDocumentPart类集中管理Word文档中所有的文档构建基块内容,适合用来存储合同中的可选条款、信函中的标准段落、公司信头或签名等各类需要重复使用的内容。采用解压缩软件打开Word模板文档(word文档中没有找到在哪里),其内的word\glossary文件夹中的document.xml文件保存通过程序插入的基块内容,如下图所示。

  MainDocumentPart类的GlossaryDocumentPart属性保存基块信息集合,其类型为GlossaryDocumentPart,该类型的GlossaryDocument属性的DocParts属性保存具体数据集合,集合中的数据类型主要为DocPart,命名空间为DocumentFormat.OpenXml.Wordprocessing。
  DocPart类代表术语表文档条目,其DocPartBody属性保存术语表文档条目的内容,DocPartProperties属性保存术语表文档条目属性,后者类型为DocPartProperties,其主要属性如下表所示:

序号 名称 说明
1 DocPartName 条目名称
2 StyleId 关联的段落样式名称
3 Category 条目分类
4 DocPartTypes 条目类型
5 Behaviors 条目插入行为
6 Description 条目的说明
7 DocPartId 条目 ID

下面的示例代码用于向word模板文件写入基块信息。虽然也能向word文档中写入基块信息,但在word文档的构建基块管理器中看不到插入的数据,向word模板中写入基块信息,再基于模板生成word文档,这样在模板和word文件的构建基块管理器内都能看到插入的数据,如下面截图所示:

csharp 复制代码
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(txtFilePath.Text, true))
{
    MainDocumentPart mainPart = wordDoc.MainDocumentPart;

    GlossaryDocumentPart glossaryPart = wordDoc.MainDocumentPart?.GlossaryDocumentPart;

    if (glossaryPart == null)
    {
        glossaryPart = mainPart.AddNewPart<GlossaryDocumentPart>();
        glossaryPart.GlossaryDocument = new GlossaryDocument();
    }

    DocPart docPart = new DocPart();

    // 设置构建基块的属性 (docPartPr)
    DocPartProperties docPartPr = new DocPartProperties();
    docPartPr.DocPartName = new DocPartName() { Val = "测试通用基块" }; 
    docPartPr.Category = new Category() { Gallery = new Gallery() { Val = DocPartGalleryValues.AutoText }, Name = new Name() { Val = "General" } };
    docPartPr.DocPartTypes=new DocPartTypes() { All = new OnOffValue { Value = true } };
    docPartPr.Description = new Description() { Val = "测试" };            

    Behavior behavior = new Behavior();
    behavior.Val = DocPartBehaviorValues.Content; // 常用选项
    docPartPr.Behaviors = new Behaviors();
    docPartPr.Behaviors.AddChild(behavior);

    docPart.AppendChild(docPartPr);

    // 定义构建基块的内容
    DocPartBody docPartBody = new DocPartBody(
        new DocumentFormat.OpenXml.Wordprocessing.Paragraph(
            new Run(new Text("这是测试通用基块的内容。"))
        )
    );
    docPart.AppendChild(docPartBody);

    // 将构建基块添加到 GlossaryDocumentPart中
    glossaryPart.GlossaryDocument.DocParts.AppendChild(docPart);

    wordDoc.Save();
}

下面的代码用于读取word文档中的基块信息,不过只能读到用程序插入的基块信息,暂时不清楚如何读取内置的基块信息。

csharp 复制代码
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(txtFilePath.Text, false))
{
    GlossaryDocumentPart glossaryPart = wordDoc.MainDocumentPart?.GlossaryDocumentPart;

    if (glossaryPart == null)
    {
        return;
    }

    GlossaryDocument glossaryDoc = glossaryPart.GlossaryDocument;
    DocParts docParts = glossaryDoc?.DocParts;

    if (docParts == null || !docParts.HasChildren)
    {
        return;
    }

    foreach (DocPart docPart in docParts.Elements<DocPart>())
    {
        DocPartProperties properties = docPart.DocPartProperties;
        if (properties == null)
        {                        
            continue;
        }

        ListViewItem item = new ListViewItem(Convert.ToString(lstBlocks.Items.Count + 1));
        item.SubItems.Add(properties.DocPartName?.Val);
        item.SubItems.Add(properties.Category?.Name?.Val);
        item.SubItems.Add(properties.Description?.Val);

        lstBlocks.Items.Add(item);
    }
}

参考文献

1\]https://github.com/dotnet/Open-XML-SDK \[2\]https://learn.microsoft.com/zh-cn/office/open-xml/open-xml-sdk \[3\]https://learn.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.wordprocessing.style?view=openxml-3.0.1 \[4\]https://blog.csdn.net/i042416/article/details/126228816

相关推荐
gc_22993 个月前
学习C#调用OpenXml操作word文档的基本用法(21:学习嵌入对象类)
c#·word·openxml·ole
gc_22993 个月前
学习C#调用OpenXml操作word文档的基本用法(20:学习嵌入文件类)
c#·word·openxml·嵌入文档
gc_22993 个月前
学习C#调用OpenXml操作word文档的基本用法(19:学习文档页脚类)
c#·word·openxml·页脚·footerpart
gc_22993 个月前
学习C#调用OpenXml操作word文档的基本用法(18:学习文档页眉类)
c#·word·openxml·页眉·headerpart
gc_22993 个月前
学习C#调用OpenXml操作word文档的基本用法(17:学习文档图片类)
c#·word·图片·openxml
gc_22994 个月前
学习C#调用OpenXml操作word文档的基本用法(16:学习文档脚注类)
word·openxml·脚注
gc_22994 个月前
学习C#调用OpenXml操作word文档的基本用法(15:学习文档主题类)
word·主题·openxml
gc_22994 个月前
学习C#调用OpenXml操作word文档的基本用法(14:学习文档编号定义类)
word·openxml·编号定义
gc_22994 个月前
学习C#调用OpenXml操作word文档的基本用法(13:学习文档设置类)
word·openxml·文档设置