如何:从 Open XML 包中获取工作表信息
上次修改时间: 2010年10月14日
适用范围: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
本文内容
创建 SpreadsheetDocument 对象
SpreadsheetML 的基本结构
示例代码的工作方式
示例代码
本主题演示如何使用 Open XML SDK 2.0 for Microsoft Office 中的类以编程方式从电子表格文档中的工作表中检索信息。
编译本主题中的代码需要使用以下程序集指令。
using System;
using DocumentFormat.OpenXml.Packaging;
using S = DocumentFormat.OpenXml.Spreadsheet.Sheets;
using E = DocumentFormat.OpenXml.OpenXmlElement;
using A = DocumentFormat.OpenXml.OpenXmlAttribute;
Imports System
Imports DocumentFormat.OpenXml.Packaging
Imports S = DocumentFormat.OpenXml.Spreadsheet.Sheets
Imports E = DocumentFormat.OpenXml.OpenXmlElement
Imports A = DocumentFormat.OpenXml.OpenXmlAttribute
创建 SpreadsheetDocument 对象
在 Open XML SDK 中,SpreadsheetDocument 类表示 Excel 文档包。若要创建 Excel 文档,请创建 SpreadsheetDocument 类的一个实例并用部件填充该实例。该文档至少必须具有一个充当文档容器的工作簿部件和至少一个工作表部件。在此包中,将使用 SpreadsheetML 标记将文本表示为 XML 形式。
若要从文档中创建类实例,请调用 Open() 方法之一。在此示例中,您必须打开文件以进行只读访问。因此,您可以使用 Open(String, Boolean) 方法,并将布尔参数设置为 false。
以下代码示例调用 Open 方法以打开由 filepath 指定的文件进行只读访问。
// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
' Open file as read-only.
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, False)
using 语句提供典型 .Open, .Save, .Close 序列的建议备选序列。它确保在遇到右大括号时会自动调用 Dispose 方法(Open XML SDK 用来清理资源的内部方法)。using 语句后面的块为 using 语句中创建或指定的对象设定范围,在此示例中这个范围就是 mySpreadsheet。
SpreadsheetML 的基本结构
SpreadsheetML 文档的基本文档结构由引用 Workbook 中的工作表的 Sheets 和 Sheet 元素组成。将为每个 Worksheet 创建单独的 XML 文件。例如,具有 MySheet1 和 MySheet2 这两张工作表的工作簿的 SpreadsheetML 位于 Workbook.xml 文件中,并且显示在以下代码示例中。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<workbook xmlns=https://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheets>
<sheet name="MySheet1" sheetId="1" r:id="rId1" />
<sheet name="MySheet2" sheetId="2" r:id="rId2" />
</sheets>
</workbook>
工作表 XML 文件包含一个或多个块级元素(如 SheetData)。sheetData 表示单元格表,并且包含一个或多个 Row 元素。一个 row 包含一个或多个 Cell 元素。每个单元格包含一个表示相应单元格值的 CellValue 元素。例如,工作簿中只在单元格 A1 中具有值 100 的第一张工作表的 SpreadsheetML 位于 Sheet1.xml 文件中,并且显示在以下代码示例中。
<?xml version="1.0" encoding="UTF-8" ?>
<worksheet xmlns="https://schemas.openxmlformats.org/spreadsheetml/2006/main">
<sheetData>
<row r="1">
<c r="A1">
<v>100</v>
</c>
</row>
</sheetData>
</worksheet>
通过使用 Open XML SDK 2.0,可以使用与 SpreadsheetML 元素对应的强类型类创建文档结构和内容。可以在 DocumentFormat.OpenXML.Spreadsheet 命名空间中找到这些类。下表列出了 workbook、sheets、sheet、worksheet 和 sheetData 元素所对应类的类名称。
SpreadsheetML 元素 |
Open XML SDK 2.0 类 |
说明 |
---|---|---|
workbook |
DocumentFormat.OpenXml.Spreadsheet.Workbook |
主文档部件的根元素。 |
sheets |
DocumentFormat.OpenXml.Spreadsheet.Sheets |
块级结构(如工作表、文件版本和 ISO/IEC 29500(该链接可能指向英文页面) 规范中指定的其他项)的容器。 |
sheet |
DocumentFormat.OpenXml.Spreadsheet.Sheet |
指向工作表定义文件的工作表。 |
worksheet |
DocumentFormat.OpenXml.Spreadsheet.Worksheet |
包含工作表数据的工作表定义文件。 |
sheetData |
DocumentFormat.OpenXml.Spreadsheet.SheetData |
按行分组在一起的单元格表。 |
row |
DocumentFormat.OpenXml.Spreadsheet.Row |
单元格表中的行。 |
c |
DocumentFormat.OpenXml.Spreadsheet.Cell |
行中的单元格。 |
v |
DocumentFormat.OpenXml.Spreadsheet.CellValue |
单元格的值。 |
示例代码的工作方式
打开文件进行只读访问后,实例化 Sheets 类。
S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
Dim sheets As S = mySpreadsheet.WorkbookPart.Workbook.Sheets
然后,循环访问 Sheets 集合,并显示每个元素中的 OpenXmlElement 和 OpenXmlAttribute。
foreach (E sheet in sheets)
{
foreach (A attr in sheet.GetAttributes())
{
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
}
}
For Each sheet In sheets
For Each attr In sheet.GetAttributes()
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value)
Next
Next
通过显示属性信息,可获取电子表格文件中每个工作表的名称和 ID。
示例代码
在下面的代码示例中,检索并显示 SpreadsheetDocument 文档中包含的指定工作簿中所有工作表的属性。下面的代码示例显示如何调用 GetSheetInfo 方法。
GetSheetInfo(@"C:\Users\Public\Documents\Sheet5.xlsx");
GetSheetInfo("C:\Users\Public\Documents\Sheet5.xlsx")
以下是使用 C# 和 Visual Basic 编写的完整示例代码。
public static void GetSheetInfo(string fileName)
{
// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
{
S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
// For each sheet, display the sheet information.
foreach (E sheet in sheets)
{
foreach (A attr in sheet.GetAttributes())
{
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
}
}
}
}
Public Sub GetSheetInfo(ByVal fileName As String)
' Open file as read-only.
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, False)
Dim sheets As S = mySpreadsheet.WorkbookPart.Workbook.Sheets
' For each sheet, display the sheet information.
For Each sheet As E In sheets
For Each attr As A In sheet.GetAttributes()
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value)
Next
Next
End Using
End Sub