如何:将新工作表插入到电子表格文档
上次修改时间: 2010年10月14日
适用范围: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
本文内容
获取 SpreadsheetDocument 对象
SpreadsheetML 文档的基本结构
示例代码的工作方式
示例代码
本主题演示如何使用 Open XML SDK 2.0 for Microsoft Office 中的类以编程方式在电子表格文档中插入新工作表。
编译本主题中的代码需要使用以下程序集指令。
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
Imports System.Linq
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
获取 SpreadsheetDocument 对象
在 Open XML SDK 中,SpreadsheetDocument 类表示 Excel 文档包。若要打开并使用 Excel 文档,请基于文档创建 SpreadsheetDocument 类的一个实例。基于文档创建实例后,即可获取对包含工作表的主工作簿部件的访问权限。在此包中,使用 SpreadsheetML 标记将文档中的文本表示为 XML 形式。
若要从文档中创建类实例,请调用 Open() 方法之一。提供了多个方法,每个方法都有不同的签名。本主题中的示例代码使用带有需要两个参数的签名的 Open(String, Boolean) 方法。第一个参数采用表示要打开的文档的完整路径字符串。第二个参数是 true 或 false,表示是否要打开文件以进行编辑。如果此参数为 false,则不会保存对该文档所做的任何更改。
下面的 using 语句中显示了调用 Open 方法的代码。
// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
{
// Insert other code here.
}
' Open the document for editing.
Dim spreadSheet As SpreadsheetDocument = SpreadsheetDocument.Open(docName, True)
Using (spreadSheet)
' Insert other code here.
End Using
using 语句提供典型 .Open, .Save, .Close 序列的建议备选序列。它确保在遇到右大括号时会自动调用 Dispose 方法(Open XML SDK 用来清理资源的内部方法)。using 语句后面的块为 using 语句中创建或指定的对象设定范围,在此示例中这个范围就是 spreadSheet。
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 |
单元格的值。 |
示例代码的工作方式
以 SpreadsheetDocument 文档包形式打开文档进行编辑后,代码会使用 AddNewPart 方法向 WorkbookPart 对象中添加一个新 WorksheetPart 对象。然后,它向 WorksheetPart 对象中添加一个新 Worksheet 对象。
// Add a blank WorksheetPart.
WorksheetPart newWorksheetPart =
spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId =
spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart);
' Add a blank WorksheetPart.
Dim newWorksheetPart As WorksheetPart = spreadSheet.WorkbookPart.AddNewPart(Of WorksheetPart)()
newWorksheetPart.Worksheet = New Worksheet(New SheetData())
' newWorksheetPart.Worksheet.Save()
Dim sheets As Sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()
Dim relationshipId As String = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart)
代码通过选择电子表格文档中所使用的最大 SheetId 对象并在此基础上加一来创建新的工作表 ID,从而获取新工作表的唯一 ID。它通过将"Sheet"一词与工作表 ID 进行连接来指定工作表的名称,并将新工作表追加到工作表集合中。
// Get a unique ID for the new worksheet.
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId =
sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
// Give the new worksheet a name.
string sheetName = "Sheet" + sheetId;
// Append the new worksheet and associate it with the workbook.
Sheet sheet = new Sheet()
{ Id = relationshipId, SheetId = sheetId, Name = sheetName };
sheets.Append(sheet);
' Get a unique ID for the new worksheet.
Dim sheetId As UInteger = 1
If (sheets.Elements(Of Sheet).Count > 0) Then
sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max + 1
End If
' Give the new worksheet a name.
Dim sheetName As String = ("Sheet" + sheetId.ToString())
' Append the new worksheet and associate it with the workbook.
Dim sheet As Sheet = New Sheet
sheet.Id = relationshipId
sheet.SheetId = sheetId
sheet.Name = sheetName
sheets.Append(sheet)
示例代码
在下面的代码中,添加一个空 WorksheetPart 对象,生成 WorksheetPart 对象的唯一 ID,将 WorksheetPart 对象注册到 SpreadsheetDocument 文档包中包含的 WorkbookPart 对象,从而插入一个空 Worksheet 对象。若要调用 InsertWorksheet 方法,您可以使用以下代码,该代码在名为"Sheet7.xslx"的文件中插入一个工作表。
string docName = @"C:\Users\Public\Documents\Sheet7.xlsx";
InsertWorksheet(docName);
Dim docName As String = "C:\Users\Public\Documents\Sheet7.xlsx"
InsertWorksheet(docName)
以下是使用 C# 和 Visual Basic 编写的完整示例代码。
// Given a document name, inserts a new worksheet.
public static void InsertWorksheet(string docName)
{
// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
{
// Add a blank WorksheetPart.
WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart);
// Get a unique ID for the new worksheet.
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
// Give the new worksheet a name.
string sheetName = "Sheet" + sheetId;
// Append the new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
sheets.Append(sheet);
}
}
' Given a document name, inserts a new worksheet.
Public Sub InsertWorksheet(ByVal docName As String)
' Open the document for editing.
Dim spreadSheet As SpreadsheetDocument = SpreadsheetDocument.Open(docName, True)
Using (spreadSheet)
' Add a blank WorksheetPart.
Dim newWorksheetPart As WorksheetPart = spreadSheet.WorkbookPart.AddNewPart(Of WorksheetPart)()
newWorksheetPart.Worksheet = New Worksheet(New SheetData())
' newWorksheetPart.Worksheet.Save()
Dim sheets As Sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()
Dim relationshipId As String = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart)
' Get a unique ID for the new worksheet.
Dim sheetId As UInteger = 1
If (sheets.Elements(Of Sheet).Count > 0) Then
sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max + 1
End If
' Give the new worksheet a name.
Dim sheetName As String = ("Sheet" + sheetId.ToString())
' Append the new worksheet and associate it with the workbook.
Dim sheet As Sheet = New Sheet
sheet.Id = relationshipId
sheet.SheetId = sheetId
sheet.Name = sheetName
sheets.Append(sheet)
End Using
End Sub