ASP.NET MVC - 从MemoryStream下载Excel文件(损坏文件)

时间:2016-03-04 07:50:35

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

我正在尝试使用浏览器中的内置下载进行Excel文件下载。在我在控制器中创建Excel文件后,基本上下载工作正常,但是当我尝试在Excel中打开此文件时,我被告知该文件已损坏:

  

Excel无法打开“Report.xlsx”文件,因为文件格式或文件扩展名无效。验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。

强制文件在Excel中打开时,工作表只是空的。我不知道为什么会这样。

代码

我没有展示我是如何创建Excel文件的,因为这是无关紧要的(在使用内存流之前它工作正常)。

var stream = wBook.WriteXLSX(); // Return a MemoryStream (Using DTG.Spreadsheet)

return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");

2 个答案:

答案 0 :(得分:12)

您应将当前流位置设置为0才能成功导出文件。

var stream = wBook.WriteXLSX(); // Return a MemoryStream (Using DTG.Spreadsheet)

stream.Seek(0, SeekOrigin.Begin);

return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");

答案 1 :(得分:3)

我认为你应该返回字节数而不是流。尝试使用这种方法。 (此示例使用ClosedXML)

 byte[] xlsInBytes;
 using (MemoryStream ms = new MemoryStream())
 {
      workbook.SaveAs(ms);
      xlsInBytes = ms.ToArray();
 }

 return File(xlsInBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");