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