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 document
elementos , body
, p
, r
e 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.
}