Работа со стилями
В этом разделе рассматриваются классы open XML SDK Worksheet, Chartsheetи , а DialogSheet также их связь со схемой SpreadsheetML формата файла Open XML. Дополнительные сведения об общей структуре частей и элементов, составляющих документ SpreadsheetML, см. в разделе Структура документа SpreadsheetML.
Листы в документе SpreadsheetML
В следующей информации из спецификации ISO/IEC 29500 представлен элемент листа (<sheet/>
).
Лист это главная структура в рабочей книге, и именно здесь пользователь выполняет большую часть работы с электронной таблицей. Наиболее распространены обычные листы, которые представляют собой сетку из ячеек. Они могут содержать текст, числа, даты и формулы. Ячейки также можно форматировать. Рабочие книги обычно содержат несколько листов. Чтобы упростить анализ данных и обеспечить более взвешенное принятие решений, в приложениях для работы с электронными таблицами часто имеются различные функции и объекты, помогающие вычислять, сортировать, фильтровать, организовывать и графически отображать данные. Поскольку такие функции часто очень тесно связаны с сеткой электронной таблицы, они также включаются в определение листа на диске.
К другим типам листов относятся листы диаграмм и диалоговых окон.
© ISO/IEC 29500: 2016
Класс листа open XML SDK
Класс Open XML SDK Worksheet
представляет элемент (<worksheet/>
), определенный worksheet
в схеме формата файла Open XML для документов SpreadsheetML. Используйте класс для Worksheet
управления отдельными <worksheet/>
элементами в документе SpreadsheetML.
В следующей информации из спецификации ISO/IEC 29500 представлен worksheet
элемент (<worksheet/>
).
Экземпляр части такого типа содержит все данные, формулы и характеристики, связанные с данным листом.
Пакет содержит в точности одну часть листа для каждого листа.
В частности, атрибут id элемента sheet должен указывать на нужную часть листа.
Корневым элементом для части данного типа содержимого должен быть worksheet.
В следующей выдержке из стандарта ISO/IEC 29500 представляется базовый сценарий использования листа.
Наименьшим возможным листом (пустым) является следующий:
<worksheet>
<sheetData/>
</worksheet>
Пустая коллекция sheetData представляет собой пустую сетку; этот элемент является обязательным. Как определяется в схеме, некоторые дополнительные коллекции свойств листа могут располагаться до коллекции sheetData, а некоторые после нее. Чтобы упростить вставку новой коллекции sheetData в существующий (но пустой) лист, коллекция sheetData является обязательной, даже когда она пуста.
© ISO/IEC 29500: 2016
В обычной электронной таблице имеется по крайней мере один лист. Лист содержит табличную структуру для определения данных, представленную элементом sheetData
. Лист, содержащий данные, worksheet
использует элемент в качестве корневого элемента для определения листов. Внутри листа данные делятся на три раздела. Первый раздел содержит необязательные свойства листа. Во втором разделе содержатся данные с использованием необходимого sheetData
элемента. В третьем разделе находятся необязательные вспомогательные свойства, такие как сведения о защите листа и фильтрации. Чтобы определить пустой лист, достаточно использовать worksheet
только элементы и sheetData
. Элемент sheetData
может быть пустым.
Чтобы создать новые значения для листа, необходимо определить строки внутри sheetData
элемента . Эти строки содержат ячейки со значениями. Элемент row
определяет новую строку. Обычно первая строка в является sheetData
первой строкой на видимом листе.
Внутри строки, создаваемой cells
с помощью <c/>
элемента . Значения для ячеек можно предоставить путем <v/>
хранения элемента внутри ячейки.
<v/>
Обычно элемент содержит текущее значение ячейки листа. Если значение является числовым, оно хранится непосредственно в элементе <v/>
в XML-файле. Если значение является строковым, оно хранится в общей таблице строк. Дополнительные сведения об использовании общей таблицы строк для хранения строковых значений см. в разделе Работа с общей строковой таблицей.
В следующей таблице перечислены распространенные классы open XML SDK, используемые при работе с классом Worksheet .
Элемент SpreadsheetML | Класс пакета SDK Open XML |
---|---|
<sheetData/> |
SheetData |
<row/> |
Row |
<c/> |
Cell |
<v/> |
CellValue |
Дополнительные сведения о необязательных элементах электронной таблицы, таких как свойства листа и вспомогательные свойства листа, см. в описании стандарта ISO/IEC 29500.
Класс SheetData
В следующей информации из спецификации ISO/IEC 29500 представлен элемент данных листа (<sheetData/>
).
Таблица ячеек является основной структурой листа. Она содержит весь текст, все числа и формулы в сетке.
© ISO/IEC 29500: 2016
Класс Row
В следующей информации из спецификации ISO/IEC 29500 представлен элемент row (<row/>
).
Ячейки в таблице ячеек организованы по строкам. Каждая строка имеет индекс (атрибут r), поэтому пустые строки не нужно записывать. Каждая строка указывает количество ячеек, определенное для нее, а также их относительное положение на листе. В данном примере первой строкой данных является строка 2.
© ISO/IEC 29500: 2016
Класс Cell
В следующей информации из спецификации ISO/IEC 29500 представлен элемент cell (<c/>
).
Сама ячейка выражается коллекцией c. Каждая ячейка указывает свое расположение в сетке с помощью эталонной нотации в стиле A1. Ячейка также может указывать идентификатор стиля (атрибуты) и тип данных (атрибут t). К типам ячеек относятся string, number и boolean. Для оптимизации операций загрузки и сохранения значения данных по умолчанию не записываются.
© ISO/IEC 29500: 2016
Класс CellValue
В следующей информации из спецификации ISO/IEC 29500 представлен элемент значения ячейки (<v/>
).
Ячейки содержат значения, как непосредственно введенные пользователем (например, в ячейке A2 в данном примере содержится значение "External Link:"), так и представляющие собой результат вычисления (например, в ячейке B3 в данном примере содержится формула "B2+1").
Строковые значения ячеек не хранятся в таблице ячеек за исключением случае, когда они являются результатом вычисления. Таким образом, вместо внешнего канала в качестве содержимого v-узла ячейки вы увидите отсчитываемый от нуля индекс в общей строковой таблице, где эта строка хранится уникально. Это делается для оптимизации операций загрузки и сохранения и снижения степени дублирования данных. Чтобы определить, является ли "0" в элементе v числом или индексом для строки, нужно проверить тип данных ячейки. Если ячейка является строковой, то это индекс, а не числовое значение.
© ISO/IEC 29500: 2016
Пример кода Open XML SDK
В следующем примере кода создается документ электронной таблицы с указанным именем файла и создается Worksheet
экземпляр класса, а затем добавляется строка и ячейка в таблицу ячеек в позиции A1. Затем ячейке A1 присваивается числовое значение 100.
static void CreateSpreadsheetWorkbook(string filepath)
{
// Use 'using' block to ensure proper disposal of the document
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);
// Get the sheetData cell table.
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>() ?? worksheetPart.Worksheet.AppendChild(new SheetData());
// Add a row to the cell table.
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);
}
}