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 Open XML se almacena como un paquete, cuyo formato está definido por ISO/IEC 29500. 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 creando una instancia de la WordprocessingDocument clase como se muestra en la instrucción siguiente using
. En la misma instrucción, se abre el archivo document
de procesamiento de texto mediante el Open método , con el parámetro booleano establecido en true
para habilitar la edición del documento.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
Con v3.0.0+ el Close() método se ha quitado en favor de confiar en la instrucción using.
Garantiza que se llama automáticamente al Dispose() método cuando se alcanza 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. Dado que la WordprocessingDocument clase del SDK de Open XML guarda y cierra automáticamente el objeto como parte de su IDisposable implementación y, dado Dispose() que se llama automáticamente al salir del bloque, no es necesario llamar Save() explícitamente o siempre que Dispose() use una using
instrucción.
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 desea 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 "Hola mundo!" almacenado en un archivo de procesamiento de texto con el valor "Hola a todos!". Para llamar al método SearchAndReplace
, puede usar el ejemplo siguiente.
SearchAndReplace(args[0]);
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.
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);
}
}
}