Получение сведений о листе из пакета 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);
}
}
}
}
}