Неофициальный русский перевод. Первоисточник: Microsoft Learn.

Структура документа SpreadsheetML

Структура документа SpreadsheetML состоит из элемента <workbook/>, который содержит элементы <sheets/> и <sheet/>, ссылающиеся на рабочие листы в книге. Для каждого рабочего листа создаётся отдельный XML-файл. Эти элементы являются минимальным набором элементов, необходимым для допустимого документа электронной таблицы. Кроме того, документ электронной таблицы может содержать <table/>, <chartsheet/>, <pivotTableDefinition/> или другие элементы, связанные с электронными таблицами.

Примечание

Интересует разработка решений, расширяющих возможности Office на нескольких платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места, чем надстройки и решения VSTO, и их можно создавать почти с помощью любой технологии веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Важные части пакета электронной таблицы

С помощью Open XML SDK для Office можно создавать структуру и содержимое документа, используя строго типизированные классы, соответствующие элементам SpreadsheetML. Эти классы находятся в пространстве имён DocumentFormat.OpenXML.Spreadsheet. В следующей таблице перечислены имена классов, соответствующих некоторым важным элементам электронной таблицы.

Часть пакетаЭлемент SpreadsheetML верхнего уровняКласс Open XML SDKОписание
Книга<workbook/>WorkbookКорневой элемент основной части пакета документа.
Рабочий лист<worksheet/>WorksheetТип листа, представляющий сетку ячеек, содержащих текст, числа, даты или формулы. Дополнительные сведения см. в разделе Работа с листами.
Лист диаграммы<chartsheet/>ChartsheetЛист, представляющий диаграмму, которая хранится на отдельном листе. Дополнительные сведения см. в разделе Работа с листами.
Таблица<table/>TableЛогическая конструкция, указывающая, что диапазон данных принадлежит единому набору данных. Дополнительные сведения см. в разделе Работа с таблицами SpreadsheetML.
Сводная таблица<pivotTableDefinition/>PivotTableDefinitionЛогическая конструкция, отображающая агрегированное представление данных в понятном макете. Дополнительные сведения см. в разделе Работа со сводными таблицами.
Кэш сводной таблицы<pivotCacheDefinition/>PivotCacheDefinitionКонструкция, определяющая источник данных в сводной таблице. Дополнительные сведения см. в разделе Работа со сводными таблицами.
Записи кэша сводной таблицы<pivotCacheRecords/>PivotCacheRecordsКэш исходных данных сводной таблицы. Дополнительные сведения см. в разделе Работа со сводными таблицами.
Цепочка вычислений<calcChain/>CalculationChainКонструкция, задающая порядок, в котором ячейки в книге были вычислены в последний раз. Дополнительные сведения см. в разделе Работа с цепочкой вычислений.
Таблица общих строк<sst/>SharedStringTableКонструкция, содержащая по одному вхождению каждой уникальной строки, встречающейся на всех рабочих листах книги. Дополнительные сведения см. в разделе Работа с таблицей общих строк.
Условное форматирование<conditionalFormatting/>ConditionalFormattingКонструкция, определяющая формат, применяемый к ячейке или ряду ячеек. Дополнительные сведения см. в разделе Работа с условным форматированием.
Формулы<f/>CellFormulaКонструкция, определяющая текст формулы для ячейки, содержащей формулу. Дополнительные сведения см. в разделе Работа с формулами.

Сценарий минимальной книги

Следующий текст из стандарта ECMA-376 представляет сценарий минимальной книги.

Наименьшая возможная (пустая) книга должна содержать следующее:

Один лист

Идентификатор листа

Идентификатор связи, указывающий на расположение определения листа

© Ecma International: декабрь 2006 г.

Пример кода Open XML SDK

В этом примере кода используются классы Open XML SDK для создания минимальной пустой книги.

static void CreateSpreadsheetWorkbook(string filepath)
{
    // Create a spreadsheet document by supplying the filepath.
    // By default, AutoSave = true, Editable = true, and Type = xlsx.
    using (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 = workbookPart.Workbook.AppendChild(new Sheets());

        // Append a new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
        sheets.Append(sheet);
    }
}
Sub CreateSpreadsheetWorkbook(filepath As String)
    ' Create a spreadsheet document by supplying the filepath.
    ' By default, AutoSave = true, Editable = true, and Type = xlsx.
    Using 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 = workbookPart.Workbook.AppendChild(Of Sheets)(New Sheets())

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

Созданный SpreadsheetML

После запуска кода Open XML SDK для создания минимальной книги можно изучить содержимое пакета .zip, чтобы просмотреть XML-код SpreadsheetML. Чтобы просмотреть пакет .zip, переименуйте расширение минимальной электронной таблицы с .xlsx на .zip. Внутри пакета .zip находится несколько частей пакета, составляющих минимальную книгу.

На следующем рисунке показана структура в папке xl пакета .zip для минимальной книги.

Рисунок 1. Структура папок .zip
Структура минимальной книги

Файл workbook.xml содержит элементы <sheet/>, ссылающиеся на рабочие листы в книге. Каждый рабочий лист связан с книгой посредством идентификатора листа и идентификатора связи. sheetID — это идентификатор, используемый в пакете для идентификации листа; он должен быть уникальным в пределах книги. id — это идентификатор связи, идентифицирующий определение части пакета листа, связанной с листом.

Следующий XML-код — это SpreadsheetML, представляющий часть пакета книги документа электронной таблицы. Этот код создаётся при запуске кода Open XML SDK для создания минимальной книги.

    <?xml version="1.0" encoding="utf-8"?>
    <x:workbook xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <x:sheets>
            <x:sheet name="mySheet" sheetId="1" r:id="Rddc7711f116045e5" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
        </x:sheets>
    </x:workbook>

Файл workbook.xml.rels содержит элементы <Relationship/>, определяющие связи между книгой и содержащимися в ней рабочими листами.

Следующий XML-код — это SpreadsheetML, представляющий часть пакета связей документа электронной таблицы. Этот код создаётся при запуске Open XML SDK для создания минимальной книги.

    <?xml version="1.0" encoding="utf-8"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="/xl/worksheets/sheet.xml" Id="Rddc7711f116045e5" />
    </Relationships>

Файл sheet.xml содержит элемент <sheetData/>, представляющий таблицу ячеек. В этом примере книга пуста, поэтому элемент <sheetData/> пуст. Дополнительные сведения о листах см. в разделе Работа с листами.

Следующий XML-код — это SpreadsheetML, представляющий часть пакета рабочего листа документа электронной таблицы. Этот код создаётся при запуске Open XML SDK для создания минимальной книги.

    <?xml version="1.0" encoding="utf-8"?>
    <x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <x:sheetData />
    </x:worksheet>

Сценарий типичной книги

Типичная книга не будет пустой минимальной книгой. Типичная книга может содержать числа, текст, диаграммы, таблицы и сводные таблицы. Каждая из этих дополнительных частей пакета содержится в пакете .zip документа электронной таблицы.

На следующем рисунке показано большинство элементов, которые можно найти в типичной электронной таблице.

Рисунок 2. Типичные элементы электронной таблицы. Обозначения: книга; тема; стили; цепочка вычислений; общие строки; XML-сопоставления; листы; диаграмма; таблица; сводная таблица; кэш сводной таблицы; записи сводной таблицы.
Структура документа SpreadsheetML

Лицензия исходного репозитория Microsoft (оригинал)

    MIT License

    Copyright (c) Microsoft Corporation. All rights reserved.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE