Share via


Buscar y reemplazar texto en un elemento de documento

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para buscar y reemplazar mediante programación un valor de texto en un documento de procesamiento de texto.


Partes de documento y paquetes

Un documento Office Open XML se almacena como un paquete, cuyo formato se define mediante ISO/IEC 29500-2. El paquete puede incluir varias partes con relaciones entre ellas. La relación entre las partes controla la categoría del documento. Un documento puede definirse como un documento de procesamiento de texto si su elemento de relación de paquete contiene una relación con una parte de documento principal. Si su elemento de relación de paquete contiene una relación con una parte de presentación, puede definirse como un documento de presentación. Si su elemento de relación de paquete contiene una relación con una parte de libro, se define como un documento de hoja de cálculo. En este tema sobre procedimientos se usará un paquete de documentos de procesamiento de texto.


Obtención de un objeto WordprocessingDocument

En el código de ejemplo,empiece abriendo el archivo de procesamiento de texto mediante la creación de una instancia de la clase WordprocessingDocument como se muestra en la siguiente instrucción using. En la misma instrucción, abra el archivo de procesamiento de texto document mediante el método Open con el parámetro Boolean establecido en verdadero para habilitar la edición del documento.

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

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Open, .Save, .Close. Garantiza que se llamará automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue a la llave de cierre. El bloque que sigue a la instrucción using establece un ámbito para el objeto que se crea o se nombra en la instrucción using, en este caso wordDoc. Dado que la clase WordprocessingDocument en Open XML SDK guarda y cierra el objeto automáticamente como parte de su implementación System.IDisposable y que se llama automáticamente a Dispose cuando sale del bloque, no necesita llamar explícitamente a Save y Close, siempre que use using.


Código de ejemplo

En el ejemplo siguiente se muestra una manera rápida y sencilla de buscar y reemplazar. Podría no ser confiable porque recupera el documento XML en formato de cadena. Según la expresión regular que se use, podría reemplazar involuntariamente las etiquetas XML y dañar el documento. Si simplemente quiere buscar en un documento pero no reemplazar el contenido, puede usar MainDocumentPart.Document.InnerText.

En este ejemplo también se muestra cómo usar una expresión regular para buscar y reemplazar el valor de texto "Hello world!" almacenado en un archivo de procesamiento de texto denominado "MyPkg8.docx", con el valor "Hola a todos!". Para llamar al método SearchAndReplace, puede usar el ejemplo siguiente.

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

Después de ejecutar el programa, puede inspeccionar el archivo para ver el cambio en el texto "Hello world!".

A continuación se incluye el código de ejemplo completo en C# y 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);
        }
    }
}

Vea también

Expresiones regulares