【问题标题】:ASP.NET MVC - Download Excel file from MemoryStream (Corrupt file)ASP.NET MVC - 从 MemoryStream 下载 Excel 文件(损坏的文件)
【发布时间】:2018-05-11 16:53:29
【问题描述】:

我正在尝试使用浏览器中的内置下载来下载 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");

【问题讨论】:

  • 请显示WriteXLSX的代码。
  • 我猜你正在返回一个位于 end 的流,你只需要在 WriteXLSX 中添加 stream.Position = 0; - 但正如亚历山大所说,我们不能不看就知道。
  • WriteXLSX 是库中的一个方法

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


【解决方案1】:

您应该将当前流位置设置为 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");

【讨论】:

  • 这个是为我做的。感谢您的帮助。
  • @Detilium 我可以知道您在 wBook.WriteXLSX() 这一行中使用的是什么 dll 吗?
  • @AljohnYamaro 我很确定是这个systemexplorer.net/file-database/file/dtg.spreadsheet-dll。虽然距离这个 SO 已经 2 年多了
  • Jesus H Christ,这个 bug 困扰了我一个星期。我不知道直到现在我才看到这个答案,但它对我有用。谢谢老兄。
【解决方案2】:

我认为你应该返回字节数组而不是流。尝试使用这种方法。 (本例使用 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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多