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


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

В этом разделе показано, как использовать классы в пакете 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);
        }
    }
}


См. также