使用工作表

上次修改时间: 2010年11月23日

适用范围: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

本文内容
SpreadsheetML 中的工作表
Open XML SDK 2.0 Worksheet 类
Open XML SDK 2.0 Chartsheet 类
Open XML SDK 2.0 Dialogsheet 类

本主题讨论 Open XML SDK 2.0WorksheetChartsheetDialogSheet 类以及它们与 Open XML 文件格式 SpreadsheetML 架构的关系。有关构成 SpreadsheetML 文档的部件和元素的整体结构的详细信息,请参阅 SpreadsheetML 文档的结构

SpreadsheetML 中的工作表

来自 ISO/IEC 29500(该链接可能指向英文页面) 规范的以下信息介绍了 sheet (<sheet>) 元素。

工作表是工作簿内的核心结构,用户在工作表中执行大多数电子表格任务。最常见的工作表类型是由单元格网格表示的工作表。工作表单元格可以包含文本、数字、日期和公式。用户还可以设置单元格的格式。工作簿通常包含多个工作表。为了帮助分析数据和做出明智的决策,电子表格应用程序通常实现可帮助计算、排序、筛选、组织和以图形方式显示信息的功能和对象。因为这些功能通常与电子表格网格紧密关联,所以这些功能也包含在磁盘上的工作表定义中。

其他类型的工作表包括图表工作表和对话框工作表。

© ISO/IEC29500: 2008。

Open XML SDK 2.0 Worksheet 类

Open XML SDK 2.0Worksheet 类表示在 SpreadsheetML 文档的 Open XML 文件格式架构中定义的 worksheet (<worksheet>) 元素。使用 Worksheet 类可以处理 SpreadsheetML 文档中的各个 <worksheet> 元素。

来自 ISO/IEC 29500 规范的以下信息介绍了 worksheet (<worksheet>) 元素。

此部件类型的实例包含与给定工作表相关联的所有数据、公式和特征。

对于每个工作表,包应该正好包含一个 Worksheet 部件

具体地说,sheet 元素的 ID 属性应该引用所需的工作表部件。

此内容类型的部件的根元素应该为 worksheet。

来自 ISO/IEC 29500 规范的以下信息介绍了最小工作表方案。

可能的最小(空白)工作表如下所示:

<worksheet>

    <sheetData/>

</worksheet>

空 sheetData 集合表示一个空网格;此元素是必需的。根据架构中的定义,一些可选的工作表属性集合可以出现在 sheetData 之前,一些可以出现在 sheetData 之后。为了简化在现有工作表(但却是空表)中插入新 sheetData 集合所需的逻辑,sheetData 集合是必需的,即使对于空表也是如此。

© ISO/IEC29500: 2008。

典型的电子表格至少包含一个工作表。工作表包含一个类似于数据定义结构的表格,由 sheetData 元素表示。包含数据的工作表使用 worksheet 元素作为根元素来定义工作表。在工作表中,数据分为三个不同的部分。第一部分包含可选的表属性。第二部分包含数据,它使用必需的 sheetData 元素。第三部分包含可选的支持功能,如工作表保护和筛选信息。您只需使用 worksheet 和 sheetData 元素即可定义空工作表。sheetData 元素可以为空。

若要为工作表创建新值,需要在 sheetData 元素中定义行。这些行包含具有值的单元格。row 元素定义新行。通常,sheetData 中的第一行是可见工作表中的第一行。在行中,您可以使用 <c> 元素创建新单元格。单元格的值可以通过在单元格中存储 <v> 元素来提供。通常,<v> 元素包含工作表单元格的当前值。如果值是数字值,则直接存储在 XML 文件的 <v> 元素中。如果值是字符串值,则存储在共享字符串表格中。有关使用共享字符串表格存储字符串值的详细信息,请参阅使用共享字符串表

下表列出了在处理 Worksheet 类时使用的常用 Open XML SDK 2.0 类。

SpreadsheetML 元素

Open XML SDK 2.0 类

sheetData

SheetData

row

Row

c

Cell

v

CellValue

有关可选电子表格元素(如工作表属性和提供支持的表功能)的详细信息,请参阅 ISO/IEC 29500 规范。

