How can I read and change a string and save in Microsoft Word using OpenXmlPowerTools

51 Views Asked by At

I'm using OpenXmlPowerTools to merge several report template Microsoft Word.

    var sources = new List<Source>();
    foreach (var fileName in fileName_List)
    {
         using (FileStream stream = System.IO.File.Open(filename, FileMode.Open))
         {
            var memoryStream= new MemoryStream();
            stream.CopyTo(memoryStream);
            sources.Add(new Source(new WmlDocument("", memoryStream), true));
         }
    }
    var mergedDoc = DocumentBuilder.BuildDocument(sources);
    mergedDoc.SaveAs(resultFile);

in this case, all the files will be merged well without any problem. But I need to make some changes on each file before they merge. I used the below code :


foreach (var filename in fileName_List)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filename, true))
    using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
    {
        var docText = sr.ReadToEnd();
        docText = docText.Replace("PlaceHolder", "NewValue");
        using (var memoryStream= GenerateStreamFromString(docText))
        {
            sources.Add(new Source(new WmlDocument("", memoryStream), true));
        }
    }
}
public static MemoryStream GenerateStreamFromString(string s)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

This time I get the following error when mergedDoc.SaveAs(resultFile) called :

File contains corrupted data

Also, I used the below code instead of the GenerateStreamFromString method and again get the same error:

   var docText = sr.ReadToEnd();
   docText = docText.Replace("PlaceHolder", "NewValue");
   byte[] bytes = Encoding.ASCII.GetBytes(docText);
   sources.Add(new Source(new WmlDocument("", bytes), true));
0

There are 0 best solutions below