使用 Open XML SDK 2.0 检索 Excel 2010 工作簿中所有命名区域的字典

Office 可视操作方法

**摘要:**使用 Open XML SDK 2.0 中的强类型类可检索包含 Excel 工作簿中定义的所有名称的名称和范围的字典,而无需将该文档加载到 Microsoft Excel 中。

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

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

**发布时间:**2010 年 10 月

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

概述

利用 Open XML 文件格式,可以检索有关 Excel 工作簿中定义的名称的信息,但执行此操作需要做一些工作。Open XML SDK 2.0 添加了可简化对 Open XML 文件格式的访问的强类型类:SDK 简化了检索任务,尤其是简化了检索每个工作簿保留的已定义名称的列表的任务。此直观操作方法附带的代码示例将介绍如何使用 SDK 来实现这个目标。

编码

此直观操作方法附带的示例包含一些代码,这些代码是检索包含与 Excel 2007(或更高版本)中定义的每个名称有关的信息的字典所必需的。在该字典中,每个项的键均包含范围的名称,而值将包含范围本身的字符串表示形式。例如,图 1 显示了循环访问示例工作簿的结果字典的内容所获得的结果。以下各节将为您介绍该代码。

图 1. 运行示例代码来显示字典内容。

命令行

设置引用

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

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

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

此外,将以下 using/Imports 语句添加到代码文件的顶部。

Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

检查过程

XLGetDefinedNames 过程接受一个参数,该参数指示要从中检索目录的文档的名称(字符串)。此过程将返回一个 Dictionary 实例,其中包含与指定工作簿中定义的名称有关的信息,如果不存在定义的名称,则该实例可能为空。

Public Function XLGetDefinedNames(
  ByVal fileName As String) As Dictionary(Of String, String)
public static Dictionary<String, String> 
  XLGetDefinedNames(String fileName)

此过程将检查您指定的工作簿,并查找包含定义的名称的部分。如果该部分存在,则此过程将循环访问其所有内容,并将每个定义的名称的名称和值添加到返回的字典中。示例中的调用代码将循环访问该字典,并显示每个项中的键和值。

Dim result = XLGetDefinedNames("C:\temp\definednames.xlsx")
For Each dn In result
  Console.WriteLine("{0}: {1}", dn.Key, dn.Value)
Next
var result = XLGetDefinedNames(@"C:\temp\definednames.xlsx");
foreach (var dn in result)
  Console.WriteLine("{0} {1}", dn.Key, dn.Value);

访问文档

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

Dim returnValue As New Dictionary(Of String, String)
' Code removed here…
Return returnValue
var returnValue = new Dictionary<String, String>();
// Code removed here…
return returnValue;

然后,代码将使用 SpreadsheetDocument.Open 方法打开工作簿,并指示应打开此工作簿以供只读访问(最后的 false 参数)。在打开工作簿的情况下,代码将使用 WorkbookPart 属性导航到主工作簿部分。代码将在一个名为 wbPart 的变量中存储此引用。

Using document As SpreadsheetDocument = 
  SpreadsheetDocument.Open(fileName, False)
  Dim wbPart As WorkbookPart = document.WorkbookPart
  ' Code removed here…
End Using
using (SpreadsheetDocument document = 
  SpreadsheetDocument.Open(fileName, false))
{
  var wbPart = document.WorkbookPart;
  // Code removed here.
}

检索定义的名称

在提供工作簿部分的情况下,下一个步骤将十分简单 - 代码首先会使用 wbPart 变量的 Workbook 属性,然后检索由 Open XML SDK 2.0 提供的 DefinedNames 集合。此属性将返回一个工作簿中包含的所有定义的名称的集合。如果此属性返回一个非 Null 值,则代码将循环访问该集合,并检索有关每个命名部分的信息,同时为每个定义的名称将键(名称)和值(范围说明)添加到字典中。

Dim definedNames = wbPart.Workbook.DefinedNames
If definedNames IsNot Nothing Then
  For Each dn As DefinedName In definedNames
    returnValue.Add(dn.Name.Value, dn.Text)
  Next
End If
DefinedNames definedNames = wbPart.Workbook.DefinedNames;
if (definedNames != null)
{
  foreach (DefinedName dn in definedNames)
    returnValue.Add(dn.Name.Value, dn.Text);
}

示例过程

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

Public Function XLGetDefinedNames(
  ByVal fileName As String) As Dictionary(Of String, String)

  ' Given a workbook name, return a dictionary of defined names.
  ' The pairs include the range name and a string 
  ' representing the range.

  Dim returnValue As New Dictionary(Of String, String)
  Using document As SpreadsheetDocument =
    SpreadsheetDocument.Open(fileName, False)
    Dim wbPart As WorkbookPart = document.WorkbookPart

    Dim definedNames = wbPart.Workbook.DefinedNames
    If definedNames IsNot Nothing Then
      For Each dn As DefinedName In definedNames
        returnValue.Add(dn.Name.Value, dn.Text)
      Next
    End If
  End Using
  Return returnValue
End Function
public static Dictionary<String, String> 
  XLGetDefinedNames(String fileName)
{
  // Given a workbook name, return a dictionary of defined names.
  // The pairs include the range name and a string 
  // representing the range.

  var returnValue = new Dictionary<String, String>();
    using (SpreadsheetDocument document = 
    SpreadsheetDocument.Open(fileName, false))
  {
    var wbPart = document.WorkbookPart;
    DefinedNames definedNames = wbPart.Workbook.DefinedNames;
    if (definedNames != null)
    {
      foreach (DefinedName dn in definedNames)
        returnValue.Add(dn.Name.Value, dn.Text);
    }
  }
  return returnValue;
}
读取

此直观操作方法附带的示例演示了一些代码,这些代码将检索包含有关 Excel 工作簿中定义的名称的信息的字典。若要使用该示例,必须安装 Open XML SDK 2.0(可通过"浏览"一节中列出的链接获得)。该示例还将使用作为 Open XML SDK 2.0 代码段集的一部分包含的修改后的代码。"浏览"一节还包括指向完整代码段集的链接,但您无需下载并安装代码段即可使用该示例。

若要了解示例代码执行的操作,则使用 Open XML SDK 2.0 Productivity Tool for Microsoft Office(作为 Open XML SDK 2.0 的一部分包含)检查工作簿内容会很有用。图 2 演示了一个已在此工具中打开的示例工作簿,该工作簿包含多个定义的名称。示例代码将检索对工作簿部分的引用,并将在该部分中查找 definedNames 元素,该元素为工作簿中每个定义的名称包含一个子元素。

图 2. 打开示例工作簿并查找 definedNames 元素。

Open XML SDK 2.0 生产力工具

Open XML SDK 2.0 通过使用工作簿的 DefinedNames 属性返回定义的名称的集合。当然,您可以在不使用 SDK 的情况下检索相同的信息,但使用 SDK 的强类型成员执行此操作会更为轻松。

示例应用程序仅演示了在检索有关工作簿的信息时可与之交互的由 Open XML SDK 2.0 提供的几个可用属性和方法。有关详细信息,请参阅 Open XML SDK 2.0 Productivity Tool 附带的文档:单击应用程序窗口左下角的"Open XML SDK 文档"选项卡,并搜索要研究的类。在给定此处显示的示例和文档的情况下,您将能够成功修改示例应用程序。

观看

观看视频

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

单击以获取代码

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

浏览

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