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


Открытия электронной таблицы из потока

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

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

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

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

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

using System.IO;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
Imports System.IO
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
Imports System.Linq

Открытие документа из потока

Если используется приложение, такое как Microsoft SharePoint Foundation 2010, которое работает с документами с применением потока ввода-вывода, и требуется использовать пакет SDK Open XML версии 2.0 для работы с одним из этих документов, то теперь это можно сделать очень просто. Это особенно легко, если документ существует и его можно открыть с помощью пакета SDK Open XML версии 2.0. Однако допустим, что документ — это открытый поток в точке кода, тогда где нужно применить пакет SDK для работы с ним? В данном разделе описывается такой сценарий. Метод в примере принимает открытый поток как параметр и добавляет текст в документ, представленный потоком, с помощью пакета SDK Open XML версии 2.0.

Получение объекта SpreadsheetDocument

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

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

Код, вызывающий метод Open, показан в приведенном ниже примере.

// Open the document for editing.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(docName, true))
' Open the document for editing.
Using document As SpreadsheetDocument = SpreadsheetDocument.Open(docName, True)

После открытия пакета документа электронной таблицы в лист книги можно добавить строку. Каждая книга включает часть книги и по крайней мере один лист Worksheet. Для доступа к книге Workbook задайте ссылку на существующий текст документа, представленный частью WorkbookPart, как показано в приведенном ниже примере кода.

WorkbookPart wbPart = document.WorkbookPart;
Dim wbPart As WorkbookPart = document.WorkbookPart

Базовая структура документа SpreadsheetML состоит из элементов Sheets и Sheet, которые ссылаются на листы в книге. Для каждого листа создается отдельный XML-файл. Например, разметка SpreadsheetML для книги с двумя листами MySheet1 и 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

Значение ячейки.

Создание разметки SpreadsheetML для добавления листа

После получения доступа к телу основной части документа можно добавить лист, вызвав метод AddNewPart<T>(String, String) для создания WorksheetPart. В следующем примере добавляется новая часть WorksheetPart.

// Add a new worksheet.
WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
newWorksheetPart.Worksheet.Save();
' Add a new worksheet.
Dim newWorksheetPart As WorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart(Of WorksheetPart)()
newWorksheetPart.Worksheet = New Worksheet(New SheetData())
newWorksheetPart.Worksheet.Save()

Пример кода

В этом примере метод OpenAndAddToSpreadsheetStream используется для открытия электронной таблицы из уже открытого потока и добавления в нее текста. В своей программе вы можете воспользоваться приведенным ниже примером для вызова метода OpenAndAddToSpreadsheetStream для файла Sheet11.xslx.

string strDoc = @"C:\Users\Public\Documents\Sheet11.xlsx";
;
Stream stream = File.Open(strDoc, FileMode.Open);
OpenAndAddToSpreadsheetStream(stream);
stream.Close();
Dim strDoc As String = "C:\Users\Public\Documents\Sheet11.xlsx"
Dim stream As Stream = File.Open(strDoc, FileMode.Open)
OpenAndAddToSpreadsheetStream(stream)
stream.Close()

Обратите внимание на то, что метод OpenAddAndAddToSpreadsheetStream не закрывает переданный поток. Это должен делать вызывающий код.

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

public static void OpenAndAddToSpreadsheetStream(Stream stream)
{
    // Open a SpreadsheetDocument based on a stream.
    SpreadsheetDocument spreadsheetDocument =
        SpreadsheetDocument.Open(stream, true);

    // Add a new worksheet.
    WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();
    newWorksheetPart.Worksheet = new Worksheet(new SheetData());
    newWorksheetPart.Worksheet.Save();

    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>();
    string relationshipId = spreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart);

    // Get a unique ID for the new worksheet.
    uint sheetId = 1;
    if (sheets.Elements<Sheet>().Count() > 0)
    {
        sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
    }

    // Give the new worksheet a name.
    string sheetName = "Sheet" + sheetId;

    // Append the new worksheet and associate it with the workbook.
    Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
    sheets.Append(sheet);
    spreadsheetDocument.WorkbookPart.Workbook.Save();

    // Close the document handle.
    spreadsheetDocument.Close();

    // Caller must close the stream.
}
Public Sub OpenAndAddToSpreadsheetStream(ByVal stream As Stream)
    ' Open a SpreadsheetDocument based on a stream.
    Dim mySpreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(stream, True)

    ' Add a new worksheet.
    Dim newWorksheetPart As WorksheetPart = mySpreadsheetDocument.WorkbookPart.AddNewPart(Of WorksheetPart)()
    newWorksheetPart.Worksheet = New Worksheet(New SheetData())
    newWorksheetPart.Worksheet.Save()

    Dim sheets As Sheets = mySpreadsheetDocument.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()
    Dim relationshipId As String = mySpreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart)

    ' Get a unique ID for the new worksheet.
    Dim sheetId As UInteger = 1
    If (sheets.Elements(Of Sheet).Count > 0) Then
        sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max + 1
    End If

    ' Give the new worksheet a name.
    Dim sheetName As String = ("Sheet" + sheetId.ToString())

    ' Append the new worksheet and associate it with the workbook.
    Dim sheet As Sheet = New Sheet
    sheet.Id = relationshipId
    sheet.SheetId = sheetId
    sheet.Name = sheetName
    sheets.Append(sheet)
    mySpreadsheetDocument.WorkbookPart.Workbook.Save()

    'Close the document handle.
    mySpreadsheetDocument.Close()

    'Caller must close the stream.
End Sub

См. также

Ссылка

Class Library Reference