使用 Open XML SDK 2.0 从 Word 2010 文档中提取样式

Office 可视操作方法

**摘要:**使用 Open XML SDK 2.0 中的强类型类可从 Microsoft Word 文档中检索包含样式或 stylesWithEffects 部分的 XDocument 实例,而无需将该文档加载到 Word 中。

上次修改时间: 2015年3月9日

适用范围: Excel 2010 | Office 2010 | Office client | Open XML | PowerPoint 2010 | VBA | Word 2010

**发布时间:**2011 年 2 月

**供稿人:**Ken Getz,MCW Technologies, LLC(该链接可能指向英文页面)

概述

虽然可利用 Open XML 文件格式检索 Microsoft Word 文档中的内容快,但执行此操作需要做一些工作。Open XML SDK 2.0 添加了将简化对 Open XML 文件格式的访问的强类型类:SDK 将简化检索任务,例如,检索包含文档样式或 stylesWithEffects 部分的 XDocument 实例。在给定 XML 内容的情况下,您可以对信息进行存档、修改并重新应用信息或将信息应用于新文档。此直观操作方法附带的代码示例将介绍如何使用 SDK 检索样式或 stylesWithEffects 部分 - 该代码示例中并未介绍如何将样式应用于新文档。

编码

此直观操作方法附带的示例将包含检索 Word 2007 或 Word 2010 文档的样式或 stylesWithEffects 部分的 XDocument 实例所需的代码。以下各节详细介绍了该代码。请注意,在 Word 2007 中创建的文档只有一个 styles 部分;Word 2010 添加了第二个 stylesWithEffects 部分。为了使文档能够在 Word 2010 和 Word 2007 之间来回转换,Word 2010 保留了原始 styles 部分和新 styles 部分。Open XML 规范需要 Microsoft Word 忽略它无法识别的部分;Word 2007 无法识别由 Word 2010 添加到文档的 stylesWithEffects 部分。应用程序必须对检索样式或 stylesWithEffects 部分所获得的结果进行解释。

设置引用

若要使用 Open XML SDK 2.0 中的代码,您必须向您的项目添加几个引用。虽然示例项目已包含这些引用,但您需要在您的代码中显式引用以下程序集:

  • WindowsBase - 可以根据您创建的项目的类型为您设置此引用。

  • DocumentFormat.OpenXml - 由 Open XML SDK 2.0 安装。

您还应将下面的 using/Imports 语句添加到代码文件的顶部。

Imports System.IO
Imports System.Xml
Imports DocumentFormat.OpenXml.Packaging
using System;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using DocumentFormat.OpenXml.Packaging;

检查过程

WDExtractStyles 过程接受两个参数:第一个参数包含一个指示要修改的文件路径的字符串,第二个参数指示是要检索 styles 部分还是更新的 stylesWithEffects 部分(实际上,您需要对 Word 2010 文档调用此过程两次,以便检索这两个部分)。此过程将返回一个 XDocument 实例,该实例包含您请求的完整 styles 或 stylesWithEffects 部分以及文档的所有样式信息(或一个空引用,如果您情况的部分不存在)。

Public Function WDExtractStyles(
  ByVal fileName As String,
  Optional ByVal getStylesWithEffectsPart As Boolean = True) 
  As XDocument
Public static XDocument WDExtractStyles(
  string fileName, 
  bool getStylesWithEffectsPart = true)

此过程将检查您指定的文档,并查找指定的 styles 或 stylesWithEffects 部分。如果该部分存在,则此过程会将其作为 XDocument 实例返回。若要调用此过程,请传递参数值,如示例代码中所示。在您运行示例代码之前,请务必提供一个名为 C:\temp\StylesFrom.docx 的文档,该文档(用于演示)包含一些示例已修改的样式。

Dim styles = WDExtractStyles("C:\Temp\StylesFrom.docx", True)
If styles IsNot Nothing Then
  Console.WriteLine(styles.ToString())
End If
var styles = WDExtractStyles(@"C:\temp\StylesFrom.docx", true);
if (styles != null)
  Console.WriteLine(styles.ToString());

访问文档

该代码首先会创建一个名为 styles 的变量,此过程在退出之前将返回该变量。

Dim styles As XDocument = Nothing
' Code removed here…
Return styles
XDocument styles = null;
// Code removed here…
return styles;

接下来,该代码将使用 WordprocessingDocument.Open 方法打开文档,并指示应打开此文档以供只读访问(最后的 false 参数)。在打开文档的情况下,该代码将使用 MainDocumentPart 属性导航到主文档,然后准备一个名为 stylesPart 的变量来保存对 styles 部分的引用。

Using document = WordprocessingDocument.Open(fileName, False)
  Dim docPart = document.MainDocumentPart
  Dim stylesPart As StylesPart = Nothing
  ' Code removed here…
