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


Получение сведений о листе из пакета Open XML

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного извлечения сведений с листа в документе электронной таблицы.

Базовая структура документа spreadsheetML

Базовая структура SpreadsheetML документа состоит из Sheets элементов и Sheet , ссылающихся на листы в книге. Для каждого листа создается отдельный XML-файл. Например, SpreadsheetML объект для , Workbook имеющий два листа с именами MySheet1 и MySheet2, находится в файле Workbook.xml и показан в следующем примере кода.

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://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 например представляет таблицу ячеек и содержит один или несколько Row элементов. Содержит row один или несколько Cell элементов. Каждая ячейка CellValue содержит элемент, представляющий значение ячейки. Например, SpreadsheetML для первого листа в книге, который имеет только значение 100 в ячейке A1, находится в файле Sheet1.xml и показан в следующем примере кода.

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

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

Элемент SpreadsheetML Класс пакета SDK Open XML Описание
<workbook/> DocumentFormat.OpenXML.Spreadsheet.Workbook Корневой элемент основной части документа.
<sheets/> DocumentFormat.OpenXML.Spreadsheet.Sheets Контейнер для структур уровня блока, таких как sheet, fileVersion и других, указанных в спецификации 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 Значение ячейки.

Механизм работы примера кода

После открытия файла для доступа только для чтения создается экземпляр Sheets класса .

Sheets? sheets = mySpreadsheet.WorkbookPart?.Workbook?.Sheets;

Затем вы выполняете итерацию по Sheets коллекции и отображению OpenXmlElement и в каждом элементе OpenXmlAttribute .

foreach (OpenXmlElement sheet in sheets)
{
    foreach (OpenXmlAttribute attr in sheet.GetAttributes())
    {
        Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
    }
}

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

Пример кода

Ниже приведен полный пример кода на языках C# и Visual Basic.

static void GetSheetInfo(string fileName)
{
    // Open file as read-only.
    using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
    {
        Sheets? sheets = mySpreadsheet.WorkbookPart?.Workbook?.Sheets;

        if (sheets is not null)
        {
            // For each sheet, display the sheet information.
            foreach (OpenXmlElement sheet in sheets)
            {
                foreach (OpenXmlAttribute attr in sheet.GetAttributes())
                {
                    Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
                }
            }
        }
    }
}