从包中获取文档部件的内容

本主题演示如何使用 Open XML SDK for Office 中的类以编程方式检索 Wordprocessing 文档中文档部件的内容。


包和文档部件

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


获取 WordprocessingDocument 对象

该代码首先打开包文件,方法是将文件名传递给一个重载 Open 的方法 (Visual Basic .NET Shared 方法或 C# 静态方法) WordprocessingDocument 类,该类采用字符串和布尔值,该值指定是否应在读/写模式下打开文件。 在这种情况下,布尔值 false 指定应以只读模式打开文件,以避免意外更改。

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))

在 v3.0.0+ 中, Close() 已删除 方法,转而依赖于 using 语句。 它确保在 Dispose() 到达右大括号时自动调用 方法。 using 语句后面的块为 using 语句中创建或指定的对象设定范围。 WordprocessingDocument由于 Open XML SDK 中的 类会自动保存并关闭对象作为其IDisposable实现的一using部分,并且由于Dispose()在退出块时会自动调用,因此无需显式调用 Save()Dispose() ,只要使用 语句。


WordProcessingML 文档的结构

文档的基本文档结构WordProcessingML由 和 body 元素组成document,后跟一个或多个块级元素(例如 p表示段落)。 段落包含一个或多个 r 元素。 r代表 run,它是具有一组通用属性(如格式设置)的文本区域。 运行包含一个或多个 t 元素。 元素 t 包含文本范围。 下面的代码示例演示 WordprocessingML 包含文本“示例文本”的文档的标记。

    <w:document xmlns:w="http://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 强类型类创建文档结构和内容。 可以在 命名空间中找到 这些类。 下表列出了对应于 、、bodyrpt 元素的类的document类名。

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

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


Comments 元素

在本操作方法中,您将处理注释。 因此,熟悉 元素的结构 <comments/> 非常有用。 ISO/IEC 29500(该链接可能指向英文页面) 规范中的以下信息在处理此元素时会很有用。

此元素指定当前文档中定义的所有注释。 它是 WordprocessingML 文档注释部分的根元素。对于 WordprocessingML 文档中注释部分的内容,请考虑以下 WordprocessingML 片段:

    <w:comments>
      <w:comment … >
        …
      </w:comment>
    </w:comments>

在此示例中, comments 元素包含此文档指定的单个注释。

© ISO/IEC 29500:2016

以下 XML 架构片段定义此元素的内容。

    <complexType name="CT_Comments">
       <sequence>
           <element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
       </sequence>
    </complexType>

示例代码的工作方式

打开源文件进行读取后,可以通过实例化 MainDocumentPart来创建mainPart对象。 然后,可以创建对 WordprocessingCommentsPart 文档部分的引用。

static string GetCommentsFromDocument(string document)
{
    string? comments = null;

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
    {
        if (wordDoc is null)
        {
            throw new ArgumentNullException(nameof(wordDoc));
        }

        MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
        WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart ?? mainPart.AddNewPart<WordprocessingCommentsPart>();

然后,可以使用 对象 StreamReader 来读取文档部分 WordprocessingCommentsPart 的内容并返回其内容。

    using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
    {
        comments = streamReader.ReadToEnd();
    }
}

return comments;

示例代码

以下代码检索文档包中包含的WordProcessing部件WordprocessingCommentsPart的内容。 可以通过调用 方法运行程序, GetCommentsFromDocument 如以下示例所示。

string document = args[0];
GetCommentsFromDocument(document);

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

static string GetCommentsFromDocument(string document)
{
    string? comments = null;

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
    {
        if (wordDoc is null)
        {
            throw new ArgumentNullException(nameof(wordDoc));
        }

        MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
        WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart ?? mainPart.AddNewPart<WordprocessingCommentsPart>();

        using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
        {
            comments = streamReader.ReadToEnd();
        }
    }

    return comments;
}

另请参阅

Open XML SDK 类库参考