【问题标题】:Unexpected behavior on downloading generated Excel file via MemoryStream通过 MemoryStream 下载生成的 Excel 文件时出现意外行为
【发布时间】:2016-07-18 03:37:52
【问题描述】:

我目前正在尝试使用 ASP.NET MVC 4 生成和下载 Excel 文件。

文件生成工作正常,但下载有我不理解的行为。

当我点击我的下载按钮时:

@Html.ActionLink("DOWNLOAD", "Download", "Session", new { sessionId = Model.Session.Id, clientId = Model.Client.Id }, new { @class = "my-link" })

excel 文件以正确的内容打开,但它保存在D:\data\documents\System.IO.MemoryStream 这不是我的默认下载目录。

并且一个空文件保存在D:\downloads\infos.xls,这是我的默认下载目录。

Directory D:\downloads

18/07/2016  05:10    <DIR>          .
18/07/2016  05:10    <DIR>          ..
18/07/2016  05:10                 0 infos.xls
           1 file(s)                0 octets


Directory D:\data\documents

18/07/2016  05:10    <DIR>          .
18/07/2016  05:10    <DIR>          ..
18/07/2016  05:10             8 521 System.IO.MemoryStream
           1 file(s)                8 521 octets

这是我的控制器方法:

using Excel = Microsoft.Office.Interop.Excel;

[Authorize]
public class SessionController : ControllerBase
{
    [HttpGet]
    public ActionResult Download(int sessionId, int clientId)
    {
        /* [...] Retreive infos */
        
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook workbook = excelApp.Workbooks.Add(System.Reflection.Missing.Value);
        Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
    
        /* [...]  Insert infos in worksheet */

        byte[] data;

        using (var stream = new System.IO.MemoryStream())
        {
            workbook.SaveAs(stream);
            stream.Position = 0;
            data = stream.ToArray();
        }

        return File(data, "application/vnd.ms-excel", "infos.xls");
    }
}

为什么有两个下载的文件?

【问题讨论】:

    标签: c# asp.net excel asp.net-mvc-4


    【解决方案1】:

    这是因为该功能被滥用。来自MSDN

    Worksheet.SaveAs 方法 (Excel)

    将图表或工作表的更改保存在不同的文件中。

    输入需要一个文件名,但您放入了一个流对象

    workbook.SaveAs(stream);
    

    这就是在您的默认用户文件夹中创建奇怪文件的原因。

    要了解创建空文件的原因,请查看以下代码:

    return File(data, "application/vnd.ms-excel", "infos.xls");
    

    这里返回一个空流(从不设置流数据),名称为 infos.xls

    要执行文件下载,您可以查看答案here

    【讨论】:

    • 谢谢。我没有注意到我看到的示例使用了另一个库。我从 Microsoft Interop 切换到 EPPlus,它工作正常,现在我可以将文件保存在 MemoryStream 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2021-09-17
    • 2019-10-27
    • 2011-04-11
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多