如何:将新工作表插入到电子表格文档

上次修改时间: 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 中的工作表的 SheetsSheet 元素组成。将为每个 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

请参阅

引用

Class Library Reference

其他资源

语言集成查询 (LINQ)

Lambda 表达式

Lambda 表达式(C# 编程指南)