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


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

Дата последнего изменения: 14 октября 2010 г.

Применимо к: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

В этой статье
Создание объекта SpreadsheetDocument
Базовая структура SpreadsheetML
Механизм работы примера кода
Пример кода

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

Для компиляции кода, представленного в этом разделе, требуются следующие директивы сборки.

using System;
using DocumentFormat.OpenXml.Packaging;
using S = DocumentFormat.OpenXml.Spreadsheet.Sheets;
using E = DocumentFormat.OpenXml.OpenXmlElement;
using A = DocumentFormat.OpenXml.OpenXmlAttribute;
Imports System
Imports DocumentFormat.OpenXml.Packaging
Imports S = DocumentFormat.OpenXml.Spreadsheet.Sheets
Imports E = DocumentFormat.OpenXml.OpenXmlElement
Imports A = DocumentFormat.OpenXml.OpenXmlAttribute

Создание объекта SpreadsheetDocument

Класс SpreadsheetDocument в пакете Open XML SDK представляет пакет документа Excel. Для создания документа Excel нужно создать экземпляр класса SpreadsheetDocument и заполнить его частями. Документ должен содержать как минимум часть книги, которая служит контейнером для документа, и хотя бы одну часть листа. Текст представляется в этом пакете в виде XML-кода с использованием разметки SpreadsheetML.

Чтобы создать экземпляр класса на основе документа, нужно вызвать один из методов Open(). В данном примере необходимо открыть файл только для чтения. Таким образом, можно использовать метод Open(String, Boolean) и присвоить логическому параметру (Boolean) значение false.

В следующем примере кода вызывается метод Open, который открывает только для чтения файл, указанный в параметре filepath.

// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
' Open file as read-only.
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, False)

Инструкцию using рекомендуется использовать вместо традиционной последовательности .Open, .Save, .Close. Это позволяет обеспечить автоматический вызов метода Dispose (внутреннего метода, используемого пакетом SDK Open XML для очистки ресурсов) при достижении закрывающей скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using, в данном случае — mySpreadsheet.

Базовая структура SpreadsheetML

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

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

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

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

Элемент SpreadsheetML

Класс SDK Open XML версии 2.0

Описание

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.

S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
Dim sheets As S = mySpreadsheet.WorkbookPart.Workbook.Sheets

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

foreach (E sheet in sheets)
{
    foreach (A attr in sheet.GetAttributes())
    {
        Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
    }
}
For Each sheet In sheets
    For Each attr In sheet.GetAttributes()
        Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value)
    Next
Next

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

Пример кода

В следующем примере кода извлекаются и отображаются атрибуты всех листов в указанной книге, которая содержится в документе SpreadsheetDocument. В следующем примере кода показан вызов метода GetSheetInfo.

GetSheetInfo(@"C:\Users\Public\Documents\Sheet5.xlsx");
GetSheetInfo("C:\Users\Public\Documents\Sheet5.xlsx")

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

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

        // For each sheet, display the sheet information.
        foreach (E sheet in sheets)
        {
            foreach (A attr in sheet.GetAttributes())
            {
                Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
            }
        }
    }
}
Public Sub GetSheetInfo(ByVal fileName As String)
        ' Open file as read-only.
        Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, False)
            Dim sheets As S = mySpreadsheet.WorkbookPart.Workbook.Sheets

            ' For each sheet, display the sheet information.
            For Each sheet As E In sheets
                For Each attr As A In sheet.GetAttributes()
                    Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value)
                Next
            Next
        End Using
    End Sub

См. также

Ссылка

Class Library Reference