SheetData 类

来自 ISO/IEC 29500 规范的以下信息介绍了 sheet data (<sheetData>) 元素。

单元格表格是工作表的核心结构。它包含网格中的所有文本、数字和公式。

© ISO/IEC29500: 2008。

Row 类

来自 ISO/IEC 29500 规范的以下信息介绍了 row (<row>) 元素。

单元格表格中的单元格按行排列。每行都具有一个索引(属性 r),因此无需写出空行。每行都指示为它定义的单元格数目以及单元格在工作表中的相对位置。在此示例中,第一个数据行是第 2 行。

© ISO/IEC29500: 2008。

Cell 类

来自 ISO/IEC 29500 规范的以下信息介绍了 cell (<c>) 元素。

单元格本身由 c 集合表示。每个单元格都使用 A1 样式的引用表示法指明它在网格中的位置。单元格还可以指明样式标识符(属性 s)和数据类型(属性 t)。单元格类型包括 string、number 和 Boolean。为了优化加载/保存操作,不写出默认数据值。

© ISO/IEC29500: 2008。

CellValue 类

来自 ISO/IEC 29500 规范的以下信息介绍了 cell value (<v>) 元素。

单元格包含值,无论值是直接输入的值(例如,示例中的单元格 A2 包含值 External Link:)还是计算结果(例如,示例中的单元格 B3 包含公式 B2+1)。

单元格中的字符串值不存储在单元格表格中,除非它们是计算结果。因此,您不会看到 External Link: 显示为单元格 v 节点的内容,而是看到共享字符串表格(它是存储该字符串的唯一位置)中从 0 开始的索引。这样做是为了优化加载/保存性能和减少信息重复。若要确定 v 中的 0 是数字还是字符串索引,必须检查单元格的数据类型。当数据类型指示字符串时,则它是索引而不是数字值。

© ISO/IEC29500: 2008。

Open XML SDK 2.0 代码示例

以下代码示例创建具有指定文件名的电子表格文档,并将 Open XML SDK 2.0Worksheet 类实例化,然后添加一行并在单元格表格的 A1 位置添加一个单元格。然后,设置 A1 中的单元格值,使它等于数字值 100。

public static void CreateSpreadsheetWorkbook(string filepath)
{
    // Create a spreadsheet document by supplying the filepath.
    // By default, AutoSave = true, Editable = true, and Type = xlsx.
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);

    // Add a WorkbookPart to the document.
    WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
    workbookpart.Workbook = new Workbook();

    // Add a WorksheetPart to the WorkbookPart.
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet(new SheetData());

    // Add Sheets to the Workbook.
    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

    // Append a new worksheet and associate it with the workbook.
    Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
    sheets.Append(sheet);

    // Get the sheetData cell table.
    SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
                        
    // Add a row to the cell table.
    Row row;
    row = new Row() { RowIndex = 1 };
    sheetData.Append(row);

    // In the new row, find the column location to insert a cell in A1.  
    Cell refCell = null;
    foreach (Cell cell in row.Elements<Cell>())
    {
        if (string.Compare(cell.CellReference.Value, "A1", true) > 0)
        {
            refCell = cell;
            break;
        }
    }

    // Add the cell to the cell table at A1.
    Cell newCell = new Cell() { CellReference = "A1" };
    row.InsertBefore(newCell, refCell);
            
    // Set the cell value to be a numeric value of 100.
    newCell.CellValue = new CellValue("100");
    newCell.DataType = new EnumValue<CellValues>(CellValues.Number);

    // Close the document.
    spreadsheetDocument.Close();
}
Public Sub CreateSpreadsheetWorkbookWithNumValue(ByVal filepath As String)
    ' Create a spreadsheet document by supplying the filepath.
    ' By default, AutoSave = true, Editable = true, and Type = xlsx.
    Dim spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook)

    ' Add a WorkbookPart to the document.
    Dim workbookpart As WorkbookPart = SpreadsheetDocument.AddWorkbookPart()
    workbookpart.Workbook = New Workbook()

    ' Add a WorksheetPart to the WorkbookPart.
    Dim worksheetPart As WorksheetPart = workbookpart.AddNewPart(Of WorksheetPart)()
    worksheetPart.Worksheet = New Worksheet(New SheetData())

    ' Add Sheets to the Workbook.
    Dim sheets As Sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(Of Sheets)(New Sheets())

    ' Append a new worksheet and associate it with the workbook.
    Dim sheet As New Sheet() With {.Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), .SheetId = 1, .Name = "mySheet"}
    sheets.Append(sheet)

    ' Get the sheetData cell table.
    Dim sheetData As SheetData = worksheetPart.Worksheet.GetFirstChild(Of SheetData)()

    ' Add a row to the cell table.
    Dim row As Row
    row = New Row() With {.RowIndex = 1}
    sheetData.Append(row)

    ' In the new row, find the column location to insert a cell in A1.  
    Dim refCell As Cell = Nothing
    For Each cell As Cell In row.Elements(Of Cell)()
        If String.Compare(cell.CellReference.Value, "A1", True) > 0 Then
            refCell = cell
            Exit For
        End If
    Next

    ' Add the cell to the cell table at A1.
    Dim newCell As New Cell() With {.CellReference = "A1"}
    row.InsertBefore(newCell, refCell)

    ' Set the cell value to be a numeric value of 100.
    newCell.CellValue = New CellValue("100")
    newCell.DataType = New EnumValue(Of CellValues)(CellValues.Number)

    ' Close the document.
    SpreadsheetDocument.Close()
