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();
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
Cảm ơn kd7 cho câu hỏi và câu trả lời của bạn. –