为什么使用OpenXMLSDKw/ASP.NET在内存Word文档中进行流处理会导致“损坏”文档?

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

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

我无法动态地将创建的Word文档流到浏览器。我不断收到微软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();
                }

            }

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

wordDocuments.ave();

此外,要正确地流内存流,请在外部Useuse块中使用此方法:

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.lose();”clausule丢失了,添加了它,并且它工作了(我是在ASP.NETMVC中使用一个操作完成的)

扫码关注云+社区