End Sub

生成的 SpreadsheetML

Open XML SDK 2.0 运行时,会将以下 XML 写入代码中引用的 SpreadsheetML 文档。若要查看此 XML,请打开 .zip 文件的"worksheets"文件夹中的"sheet.xml"文件。

<?xml version="1.0" encoding="utf-8"?>
<x:worksheet xmlns:x="https://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:sheetData>
        <x:row r="1">
            <x:c r="A1" t="n">
                <x:v>100</x:v>
            </x:c>
        </x:row>
    </x:sheetData>
</x:worksheet>

Open XML SDK 2.0 Chartsheet 类

来自 ISO/IEC 29500 规范的以下信息介绍了 chartsheet (<chartsheet>) 元素。

此部件类型的实例表示一个存储在它自己的工作表中的图表。

允许包中包含零个或多个 Chartsheet 部件。

[示例:sheet1.xml 引用一个图形,该图形是 Chartsheet 部件的关系项目中关系的目标:

<chartsheet xmlns:r="…" …>

    <sheetViews>

        <sheetView scale="64"/>

    </sheetViews>

    <drawing r:id="rId1"/>

</chartsheet>

示例结束]

© ISO/IEC29500: 2008。

下表列出了在处理 Chartsheet 类时使用的常用 Open XML SDK 2.0 类。

SpreadsheetML 元素

Open XML SDK 2.0 类

drawing

Drawing

Drawing 类

来自 ISO/IEC 29500 规范的以下信息介绍了 drawings (<wsDr>) 元素。

此部件类型的实例包含此工作表中存在的一个或多个图形元素的呈现方式和布局信息。

允许包中包含一个或多个 Drawings 部件,每个此类部件都应该是 Worksheet 部件 (§12.3.24) 或 Chartsheet 部件 (§12.3.2) 中显式关系的目标。每个工作表或图表工作表应只有一个 Drawings 部件。

© ISO/IEC29500: 2008。

Open XML SDK 2.0 Dialogsheet 类

来自 ISO/IEC 29500 规范的以下信息介绍了 dialogsheet (<dialogsheet>) 元素。

此部件类型的实例包含有关用户表单的旧自定义对话框的信息。

允许包中包含一个或多个 Dialogsheet 部件

此内容类型的部件的根元素应为 dialogsheet。

[示例:sheet1.xml 包含以下内容:

<dialogsheet xmlns:r="…" …>

    <sheetPr>

        <pageSetUpPr/>

    </sheetPr>

    <sheetViews>

        …

    </sheetViews>

    …

    <legacyDrawing r:id="rId1"/>

</dialogsheet>

示例结束]

© ISO/IEC29500: 2008。