Compartilhar via


Abrir um documento de processamento de texto de um fluxo

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para abrir programaticamente um Word documento de processamento a partir de um fluxo.

Quando Abrir um Documento a partir de um Stream

Se tiver uma aplicação, como uma aplicação do SharePoint, que funciona com documentos que utilizam entrada/saída de fluxo e quer utilizar o SDK Open XML para trabalhar com um dos documentos, esta ação foi concebida para ser fácil de fazer. Isto é particularmente verdade se o documento existir e pode abri-lo com o SDK Open XML. No entanto, suponha que o documento é um fluxo aberto no ponto do seu código onde precisa de utilizar o SDK para trabalhar com o mesmo? Este é o cenário para este tópico. O método de exemplo no código de exemplo aceita um fluxo aberto como um parâmetro e, em seguida, adiciona texto ao documento por trás do fluxo com o SDK Open XML.

Criar um Objeto WordprocessingDocument

No SDK Open XML, a WordprocessingDocument classe representa um pacote de documento Word. Para trabalhar com um documento Word, crie primeiro uma instância da classe a WordprocessingDocument partir do documento e, em seguida, trabalhe com essa instância. Quando cria a instância a partir do documento, pode obter acesso à main parte do documento que contém o texto do documento. Cada pacote Open XML contém um número de partes. No mínimo, um WordprocessingDocument tem de conter uma parte do documento main que funciona como um contentor para o texto main do documento. O pacote também pode conter peças adicionais. Repare que, num documento Word, o texto na parte do documento main é representado no pacote como XML através WordprocessingML de marcação.

Para criar a instância de classe a partir do documento, chame o Open(Stream, Boolean) método . São fornecidos vários Open métodos, cada um com uma assinatura diferente. O código de exemplo neste tópico utiliza o Open método com uma assinatura que requer dois parâmetros. O primeiro parâmetro direciona uma alça para o fluxo a partir do qual pretende abrir o documento. O segundo parâmetro é true ou false e representa se o fluxo está aberto para edição.

O seguinte exemplo de código chama o Open método .

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

Estrutura de um Documento wordProcessingML

A estrutura de documentos básica de um WordProcessingML documento consiste nos document elementos e body , seguidos por um ou mais elementos de nível de bloco, como p, que representa um parágrafo. Um parágrafo contém um ou mais r elementos. Significa r execução, que é uma região de texto com um conjunto comum de propriedades, como formatação. Uma execução contém um ou mais t elementos. O t elemento contém um intervalo de texto. O seguinte exemplo de código mostra a WordprocessingML marcação de um documento que contém o texto "Texto de exemplo".

    <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>

Com o SDK Open XML, pode criar estrutura e conteúdo de documentos com classes com tipos fortes que correspondem a WordprocessingML elementos. Encontrará estas classes no espaço de nomes. A tabela seguinte lista os nomes das classes que correspondem aos documentelementos , body, p, re t .

WordprocessingML Element Abrir Classe SDK XML Descrição
<document/> Document O elemento raiz para a parte do documento principal.
<body/> Body O contentor para as estruturas de nível de bloco, como parágrafos, tabelas, anotações e outros especificados na especificação ISO/IEC 29500 .
<p/> Paragraph Um parágrafo.
<r/> Run Uma execução.
<t/> Text Um intervalo de texto.

Para obter mais informações sobre a estrutura geral das partes e elementos de um documento do WordprocessingML, veja Structure of a WordprocessingML document (Estrutura de um documento wordprocessingML).

Como funciona o código de exemplo

Quando abrir o pacote de documentos Word, pode adicionar texto à parte main documento. Para aceder ao corpo do main parte do documento, atribua uma referência ao corpo do documento, conforme mostrado no segmento de código seguinte.

// 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());

Quando aceder ao corpo da parte do documento main, adicione texto ao adicionar instâncias das Paragraphclasses , Rune Text . Isto gera a marcação WordprocessingML necessária. As linhas seguintes do código de exemplo adicionam o parágrafo, a execução e o texto.

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

Código de exemplo

O método de exemplo OpenAndAddToWordprocessingStream apresentado aqui pode ser utilizado para abrir um documento Word a partir de um fluxo já aberto e acrescentar algum texto com o SDK Open XML. Pode chamá-lo ao transmitir uma alça para um fluxo aberto como o primeiro parâmetro e o texto a adicionar como o segundo. Por exemplo, o seguinte exemplo de código abre o ficheiro especificado no primeiro argumento e adiciona texto do segundo argumento ao mesmo.

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

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

Observação

Repare que o OpenAddAddToWordprocessingStream método não fecha o fluxo transmitido para o mesmo. O código de chamada tem de o fazer ao encapsular a chamada de método numa using instrução ou ao chamar explicitamente Eliminar.

A seguir está o código de exemplo completo em C# e em 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.
}