2011-05-22 32 views
0

我有這樣的方法來加載從數據庫中存儲爲二進制文件文件,然後用參數替換customxml部分。從數據庫加載二進制文件,並將其作爲openxml處理

不知何故,當我將字節轉換成MemoryStream然後處理它不起作用,我的自定義XML部分不會被替換。但是,如果我使用FileStream並從磁盤讀取相同的文件,那麼它完全取代!

MemoryStream有什麼問題?我不能將MemoryStream強制轉換爲FileStream或者創建Stream等的Instance。 任何建議?

private static Stream LoadContent(byte[] content, XmlDocument parameters) 
    { 
     //FileStream works perfectly 
     //Stream fileStream = new FileStream(@"C:\temp\test.docx", FileMode.Open); 

     Stream documentStream = new MemoryStream(); 
     documentStream.Write(content, 0, content.Length); 

     //Processes word file, replace custom xml parts with parameters 
     using (WordprocessingDocument document = WordprocessingDocument.Open(documentStream, true)) 
     { 
      MainDocumentPart mainPart = document.MainDocumentPart; 
      Stream partStream = mainPart.CustomXmlParts.First().GetStream(); 

      using (XmlWriter xmlWriter = XmlWriter.Create(partStream, new XmlWriterSettings { CloseOutput = false })) 
      { 
       parameters.WriteTo(xmlWriter); 
       xmlWriter.Flush(); 
      } 

      mainPart.Document.Save(); 
     } 

     return documentStream; 
    } 

回答

0

您可能想在嘗試將數據寫入到內存之後並在再次讀取之前將內存流的'位置'屬性設置爲0。

實際上,您也可以將字節數組傳遞給memorystream的構造函數,而不是調用writer。

編輯

根據MSDN的「Document.Save」方法將刷新該流允許propper節省我明白了。 (http://msdn.microsoft.com/en-us/library/cc840441.aspx)。 但是,MemoryStream不會在刷新時做任何事情(http://msdn.microsoft.com/en-us/library/system.io.memorystream.flush.aspx)。

您可以嘗試創建一個新的MemoryStream,然後將其作爲參數傳遞給'Document.Save'方法。

+0

我已經試過這兩個建議,位置沒有幫助,如果我使用文件流並從磁盤獲取文件,然後複製到內存不再工作再一件事情! – apprich 2011-05-22 22:33:48

+0

好的,我的編輯中還有1條建議 – 2011-05-22 23:09:41

+0

是的 - 你需要調用Document.Save(),然後Flush(),然後將位置設置爲0。 – 2011-05-28 19:50:17