OpenXml在Word中保存Excel嵌入对象c#

问题描述:

我想打开一个嵌入Word文档中的Excel表格。 由于它存储在二进制数据中,我从流中读取并获取它。在excel表和word文档中有一些值,比如$ amount,我替换它们,但是随后当我尝试保存嵌入的对象时,更改不会保存,而word文档中的更改都是这样。错误在哪里?这让我疯狂。OpenXml在Word中保存Excel嵌入对象c#

这里是我的代码

PaymentData data = PaymentData.FromString(args[1]); 
Dictionary<string, string> replaceDic = new Dictionary<string, string>() 
{ 
    { "$value", data.Somedata } 
}; 
string template = Path.GetFullPath("resources/rdoc.docx"); 
string documentText; 

byte[] byteArray = File.ReadAllBytes(template); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true)) 
    { 
     Stream xlStream = wordDoc.MainDocumentPart.EmbeddedPackageParts.First().GetStream(); 
     ProcessTemplate(xlStream, replaceDic); 

     // Reset stream to beginning 
     xlStream.Seek(0L, SeekOrigin.Begin); 

     wordDoc.MainDocumentPart.EmbeddedPackageParts.First().FeedData(xlStream); 

     using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
     { 
      documentText = reader.ReadToEnd(); 
     } 


     foreach (KeyValuePair<string, string> pair in replaceDic) 
     { 
      if (documentText.Contains(pair.Key)) 
       documentText = documentText.Replace(pair.Key, pair.Value); 
     } 

     using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
     { 
      writer.Write(documentText); 
     } 
    } 
    // Save the file with the new name 
    File.WriteAllBytes("resources/rdoc1.docx", stream.ToArray()); 
} 

private static void ProcessTemplate(Stream template, Dictionary<string, string> replaceDic) 
{ 
     using (var workbook = SpreadsheetDocument.Open(template, true, new OpenSettings() { AutoSave = true })) 
     { 
      // Replace shared strings 
      SharedStringTablePart sharedStringsPart = workbook.WorkbookPart.SharedStringTablePart; 
      IEnumerable<x.Text> sharedStringTextElements = sharedStringsPart.SharedStringTable.Descendants<x.Text>(); 
      DoReplace(sharedStringTextElements, replaceDic); 
      // Replace inline strings 
      IEnumerable<WorksheetPart> worksheetParts = workbook.WorkbookPart.GetPartsOfType<WorksheetPart>(); 
      foreach (var worksheet in worksheetParts) 
      { 
       var allTextElements = worksheet.Worksheet.Descendants<x.Text>(); 
       DoReplace(allTextElements, replaceDic); 
      } 

     } // AutoSave enabled 
} 

private static void DoReplace(IEnumerable<x.Text> textElements, Dictionary<string, string> replaceDic) 
{ 
     foreach (var text in textElements) 
     { 
      foreach (KeyValuePair<string, string> pair in replaceDic) 
      { 
       if (text.Text.Contains(pair.Key)) 
        text.Text = text.Text.Replace(pair.Key, pair.Value); 
      } 
     } 
} 
+0

你能分享答案吗 – gs11111 2016-09-05 14:31:51

注释掉该行:

//wordDoc.MainDocumentPart.EmbeddedPackageParts.First().FeedData(xlStream); 

的ProcessTemplate()函数已经已经打开的Excel XML内容流保存。