Я не могу передать текстовый документ, который я создаю "на лету", в браузер. Я постоянно получаю сообщение от Microsoft 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();
}
}
Я просмотрел множество ссылок, но ничего не работает. Я много людей используют MemoryStream.WriteTo
а некоторые используют BinaryWrite
- на данный момент я не уверен, что это правильный путь. Также я пробовал более длинный тип контента, т. application/vnd.openxmlformats-officedocument.wordprocessingml.document
но не повезло.
Некоторые скриншоты - даже если вы пытаетесь восстановить, вы получаете те же "части, которые отсутствуют или недействительны"
Решение для тех, кто спотыкается на этот вопрос:
В using
директивы 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();