Compartilhar via


Pesquisar e substituir texto em uma parte do documento

Este tópico mostra como usar as classes no SDK do Open XML para Office para pesquisar e substituir programaticamente um valor de texto em um documento de processamento de palavras.


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

No exemplo de código, comece abrindo o arquivo de processamento de texto com a criação de uma instância da classe WordprocessingDocument, como mostra a seguinte instrução using. Na mesma instrução, abra o arquivo de processamento de texto document usando o método Open, com o parâmetro booliano definido como true para habilitar a edição do documento.

    using (WordprocessingDocument wordDoc = 
            WordprocessingDocument.Open(document, true))
    {
        // Insert other code here.
    }

A instrução using fornece uma alternativa recomendada para a sequência típica de .Open, .Save e .Close. 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 do Open XML salva automaticamente e fecha o objeto como parte de sua implementação do System.IDisposable e, como Dispose é chamado automaticamente quando você sai do bloco, não é necessário chamar explicitamente Save e Close - desde que using seja usado.


Código de exemplo

O exemplo a seguir demonstra uma maneira rápida e fácil de pesquisar e substituir. Pode não ser confiável, pois recupera o documento XML no formato da cadeia de caracteres. Dependendo da expressão regular, você pode acidentalmente substituir as marcas XML e corromper o documento. Se você apenas quiser pesquisar em um documento, mas não quiser substituir o conteúdo, você poderá usar MainDocumentPart.Document.InnerText.

Este exemplo também mostra como usar uma expressão regular para pesquisar e substituir o valor de texto , "Olá mundo!" armazenado em um arquivo de processamento de palavras chamado "MyPkg8.docx", com o valor "Olá a todos!". Para chamar o método SearchAndReplace, é possível usar o exemplo a seguir.

    SearchAndReplace(@"C:\Users\Public\Documents\MyPkg8.docx");

Depois de executar o programa, é possível inspecionar o arquivo para ver a alteração no texto, "Hello world!"

Este é o código de exemplo completo em C# e em Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
using System.Text.RegularExpressions;

SearchAndReplace(args[0]);

// To search and replace content in a document part.
static void SearchAndReplace(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string? docText = null;


        if (wordDoc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
        {
            docText = sr.ReadToEnd();
        }

        Regex regexText = new Regex("Hello world!");
        docText = regexText.Replace(docText, "Hi Everyone!");

        using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
        {
            sw.Write(docText);
        }
    }
}

Confira também

Expressões regulares