Откройте документ электронной таблицы из потока
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного открытия документа электронной таблицы из потока.
Возможные условия для открытия документа из потока
Если у вас есть приложение, например Microsoft SharePoint Foundation 2010, которое работает с документами с помощью потоковых входных и выходных данных, и вы хотите использовать пакет SDK Open XML для работы с одним из документов, это легко сделать. Это особенно верно, если документ существует и его можно открыть с помощью пакета SDK Open XML. Когда нужно использовать SDK работы с ним в этом случае? Этот сценарий описывается в этом разделе. Пример метода в примере кода принимает открытый поток в качестве параметра, а затем добавляет текст в документ за потоком с помощью пакета SDK Open XML.
Объект SpreadsheetDocument
Базовая структура документа SpreadsheetML состоит из Sheets элементов и Sheet , ссылающихся на листы в Workbook. Для каждого Worksheetсоздается отдельный XML-файл. Например, элемент SpreadsheetML для книги с двумя листами под названиями 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.
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/> |
Workbook | Корневой элемент основной части документа. | |
<sheets/> |
Sheets | Контейнер для структур уровня блока, таких как лист, fileVersion и | другие, указанные в спецификации ISO/IEC 29500 . |
<sheet/> |
Sheet | Лист, указывающий на файл определения листа. | |
<worksheet/> |
Worksheet | Файл определения лист с данными листа. | |
<sheetData/> |
SheetData | Таблица ячеек, сгруппированных по строкам. | |
<row/> |
Row | Строка в таблице ячеек. | |
<c/> |
Cell | Ячейка в строке. | |
<v/> |
CellValue | Значение ячейки. |
Создание разметки SpreadsheetML для добавления листа
Если у вас есть доступ к тексту части документа main, вы добавляете лист, вызывая AddNewPart метод для создания нового WorksheetPart. В следующем примере кода добавляется новый WorksheetPart
объект .
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Пример кода
В этом примере OpenAndAddToSpreadsheetStream
метод можно использовать для открытия документа электронной таблицы из уже открытого потока и добавления к нему текста. Далее представлен полный пример кода на языках C# и Visual Basic.
using (FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite))
{
OpenAndAddToSpreadsheetStream(fileStream);
}
Обратите внимание, что OpenAddAndAddToSpreadsheetStream
метод не закрывает передаваемый ему поток. Вызывающий код должен сделать это вручную или с помощью инструкции using
.
Далее представлен полный пример кода на языках C# и Visual Basic.
static void OpenAndAddToSpreadsheetStream(Stream stream)
{
// Open a SpreadsheetDocument based on a stream.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, true))
{
if (spreadsheetDocument is not null)
{
// Get or create the WorkbookPart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Workbook workbook = workbookPart.Workbook ?? new Workbook();
if (workbookPart.Workbook is null)
{
workbookPart.Workbook = workbook;
}
Sheets sheets = workbook.GetFirstChild<Sheets>() ?? workbook.AppendChild(new Sheets());
string relationshipId = 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) ?? (uint)sheets.Elements<Sheet>().Count() + 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);
}
}
}