Открытия электронной таблицы из потока
Дата последнего изменения: 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