Поделиться через


Работа со стилями

В этом разделе рассматриваются классы 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);
    }
}