End Using
using (var document = WordprocessingDocument.Open(fileName, false))
{
  var docPart = document.MainDocumentPart;

  var stylesPart = null;
  // Code removed here…
}

查找正确的 Styles 部分

接下来,该代码将使用 setStylesWithEffectsPart 布尔参数来检索对请求的 styles 部分的引用。然后,该代码将基于此值检索 docPart 变量的特定属性,并将其存储在 stylesPart 变量中。

If getStylesWithEffectsPart Then
  stylesPart = docPart.StylesWithEffectsPart
Else
  stylesPart = docPart.StyleDefinitionsPart
End If
if (getStylesWithEffectsPart)
  stylesPart = docPart.StylesWithEffectsPart;
else
  stylesPart = docPart.StyleDefinitionsPart;

检索部分内容

如果请求的 styles 部分存在,则该代码必须该部分在 XDocument 实例中的完整内容。每个部分均提供一个用于返回 Stream 的 GetStream 方法。该代码会将 Stream 实例传递给 XmlNodeReader.Create 方法,然后调用 XDocument.Load 方法,并将 XmlNodeReader 作为参数传递。在使用 XDocuments 和 Open XML 部分时,此系列步骤很常见。您会发现它们很常用。

If stylesPart IsNot Nothing Then
  Using reader = XmlNodeReader.Create(
    stylesPart.GetStream(FileMode.Open, FileAccess.Read))
    ' Create the XDocument:
    styles = XDocument.Load(reader)
  End Using
End If
if (stylesPart != null)
{
  using (var reader = XmlNodeReader.Create(
    stylesPart.GetStream(FileMode.Open, FileAccess.Read)))
  {
    // Create the XDocument:
    styles = XDocument.Load(reader);
  }
}

示例过程

下面的代码示例包含完整的示例过程。

Public Function WDExtractStyles(
  ByVal fileName As String,
  Optional ByVal getStylesWithEffectsPart As Boolean = True) 
  As XDocument

  Dim styles As XDocument = Nothing

  Using document = WordprocessingDocument.Open(fileName, False)
    Dim docPart = document.MainDocumentPart
    Dim stylesPart As StylesPart = Nothing

    If getStylesWithEffectsPart Then
      stylesPart = docPart.StylesWithEffectsPart
    Else
      stylesPart = docPart.StyleDefinitionsPart
    End If
    If stylesPart IsNot Nothing Then
      Using reader = XmlNodeReader.Create(
        stylesPart.GetStream(FileMode.Open, FileAccess.Read))
        ' Create the XDocument:
        styles = XDocument.Load(reader)
      End Using
    End If
  End Using
  Return styles
End Function
public static XDocument WDExtractStyles(
  string fileName, 
  bool getStylesWithEffectsPart = true)
{
  XDocument styles = null;
 
  using (var document = WordprocessingDocument.Open(fileName, false))
  {
    var docPart = document.MainDocumentPart;
 
    StylesPart stylesPart = null;
    if (getStylesWithEffectsPart)
      stylesPart = docPart.StylesWithEffectsPart;
    else
      stylesPart = docPart.StyleDefinitionsPart;
 
    if (stylesPart != null)
    {
      using (var reader = XmlNodeReader.Create(
        stylesPart.GetStream(FileMode.Open, FileAccess.Read)))
      {
        // Create the XDocument:
        styles = XDocument.Load(reader);
      }
    }
  }
  return styles;
}
读取

此直观操作方法附带的示例演示了将检索 Word 文档中的 styles 或 stylesWithEffects 部分的代码。若要使用该示例,请安装 Open XML SDK 2.0(可通过"浏览"一节中列出的链接获得)。该示例还将使用作为 Open XML SDK 2.0 代码段集的一部分包含的修改后的代码。"浏览"一节还包括指向完整代码段集的链接,但您无需下载并安装代码段即可使用该示例。

示例应用程序仅演示了在修改文档结构时可与之交互的由 Open XML SDK 2.0 提供的几个可用属性和方法。有关详细信息,请查看 Open XML SDK 2.0 Productivity Tool 附带的文档:单击应用程序窗口左下角的"Open XML SDK 文档"选项卡,搜索要研究的类。尽管文档并不总是包含代码示例,但借助此处所示的示例和文档,您应能够成功修改示例应用程序。

观看

观看视频

观看视频(该链接可能指向英文页面) | 时长:00:07:52

单击以获取代码

获取代码(该链接可能指向英文页面)

浏览

关于作者

Ken Getz 是 MCW Technologies 的高级顾问。他是 ASP.NET Developers Jumpstart(《ASP.NET 开发人员入门》,Addison-Wesley,2002)、Access Developer's Handbook(《Access 开发人员手册》, Sybex,2001)和 VBA Developer's Handbook, 2nd Edition(《VBA 开发人员手册第 2 版》,Sybex,2001)的合著者。