2012-05-19 39 views
16

Tôi không thể phát trực tuyến tài liệu từ mà tôi tạo khi đang di chuyển xuống trình duyệt. Tôi liên tục nhận được một tin nhắn từ Microsoft Word rằng tài liệu bị hỏng.Streaming trong tài liệu Word bộ nhớ bằng cách sử dụng OpenXML SDK w/ASP.NET dẫn đến tài liệu "bị hỏng"

Khi tôi chạy mã thông qua ứng dụng Console và lấy ASP.NET ra khỏi hình ảnh, tài liệu được tạo chính xác mà không gặp sự cố nào. Tôi tin rằng mọi thứ xoay quanh việc viết tệp xuống.

Đây là mã của tôi:

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(); 
       } 

      } 

Tôi có looked vào rất nhiều links - nhưng không khá hiệu quả. Tôi rất nhiều người sử dụng MemoryStream.WriteTo và một số sử dụng BinaryWrite - tại thời điểm này tôi không chắc chắn những gì là đúng cách. Ngoài ra, tôi đã thử loại nội dung dài hơn, ví dụ: application/vnd.openxmlformats-officedocument.wordprocessingml.document nhưng không may mắn.

Một số ảnh chụp màn hình - thậm chí nếu bạn cố gắng để phục hồi bạn nhận được cùng một "bộ phận bị thiếu hoặc không hợp lệ" Giải pháp

cho những người vấp ngã về câu hỏi này:

Trong sử dụng() .. chỉ thị của WordProcessingDocument, bạn phải gọi:

wordDocument.Save();

Ngoài ra một cách chính xác dòng MemoryStream, sử dụng này trong ngoài sử dụng khối:

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

Làm thế nào để bạn thêm một từDocument.Save(); ? Tôi đã cố gắng và mã duy nhất gần với nó là .Close() và điều đó không làm việc cho tôi. – RicL

+1

Cảm ơn kd7 cho câu hỏi và câu trả lời của bạn. –

Trả lời

7

Sử dụng CopyTo thay vào đó, có một lỗi trong WriteTo mà làm cho nó không viết toàn bộ nội dung của bộ đệm khi luồng mục tiêu không hỗ trợ viết mọi thứ trong một lần.

1

Tôi tin rằng giá trị ContentType của bạn không chính xác; đó là định dạng Word 97 - 2003. Thay đổi nó thành:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

và xem điều đó có khắc phục được sự cố không.

2

Tôi đã sao chép và dán mã của bạn và nhận thấy rằng: "wordDocument.close();" clausule là mất tích, thêm nó và nó làm việc (tôi đã làm nó trong Asp.NET MVC witing một hành động)

0

Để mở rộng về câu trả lời Rodion và phù hợp với các biến được sử dụng trong câu hỏi này là những gì làm việc cho tôi:

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(); 
Các vấn đề liên quan