2012-05-19 74 views
16

我無法將我創建的word文檔流式傳輸到瀏覽器。我不斷從Microsoft Word收到一條消息,說明文檔已損壞。使用OpenXML SDK w/ASP.NET導致內存中的Word文檔導致「損壞」文檔

當我通過控制檯應用程序運行代碼並將ASP.NET取出圖片時,正確生成文檔並沒有任何問題。我相信一切都圍繞寫下文件。

這裏是我的代碼:

using (MemoryStream mem = new MemoryStream()) 
      { 
       // Create Document 
       using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(mem, 
      WordprocessingDocumentType.Document, true)) 
       { 
        // Add a main document part. 
        MainDocumentPart mainPart = wordDocument.AddMainDocumentPart(); 

        new Document(new Body()).Save(mainPart); 

        Body body = mainPart.Document.Body; 
        body.Append(new Paragraph(
           new Run(
            new Text("Hello World!")))); 

        mainPart.Document.Save(); 
        // Stream it down to the browser 

        // THIS IS PROBABLY THE CRUX OF THE MATTER <--- 
        Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
        Response.ContentType = "application/vnd.ms-word.document"; 
        mem.WriteTo(Response.OutputStream); 
        Response.End(); 
       } 

      } 

我有looked在很多links - 但沒有相當的工作。我很多人使用MemoryStream.WriteTo和一些使用BinaryWrite - 在這一點上,我不知道什麼是正確的方式。我也嘗試過較長的內容類型,例如application/vnd.openxmlformats-officedocument.wordprocessingml.document,但沒有運氣。

一些截圖 - 即使你試圖恢復你的那些誰在這個問題上絆倒相同的「部分缺失或無效」

解決方案:

的使用在().. WordProcessingDocument指令,您必須調用:

wordDocument.Save();

而且正確地流式傳輸的MemoryStream,在外使用塊使用此:

Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
       Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
       mem.Position = 0; 
       mem.CopyTo(Response.OutputStream); 
       Response.Flush(); 
       Response.End(); 

enter image description here enter image description here

+0

如何添加wordDocument.Save(); ?我試了一下,唯一可能的代碼是.Close(),並且它不適合我。 – RicL

+1

感謝kd7您的問題和答案。 –

回答

7

使用CopyTo代替,存在WriteTo這使得它不能寫入的一個錯誤當目標流不支持一次寫入所有內容時,緩衝區的全部內容。

1

我相信你的ContentType值不正確;即適用於Word 97 - 2003格式。將其更改爲:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

並查看是否解決了問題。

2

我複製並粘貼了你的代碼,注意到:「wordDocument.close();」 clausule失蹤,添加它並且它工作了(我在Asp.NET MVC中做了一個動作)

0

爲了擴大在羅迪的答案和匹配問題這是爲我工作中使用的變量:

Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
mem.Position = 0; 
byte[] arr = mem.ToArray(); 
Response.BinaryWrite(arr); 
Response.Flush(); 
Response.End(); 
相關問題