通过内存流下载生成的 Excel 文件时出现意外行为

本文关键字:文件 意外 Excel 内存 下载 | 更新日期: 2023-09-27 17:57:17

我目前正在尝试使用 MVC 4 生成和下载 ASP.NET 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");
    }
}

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

通过内存流下载生成的 Excel 文件时出现意外行为

这是因为该函数被滥用。从 MSDN:

工作表.保存为方法 (Excel)

将对图表或工作表所做的更改保存在其他文件中。

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

workbook.SaveAs(stream);

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

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

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

这里返回一个空流(流数据从未设置),带有信息的名称.xls

要执行文件下载,您可以在此处查看答案。