通过内存流下载生成的 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");
}
}
为什么有两个下载的文件?
这是因为该函数被滥用。从 MSDN:
工作表.保存为方法 (Excel)
将对图表或工作表所做的更改保存在其他文件中。
输入需要文件名,但您放入了流对象。
workbook.SaveAs(stream);
这就是为什么在您的默认用户文件夹中创建奇怪的文件的原因。
要了解创建空文件的原因,请检查以下代码:
return File(data, "application/vnd.ms-excel", "infos.xls");
这里返回一个空流(流数据从未设置),带有信息的名称.xls
要执行文件下载,您可以在此处查看答案。