使用 Open XML SDK 2.0 删除 Word 2010 文档中的页眉和页脚

Office 可视操作方法

**摘要:**使用 Open XML SDK 2.0 中的强类型类可删除 Microsoft Word 文档中的页眉和页脚,而无需将该文档加载到 Word 中。

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

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

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

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

概述

虽然可利用 Open XML 文件格式检索并修改 Word 文档中的内容块,但执行此操作需要做一些工作。Open XML SDK 2.0 添加了将简化对 Open XML 文件格式的访问的强类型类:SDK 将简化要处理的任务,例如,页眉和页脚部分以及文档中的对这些部分的引用。此直观操作方法附带的代码示例演示了如何使用 SDK 删除所有页眉和页脚部分以及主文档部分中对这些部分的引用,而无需在 Microsoft Word 中打开文档。

编码

此直观操作方法附带的示例包括删除 Word 2007 或 Word 2010 文档中的所有页眉和页脚消息所需的代码。以下各节将详细介绍这些代码。您将发现,仅删除文档存储中的页眉和页脚部分是不够的,您还必须删除文档内的对这些部分的引用。该示例代码演示了操作中的两个步骤。

设置引用

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

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

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

还应将下面的 using/Imports 语句包含在代码文件的开头。

Imports System.Linq
Imports DocumentFormat.OpenXml.Wordprocessing
Imports DocumentFormat.OpenXml.Packaging
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

检查过程

WDDeleteHeadersAndFooters 过程接受一个参数(一个指示要修改的文件的路径的字符串)。

Public Sub WDDeleteHeadersAndFooters(ByVal docName As String)
public static void WDRemoveHeadersFooters(string docName)

此过程使用您指定的文档,并删除所有页眉和页脚部分以及对这些部分的引用。若要调用此过程,请传递所需的参数值,如示例代码中所示。确认您提供了一个名为 C:\temp\Headers.docx 的文档,该文档包含某些特定的页眉和页脚。

访问文档

该代码首先会使用 WordprocessingDocument.Open 方法打开文档,并指示应打开此文档以供读/写访问(最后的 true 参数)。在打开文档的情况下,该代码将使用 MainDocumentPart 属性导航到主文档,并将该引用存储到一个名为 docPart 的变量中。

Using wdDoc = WordprocessingDocument.Open(docName, True)
  Dim docPart = wdDoc.MainDocumentPart
  ' Code removed here…
End Using
using (WordprocessingDocument 
  wdDoc = WordprocessingDocument.Open(docName, true))
{
  var docPart = wdDoc.MainDocumentPart;
  // Code removed here…
}

确认页眉/页脚是否存在

在提供对文档部分的引用的情况下,该代码紧接着将确定是否有要执行的操作 - 即,该文档是否包含页眉和页脚。为了进行此确定,该代码将同时调用文档部分的 HeaderParts 和 FooterParts 属性的 Count 方法,如果任一调用返回的值大于 0,则该代码将继续运行。请注意,HeaderParts 和 FooterParts 属性各自将返回 HeaderPart 或 FooterPart 对象的 IEnumerable。

If (docPart.HeaderParts.Count > 0) Or
 (docPart.FooterParts.Count > 0) Then
  ' Code removed here…

End If
if (docPart.HeaderParts.Count() > 0 || docPart.FooterParts.Count() > 0)
{
  // Code removed here…
}

删除页眉和页脚部分

在给定对页眉和页脚部分的一组引用的情况下,您可以编写代码来删除各个引用,但由于 Open XML SDK 2.0 的原因,此操作不是必需的。相反,您可以调用 MainDocumentPart.DeleteParts 方法,并传入要删除的部分集。此方法提供了删除部分集的快捷方式。因此,以下两个代码行将代替您在其他情况下必须自行编写的循环。

docPart.DeleteParts(docPart.HeaderParts)
docPart.DeleteParts(docPart.FooterParts)
docPart.DeleteParts(docPart.HeaderParts);
docPart.DeleteParts(docPart.FooterParts);

使用文档内容

此时,该代码已删除页眉和页脚部分,但它在文档内容中保留了对这些部分的孤立引用。该代码在进行更改之前,将检索对文档内容(即,文档部分中包含的 XML 内容)的引用,并在此操作后保存内容。该代码将删除这两个代码行之间的必要引用。

Dim doc As Document = docPart.Document
' Code removed here…
doc.Save()
Document doc = docPart.Document;
// Code removed here…
doc.Save();

