将docX创建的文档保存为响应并发送给用户进行下载

本文关键字:并发 给用户 下载 响应 创建 docX 文档 保存 | 更新日期: 2023-09-27 18:21:20

我正试图使用codeplex上令人惊叹的DocX库来创建一个word文档。

当用户单击按钮时,文档就会创建,我希望能够通过响应立即将其发送给用户。。我现在正在做类似的事情:

根据建议编辑的代码

using (DocX Report = DocX.Create(string.Format("Report-{0}.doc", DateTime.Now.Ticks)))
{
    Paragraph p = Report.InsertParagraph();
    p.Append("Title").FontSize(30).Bold()
    .Append("Sub title").FontSize(28)
        .AppendLine()
        .Append(DateTime.Now.Date) 
    ;
    MemoryStream ms = new MemoryStream();
    Report.SaveAs(ms);

    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename='"" + fileName + ".docx'"");
    Response.ContentType = "application/msword";
    Response.Write(ms);
    Response.End();
}

我试过几种变体。。但是我不能实现我想要的。。看到这个答案,我可能会把文档保存在服务器上,然后用io流打开。。但我想避免额外的步骤(然后我也需要删除文件)

我认为在几毫秒内创建一个文件没有什么意义。。必须有一种方法来保存内容并将其发送到响应流。。正确的

我该怎么做?谢谢

编辑:我当前的代码要么弹出无法打开的文件(拒绝访问)错误如果我正在使用文件流,要么下载一个没有任何内容的空文档文件(有时,响应类型会写入文档)


这段代码为我提供了一个MS word文档,其中包含System.IO.MemoryStream作为内容。。


好的,这是最后的工作解决方案:

由于某种原因,DocX库不想直接保存到Response.OutputStream,所以我不得不将其保存到内存流中,并编写内存流以响应,就像Neil&丹尼尔建议。以下是对我有效的方法:

MemoryStream ms = new MemoryStream()
Report.SaveAs(ms);
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename='"" + fileName + ".doc'");
Response.ContentType = "application/msword";
ms.WriteTo(Response.OutputStream);
Response.End();

将docX创建的文档保存为响应并发送给用户进行下载

这可能有点晚,但我找到了一种使用FileStreamResult:的方法

    public FileStreamResult DownloadDocument()
    {
        using (DocX document = DocX.Create(@"Test.docx"))
        {
            // Insert a new Paragraphs.
            Paragraph p = document.InsertParagraph();
            p.Append("I am ").Append("bold").Bold()
            .Append(" and I am ")
            .Append("italic").Italic().Append(".")
            .AppendLine("I am ")
            .Append("Arial Black")
            .Font(new FontFamily("Arial Black"))
            .Append(" and I am not.")
            .AppendLine("I am ")
            .Append("BLUE").Color(Color.Blue)
            .Append(" and I am")
            .Append("Red").Color(Color.Red).Append(".");
            var ms = new MemoryStream();
            document.SaveAs(ms);
            ms.Position = 0;
            var file = new FileStreamResult(ms, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
            {
                FileDownloadName = string.Format("test_{0}.docx", DateTime.Now.ToString("ddMMyyyyHHmmss"))
            };
            return file;
        }
    }

重要的一点是将内存流的位置设置回0,否则它似乎在末尾,并且文件返回为空。

尝试使用MemoryStream而不是FileStream

你当前的代码看起来真的错了:

您将报告保存到当前响应的OutputStream,然后清除该响应(!)

执行Report.SaveAs(response.OutputStream);时,它已经将文件内容写入输出流。你不需要做Response.Write(response.OutputStream);

所以你的代码应该是这样的:

...
Report.SaveAs(response.OutputStream);
Response.AddHeader("content-disposition", "attachment; filename='"" + fileName + ".doc'"");
Response.ContentType = "application/msword";

我觉得你有点前后矛盾。

首先,清除输出,然后添加标题,然后写出内容。

Response.Clear(); 
Response.AddHeader("content-disposition", "attachment; filename='"" + fileName + ".doc'""); 
Response.ContentType = "application/msword"; 
// This writes the document to the output stream.
Report.SaveAs(response.OutputStream); 
Response.End(); 

此外,如果您的文件是docx格式的文件,请将.docx而不是.doc附加到文件名中。