在内存中使用OpenXML SDK w / ASP.NET导致Word文档导致“损坏”文档怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我无法将我创建的单词文档流式传输到浏览器。我不断从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,但没有运气。

一些截图 - 即使尝试恢复,也会得到相同的“零件丢失或无效”

针对这个问题的人的解决方案:

在WordProcessingDocument的using()..指令中,必须调用:

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

提问于
用户回答回答于

使用CopyTo取而代之的是一个错误WriteTo,这使得它无法写入缓冲区的全部内容时,目标流不支持一气呵成写的一切。

用户回答回答于

我复制并粘贴了你的代码,注意到:“wordDocument.close();” clausule不见了,添加了它并且它工作了(我在Asp.NET MVC中做了一个动作)

扫码关注云+社区