Compartilhar via


Pesquisar e substituir texto em uma parte do documento

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para procurar e substituir programaticamente um valor de texto num documento de processamento de palavras.


Pacotes e partes do documento

Um documento Open XML é armazenado como um pacote, cujo formato é definido por ISO/IEC 29500. 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 código de exemplo, começa por abrir o ficheiro de processamento de palavras ao instanciar a WordprocessingDocument classe, conforme mostrado na seguinte using instrução. Na mesma instrução, abre o ficheiro document de processamento de palavras com o Open método , com o parâmetro Booleano definido como para true ativar a edição do documento.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))

Com a v3.0.0+ o Close() método foi removido a favor de depender da instrução using. Garante que o Dispose() método é chamado automaticamente quando a chaveta de fecho é atingida. O bloco que segue a instrução using estabelece um âmbito para o objeto que é criado ou nomeado na instrução using. Uma vez que a WordprocessingDocument classe no SDK Open XML guarda e fecha automaticamente o objeto como parte da respetiva IDisposable implementação e porque Dispose() é automaticamente chamada quando sai do bloco, não tem de chamar Save() explicitamente ou Dispose() desde que utilize uma using instrução.


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 quiser simplesmente procurar um documento, mas não substituir os conteúdos, pode utilizar MainDocumentPart.Document.InnerText.

Este exemplo também mostra como utilizar uma expressão regular para procurar e substituir o valor de texto "Olá, Mundo!" armazenado num ficheiro de processamento de palavras com o valor "Olá Todos!". Para chamar o método SearchAndReplace, pode utilizar o seguinte exemplo.

SearchAndReplace(args[0]);

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.

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