Estoy tratando de hacer una búsqueda básica y reemplazar el texto en un documento de Word .docx usando OpenXML y OpenXmlPowerTools de Eric White (instalado desde NuGet). He seguido ejemplos en este sitio y en su blog, pero por alguna razón nunca veo los cambios que aparecen en el documento cuando lo abro después de ejecutar el código. Aquí está la función simple que estoy ejecutando:

void ReadDocument(string path)
{
    using (WordprocessingDocument doc = WordprocessingDocument.Open(path, true))
    {
        var content = doc.MainDocumentPart.GetXDocument().Descendants(W.p);
        var regex = new Regex(@"the", RegexOptions.IgnoreCase);
        int count = OpenXmlRegex.Replace(content, regex, "NewText", null);
        doc.MainDocumentPart.Document.Save();
        doc.Save();
        MessageBox.Show(count.ToString());
    }
}

El cuadro de mensaje muestra una gran cantidad de reemplazos que debería haber hecho, pero cuando abro el documento no veo reemplazos. Además, no creo que deba necesitar esas llamadas de documento .Guardar (), pero he estado intentando cualquier cosa para que esto funcione. ¿Alguna sugerencia? Gracias

2
Bret Lien 21 mar. 2017 a las 18:31

2 respuestas

La mejor respuesta

Afortunadamente me topé con la respuesta a las 18:52 en el video de YouTube OpenXmlRegex (https: // youtu .be / rDGL-i5zRdk? t = 18m52s) .. Necesito llamar a este método PutXDocument () en MainDocumentPart para que los cambios entren en vigor (en lugar del doc.Save () que estaba tratando de hacer )

doc.MainDocumentPart.PutXDocument();
2
Bret Lien 21 mar. 2017 a las 17:34

Prueba este enfoque:

        using (WordprocessingDocument doc = WordprocessingDocument.Open(@"filePath", true))
        {
            string docText = null;
            using (StreamReader sr = new StreamReader(doc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }

            Regex regexText = new Regex(@"the", RegexOptions.IgnoreCase);
            docText = regexText.Replace(docText, "New text");

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

            doc.MainDocumentPart.Document.Save();               
        }
0
daniell89 21 mar. 2017 a las 15:50