利用 Open XML 文件格式,可以检索有关 Excel 工作簿中定义的名称的信息,但执行此操作需要做一些工作。Open XML SDK 2.0 添加了可简化对 Open XML 文件格式的访问的强类型类:SDK 简化了检索任务,尤其是简化了检索每个工作簿保留的已定义名称的列表的任务。此直观操作方法附带的代码示例将介绍如何使用 SDK 来实现这个目标。
此直观操作方法附带的示例包含一些代码,这些代码是检索包含与 Excel 2007(或更高版本)中定义的每个名称有关的信息的字典所必需的。在该字典中,每个项的键均包含范围的名称,而值将包含范围本身的字符串表示形式。例如,图 1 显示了循环访问示例工作簿的结果字典的内容所获得的结果。以下各节将为您介绍该代码。
图 1. 运行示例代码来显示字典内容。
设置引用
若要使用 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 通过使用工作簿的 DefinedNames 属性返回定义的名称的集合。当然,您可以在不使用 SDK 的情况下检索相同的信息,但使用 SDK 的强类型成员执行此操作会更为轻松。
示例应用程序仅演示了在检索有关工作簿的信息时可与之交互的由 Open XML SDK 2.0 提供的几个可用属性和方法。有关详细信息,请参阅 Open XML SDK 2.0 Productivity Tool 附带的文档:单击应用程序窗口左下角的"Open XML SDK 文档"选项卡,并搜索要研究的类。在给定此处显示的示例和文档的情况下,您将能够成功修改示例应用程序。 |