将新文档部件添加到包中

本主题演示如何使用 Open XML SDK for Office 中的类以编程方式将文档部件 (文件) 添加到字处理文档中。

包和文档部件

Open XML 文档以包的形式存储,其格式由 ISO/IEC 29500-2(该链接可能指向英文页面) 定义。 包可以具有多个彼此之间存在关系的部件。 部件之间的关系控制文档的类别。 如果文档的包关系项包含与主文档部件的关系,可将文档定义为字处理文档。 如果文档的包关系项包含与演示文稿部件的关系,可将文档定义为演示文稿文档。 如果文档的包关系项包含与工作簿部件的关系,可将文档定义为电子表格文档。 在本操作方法主题中,您将使用字处理文档包。

获取 WordprocessingDocument 对象

该代码首先打开包文件,方法是将文件名传递给 DocumentFormat.OpenXml.Packaging.WordprocessingDocument 的重载 Open () 方法之一,该方法采用字符串和布尔值,该值指定是应打开文件进行编辑还是进行只读访问。 在此示例中,布尔值为 true,指定应以读/写模式打开文件。

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        // Insert other code here.
    }

using 语句提供典型 .Create, .Save, .Close 序列的建议备选序列。 它确保在遇到右大括号时会自动调用 Dispose 方法(Open XML SDK 用来清理资源的内部方法)。 using 语句后面的块为 using 语句中创建或指定的对象设定范围,在此示例中这个范围就是 wordDoc。 因为 Open XML SDK 中的 WordprocessingDocument 类会自动保存并关闭对象作为其 System.IDisposable 实现的一部分,并且因为在退出块时会自动调用 Dispose 方法;无需显式调用 Save and Close,只要使用

WordProcessingML 文档的结构

WordProcessingML 文档的基本文档结构由 documentbody 元素组成,后跟一个或多个块级元素,如表示段落的 p。 一个段落包含一个或多个 r 元素。 r 代表一段连续文本,它是具有一组共同属性(如格式设置)的文本区域。 一段连续文本包含一个或多个 t 元素。 t 元素包含一个文本区域。 以下代码示例显示包含文本"Example text."的文档的 WordprocessingML 标记。

    <w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:t>Example text.</w:t>
          </w:r>
        </w:p>
      </w:body>
    </w:document>

使用 Open XML SDK,可以使用与 WordprocessingML 元素对应的强类型类创建文档结构和内容。 这些类可在 DocumentFormat.OpenXml.Wordprocessing 命名空间中找到。 下表列出了 documentbodyprt 元素所对应类的类名称。

WordprocessingML 元素 Open XML SDK 类 说明
document Document 主文档部件的根元素
body Body 块级结构(如段落、表格、批注和 ISO/IEC 29500 规范中指定的其他项)的容器。
p Paragraph 段落。
r Run 一段连续文本。
t Text 文本范围。

有关 WordprocessingML 文档的各个部分和元素的整体结构的详细信息,请参阅 WordprocessingML 文档的结构

示例代码的工作原理

打开文档进行编辑后,在 using 语句中,该代码创建对 MainDocumentPart 部件的引用作为 WordprocessingDocument 对象并添加一个新的自定义 XML 部件。 然后,该代码读取包含自定义 XML 的外部文件的内容,并将其写入 CustomXmlPart 部件。

注意

[!注释] 若要使用文档中的新文档部件,请在新部件的关系部件中添加指向该文档部件的链接。

    MainDocumentPart mainPart = wordDoc.MainDocumentPart;
    CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

    using (FileStream stream = new FileStream(fileName, FileMode.Open))
    {
        myXmlPart.FeedData(stream);
    }

示例代码

下面的代码添加一个包含外部文件中的自定义 XML 的新文档部件,然后填充该部件。 若要在程序中调用 AddCustomXmlPart 方法,请使用以下示例修改文件“myPkg2.docx”,方法是向其添加新的文档部件。

    string document = @"C:\Users\Public\Documents\myPkg2.docx";
    string fileName = @"C:\Users\Public\Documents\myXML.xml";
    AddNewPart(document, fileName);

注意

[!注释] 在运行程序之前,将 Word 文件扩展名由 .docx 更改为 .zip,并查看 zip 文件的内容。 然后,再将扩展名重新更改为 .docx 并运行程序。 运行程序后,再将文件扩展名更改为 .zip 并查看其内容。 你将看到名为“customXML”的额外文件夹。此文件夹包含表示所添加部件的 XML 文件

以下是使用 C# 和 Visual Basic 编写的完整示例代码。


using DocumentFormat.OpenXml.Packaging;
using System.IO;

AddNewPart(args[0], args[1]);

// To add a new document part to a package.
static void AddNewPart(string document, string fileName)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();

        CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

        using (FileStream stream = new FileStream(fileName, FileMode.Open))
        {
            myXmlPart.FeedData(stream);
        }
    }
}