虽然可利用 Open XML 文件格式检索并修改 Word 文档中的内容块,但执行此操作需要做一些工作。Open XML SDK 2.0 添加了将简化对 Open XML 文件格式的访问的强类型类:SDK 将简化要处理的任务,例如,页眉和页脚部分以及文档中的对这些部分的引用。此直观操作方法附带的代码示例演示了如何使用 SDK 删除所有页眉和页脚部分以及主文档部分中对这些部分的引用,而无需在 Microsoft Word 中打开文档。
此直观操作方法附带的示例包括删除 Word 2007 或 Word 2010 文档中的所有页眉和页脚消息所需的代码。以下各节将详细介绍这些代码。您将发现,仅删除文档存储中的页眉和页脚部分是不够的,您还必须删除文档内的对这些部分的引用。该示例代码演示了操作中的两个步骤。
设置引用
若要使用 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 文档"选项卡,并搜索要研究的类。尽管文档当前并不总是包含代码示例,但借助此处所示的示例和文档,您应能够成功修改示例应用程序。 |