none
C# OpenXml - substituindo texto de documento Word gera arquivo corrompido RRS feed

  • Pergunta

  • Boa tarde galera, 

    Estou fazendo um programa para substituir um texto especifico em arquivo Word que recebo como um byte array,  porém quando escrevo de volta o stream alterado ele gera um arquivo corrompido.

    Alguém já teve esse tipo de problema ?

    • Codigo que estou executando
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Validation;
    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml;
    using System.IO;
    using System.Text.RegularExpressions;
    
    namespace Console_Geracao_WORD
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                SearchAndReplace(@"D:\Teste_bookmark - Cópia.docx");
                SearchAndReplace();
            }
    
    
            public static void SearchAndReplace()
            {
                byte[] templateContent = File.ReadAllBytes("D:\\Teste_bookmark.docx");
                MemoryStream mem = new MemoryStream();
                mem.Write(templateContent, 0, templateContent.Length);
                using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(mem, true))
                {
                    string docText = null;
                    using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
                    {
                        docText = sr.ReadToEnd();
                    }
    
                    Regex regexText = new Regex("Numerocoap");
                    docText = regexText.Replace(docText, "Hi Everyone!");
                    wordDoc.MainDocumentPart.Document.Save();
                    using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
                    {
                        sw.Write(docText);
    
                    }
                    SaveFileStream("D:\\teste_outro_metodo_3.docx", wordDoc.MainDocumentPart.GetStream());
    
                }
            }
    
            private static void SaveFileStream(String path, Stream stream)
            {
                var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
                stream.CopyTo(fileStream);
                fileStream.Dispose();
            }
    
     
    
        }
    }
    

    sexta-feira, 31 de outubro de 2014 16:42

Respostas

  • Olá,

    Este artigo explica como fazer a substituição: http://www.dotnet-geek.co.uk/index.php/openxml-word-templates-processing/

    void ReplaceText(Paragraph paragraph)
     {
        var parent = paragraph.Parent; //get parent element - to be used when removing placeholder
        var dataParam = new WordParameter();
     
        if (ContainsParam(paragraph, ref dataParam)) //check if paragraph is on our parameter list
        {
            //insert text list
            if (dataParam.Name.Contains("string[]")) //check if param is a list
            {
                var arrayText = dataParam.Text.Split(Environment.NewLine.ToCharArray()); //in our case we split it into lines
     
                if (arrayText is IEnumerable) //enumerate if we can
                {
                    foreach (var itemData in arrayText)
                    {
                        Paragraph bullet = CloneParaGraphWithStyles(paragraph, dataParam.Name, itemData);// create new param - preserve styles
                        parent.InsertBefore(bullet, paragraph); //insert new element
                    }
                }
                paragraph.Remove();//delete placeholder
            }
            else
            {
                //insert text line
                var param = CloneParaGraphWithStyles(paragraph, dataParam.Name, dataParam.Text); // create new param - preserve styles
                parent.InsertBefore(param, paragraph);//insert new element
     
                paragraph.Remove();//delete placeholder
            }
        }
    }


    • Editado Deric Ferreira segunda-feira, 3 de novembro de 2014 11:47
    • Marcado como Resposta dscalazans segunda-feira, 3 de novembro de 2014 13:01
    segunda-feira, 3 de novembro de 2014 11:47