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


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

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

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

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

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

В пакете SDK WordprocessingDocument Open XML класс представляет пакет документов Word. Чтобы работать с документом Word, сначала создайте экземпляр WordprocessingDocument класса из документа, а затем работайте с этим экземпляром. После создания экземпляра класса можно получить доступ к основной части документа, которая содержит текст. Каждый пакет Open XML состоит из нескольких частей. Как минимум, объект должен содержать main часть документа, WordprocessingDocument которая выступает в качестве контейнера для main текста документа. Пакет также может содержать дополнительные части. Обратите внимание, что в документе Word текст в части документа main представлен в пакете в виде XML с помощью WordprocessingML разметки.

Чтобы создать экземпляр класса из документа, вызовите Open(Stream, Boolean) метод . Предоставляется несколько Open методов, каждый из которых имеет разную сигнатуру. В примере кода в этом разделе используется Open метод с сигнатурой, требующей двух параметров. Первый параметр принимает ссылку на поток, из которого требуется открыть документ. Второй параметр — или truefalse и указывает, открыт ли поток для редактирования.

В следующем примере кода вызывается Open метод .

// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{

Структура документа WordProcessingML

Базовая структура WordProcessingML документа состоит из document элементов и body , за которыми следует один или несколько элементов уровня блока, таких как p, который представляет абзац. Абзац содержит один или несколько r элементов. Представляет r собой область текста с общим набором свойств, таких как форматирование. Выполнение содержит один или несколько t элементов. Элемент t содержит диапазон текста. В следующем примере кода показана разметка WordprocessingML для документа, содержащего текст "Пример текста".

    <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:t>Example text.</w:t>
          </w:r>
        </w:p>
      </w:body>
    </w:document>

С помощью пакета SDK Open XML можно создавать структуру документа и содержимое с помощью строго типизированных классов, соответствующих WordprocessingML элементам. Эти классы находятся в пространстве имен. В следующей таблице перечислены имена классов, которые соответствуют documentэлементам , body, p, rи t .

Элемент WordprocessingML Класс пакета SDK Open XML Описание
<document/> Document Корневой элемент основной части документа.
<body/> Body Контейнер для структур уровня блокировки, таких как абзацы, таблицы, примечания и других элементов, описанных в спецификации ISO/IEC 29500.
<p/> Paragraph Абзац.
<r/> Run Прогон.
<t/> Text Диапазон текста.

Дополнительные сведения об общей структуре частей и элементов документа WordprocessingML см. в разделе Структура документа WordprocessingML.

Механизм работы примера кода

После открытия пакета документа Word в основную часть документа можно добавить текст. Чтобы получить доступ к тексту части документа main, необходимо назначить ссылку на текст документа, как показано в следующем сегменте кода.

// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

При доступе к тексту части документа main добавьте текст, добавив экземпляры Paragraphклассов , Runи Text . При этом создается необходимая WordprocessingML разметка. В приведенном ниже примере кода добавляются абзац, пробег и текст.

// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));

Пример кода

Приведенный здесь пример OpenAndAddToWordprocessingStream метода можно использовать для открытия документа Word из уже открытого потока и добавления текста с помощью пакета SDK Open XML. Для вызова этого метода передайте ссылку на открытый поток в качестве первого параметра, а текст — в качестве второго параметра. Например, в следующем примере кода открывается файл, указанный в первом аргументе, и в него добавляется текст из второго аргумента.

string filePath = args[0];
string txt = args[1];

using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
    OpenAndAddToWordprocessingStream(fileStream, txt);
}

Примечание.

Обратите внимание, что OpenAddAddToWordprocessingStream метод не закрывает передаваемый ему поток. Вызывающий код должен сделать это путем упаковки вызова метода в using оператор или явного вызова Dispose.

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

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;


static void OpenAndAddToWordprocessingStream(Stream stream, string txt)
{
    // Open a WordProcessingDocument based on a stream.
    using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
    {

        // Assign a reference to the document body.
        MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
        mainDocumentPart.Document ??= new Document();
        Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

        // Add new text.
        Paragraph para = body.AppendChild(new Paragraph());
        Run run = para.AppendChild(new Run());
        run.AppendChild(new Text(txt));
    }
    // Caller must close the stream.
}