删除页眉和页脚引用

作为其最后一个步骤,该代码首先会检索 HeaderReference 元素的集合,再将该集合转换为列表,然后循环访问对其找到的每个元素调用 Remove 方法的集合。请注意以下两点:该代码会将 Descendants 属性返回的 IEnumerable 转换为列表,以便能删除该列表中的项;可利用 Open XML SDK 2.0 所提供的 HeaderReference 类型轻松引用 XML 内容中的 HeaderReference 类型的元素。在未获得额外帮助的情况下,您必须直接使用 XML 内容的详细信息。该代码在删除所有页眉后,将对页脚元素重复此操作。

Dim headers = _
  doc.Descendants(Of HeaderReference).ToList()
For Each header In headers
  header.Remove()
Next

Dim footers = _
  doc.Descendants(Of FooterReference).ToList()
For Each footer In footers
  footer.Remove()
Next
var headers =
  doc.Descendants<HeaderReference>().ToList();
foreach (var header in headers)
{
  header.Remove();
}

var footers =
  doc.Descendants<FooterReference>().ToList();
foreach (var footer in footers)
{
  footer.Remove();
}

示例过程

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

Public Sub WDDeleteHeadersAndFooters(ByVal docName As String)
  ' Given a document name, remove all headers and footers.
  Using wdDoc = WordprocessingDocument.Open(docName, True)
    Dim docPart = wdDoc.MainDocumentPart
    If (docPart.HeaderParts.Count > 0) Or
      (docPart.FooterParts.Count > 0) Then

      docPart.DeleteParts(docPart.HeaderParts)
      docPart.DeleteParts(docPart.FooterParts)

      ' Remove references to the headers and footers.
      Dim doc As Document = docPart.Document

      ' Remove references to the headers and footers.
      ' This requires digging into the XML content
      ' of the document:

      Dim headers = _
        doc.Descendants(Of HeaderReference).ToList()
      For Each header In headers
        header.Remove()
      Next

      Dim footers = _
        doc.Descendants(Of FooterReference).ToList()
      For Each footer In footers
        footer.Remove()
      Next

      doc.Save()
    End If
  End Using
End Sub
public static void WDRemoveHeadersFooters(string docName)
{
  // Given a document name, remove all headers and footers.
  using (WordprocessingDocument wdDoc = 
    WordprocessingDocument.Open(docName, true))
  {
    var docPart = wdDoc.MainDocumentPart;
    if (docPart.HeaderParts.Count() > 0 || 
        docPart.FooterParts.Count() > 0)
    {
      // Remove header and footer parts.
      docPart.DeleteParts(docPart.HeaderParts);
      docPart.DeleteParts(docPart.FooterParts);

      Document doc = docPart.Document;

      // Remove references to the headers and footers.
      // This requires digging into the XML content
      // of the document:
      var headers =
        doc.Descendants<HeaderReference>().ToList();
      foreach (var header in headers)
      {
        header.Remove();
      }

      var footers =
        doc.Descendants<FooterReference>().ToList();
      foreach (var footer in footers)
      {
        footer.Remove();
      }
      doc.Save();
    }
  }
}
读取

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

如果运行此直观操作方法中的示例代码,请先打开包含页眉和/或页脚信息的文档,您将发现在运行代码后,文档中的所有页眉和页脚都已被删除。利用此方法,您可以修改文档内容而无需在 Microsoft Word 中打开文档。

若要了解示例代码执行的操作,则使用 Open XML SDK 2.0 Productivity Tool for Microsoft Office(作为 Open XML SDK 2.0 的一部分包含)检查文档内容会很有用。图 1 演示了一个已在此工具中打开的示例文档,该文档包含多个页眉和页脚部分。该示例代码将检索对文档部分的引用,在提供该部分的情况下,将检索所有关联的页眉和页脚部分的集合。

图 1. 打开示例文档并查找页眉和页脚部分

定位页眉和页脚部件

该代码在删除页眉和页脚部分后,将查找对这些部分的所有引用并将其删除。为此,该代码必须检查文档部分的内容,如图 2 所示。

图 2. 在文档部分中查找页眉和页脚引用

定位页眉和页脚引用

在提供包含对页眉和页脚部分的引用的 XML 元素列表的情况下,该代码将删除所有这些引用。

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

观看

观看视频

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

单击以获取代码

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

浏览

关于作者
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)的合著者。