Obter o conteúdo da uma parte do documento de um pacote
Este tópico mostra como usar as classes no SDK do Open XML para Office para recuperar o conteúdo de uma parte do documento em um documento de processamento do Word programaticamente.
Pacotes e partes do documento
Um documento Open XML é armazenado como um pacote, cujo formato é definido pela ISO/IEC 29500-2. O pacote pode ter várias partes com relações entre elas. A relação entre as partes controla a categoria do documento. Um documento pode ser definido como um documento de processamento de texto caso seu item de relação do pacote contiver uma relação com uma parte do documento principal. Caso seu item de relação do pacote contenha uma relação com uma parte da apresentação, ela poderá ser definida como um documento de apresentação. Caso seu item de relação do pacote contenha uma relação com uma parte da pasta de trabalho, ela é definida como um documento de planilha. Neste tópico de tutorial, você usará um pacote de documentos de processamento de texto.
Como obter um objeto WordprocessingDocument
O código começa com a abertura de um arquivo de pacote passando um nome de arquivo para um dos métodos open() sobrecarregados (método .NET Compartilhado do Visual Basic ou método estático C#) da classe WordprocessingDocument que usa uma cadeia de caracteres e um valor booliano que especifica se o arquivo deve ser aberto no modo de leitura/gravação ou não. Nesse caso, o valor booliano é falso especificando que o arquivo deve ser aberto no modo somente leitura para evitar alterações acidentais.
// Open a Wordprocessing document for editing.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
{
// Insert other code here.
}
A instrução de uso fornece uma alternativa recomendada ao típico . Criar. Salvar. Fechar sequência. Ela garante que o método Dispose (método interno usado pelo SDK do Open XML para limpar recursos) seja chamado automaticamente quando a chave de fechamento for atingida. O bloco que vem após a instrução using estabelece um escopo para o objeto que é criado ou nomeado na instrução using, neste caso, wordDoc. Como a classe WordprocessingDocument no SDK Open XML salva e fecha automaticamente o objeto como parte de sua implementação System.IDisposable e porque o método Dispose é chamado automaticamente quando você sai do bloco; você não precisa chamar explicitamente Salvar e Fechar─desde que use o uso.
Estrutura de um documento WordProcessingML
A estrutura básica do documento de um documento WordProcessingML consiste nos elementos do documento e do corpo , 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 elementos r . O r significa run, que é uma região de texto com um conjunto comum de propriedades, como a formatação. Uma execução contém um ou mais elementos t . O elemento t contém um intervalo de texto. O exemplo de código a seguir mostra a marcação WordprocessingML para um documento que contém o texto "Texto de exemplo".
<w:document xmlns:w="https://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>
Usando o SDK do Open XML, você pode criar estrutura de documentos e conteúdo usando classes fortemente tipdas que correspondem aos elementos WordprocessingML . Você encontrará essas classes no namespace DocumentFormat.OpenXml.Wordprocessing . A tabela a seguir lista os nomes de classe das classes que correspondem aos elementos documento, corpo, p, r e t .
Elemento WordprocessingML | Classe SDK Open XML | Descrição |
---|---|---|
document | Document | O elemento raiz para a parte do documento principal. |
corpo | Body | O contêiner 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 WordprocessingML, consulte Estrutura de um documento WordprocessingML.
Elemento Comments
Neste how-to, você vai trabalhar com comentários. Portanto, é útil familiarizar-se com a estrutura do < elemento de> comentários. As informações a seguir da especificação ISO/IEC 29500 podem ser úteis ao trabalhar com esse elemento.
Esse elemento especifica todos os comentários definidos no documento atual. É o elemento raiz da parte de comentários de um documento WordprocessingML. Considere o seguinte fragmento wordprocessingML para o conteúdo de uma parte de comentários em um documento WordprocessingML:
<w:comments>
<w:comment … >
…
</w:comment>
</w:comments>
O elemento de comentários contém o comentário único especificado por este documento neste exemplo.
© ISO/IEC29500: 2008.
O fragmento de esquema XML a seguir define o conteúdo desse elemento.
<complexType name="CT_Comments">
<sequence>
<element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
Como funciona o código de exemplo
Depois de abrir o arquivo de origem para leitura, você criará um objeto mainPart instanciando o MainDocumentPart. Em seguida, você pode criar uma referência à parte WordprocessingCommentsPart do documento.
// To get the contents of a document part.
public static string GetCommentsFromDocument(string document)
{
string comments = null;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart;
Em seguida, você pode usar um objeto StreamReader para ler o conteúdo da parte WordprocessingCommentsPart do documento e retornar seu conteúdo.
using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
{
comments = streamReader.ReadToEnd();
}
}
return comments;
Código de exemplo
O código a seguir recupera o conteúdo de uma parte WordprocessingCommentsPart contida em um pacote de documentos do WordProcessing . Você pode executar o programa chamando o método GetCommentsFromDocument , conforme mostrado no exemplo a seguir.
string document = @"C:\Users\Public\Documents\MyPkg5.docx";
GetCommentsFromDocument(document);
A seguir está o exemplo de código completo no C# e no Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
GetCommentsFromDocument(args[0]);
// To get the contents of a document part.
static string GetCommentsFromDocument(string document)
{
string? comments = null;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
{
if (wordDoc is null)
{
throw new ArgumentNullException(nameof(wordDoc));
}
MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart ?? mainPart.AddNewPart<WordprocessingCommentsPart>();
using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
{
comments = streamReader.ReadToEnd();
}
}
return comments;
}