EPPlus导出模型到Excel:System.NullReferenceException

3
我有一个MVC视图,能正确地显示模型。现在被要求在该页面上添加导出到Excel的功能,我听说EPPlus并尝试了一下。从这个网站上,我以为我找到了一个简单的解决方案。
在根据我的需求做出更改后,我开发了这个功能。当我在视图中测试功能时,它能正常工作。我点击html actionlink,Excel文件会正确保存。
public void ExportToExcel(IEnumerable<FourCourseAudit> audit)
{
  string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
  string pathDownload = Path.Combine(pathUser, "Documents");

  FileInfo newFile = new FileInfo(pathDownload + "\\MyExport.xslx");

  using (var excelFile = new ExcelPackage(newFile))
  {
      var worksheet = excelFile.Workbook.Worksheets.FirstOrDefault(x=>x.Name=="Sheet1");
      if (worksheet == null) 
      {
          worksheet.Workbook.Worksheets.Add("Sheet1");
      }

      worksheet.Cells["A1"].LoadFromCollection(Collection:audit, PrintHeaders:true);
      excelFile.Save();
  }
}

然而,当我将网站发布并以普通用户身份进行测试时,我遇到了可怕的“Null Exception”错误:System.NullReferenceException: Object reference not set to an instance of an object. 可能的问题原因是:
  • 空工作表
  • 空newFile
  • 空审核
这很令人困惑,因为在使用VS调试模式运行时它可以正常工作,但在生产服务器上运行时却出现了null异常错误。
那么,我在代码示例中做错了什么明显的事情吗?
1个回答

3

在Web应用程序中,您不能(或者确切地说不应该)直接尝试保存到用户的文件系统。

我猜测您的空引用可能出现在Environment.SpecialFolders...对象中。

更好的方法是将文件作为字节数组返回到控制器操作的响应中。这样,用户就可以选择将文件保存到自己的文件系统中。像这样的代码应该可以解决问题:

public ActionResult ExportToExcel(IEnumerable<FourCourseAudit> audit)
{
    byte[] response;
    using (var excelFile = new ExcelPackage())
    {
        var worksheet = excelFile.Workbook.Worksheets.Add("Sheet1");
        worksheet.Cells["A1"].LoadFromCollection(Collection:audit,PrintHeaders:true);
        response = excelFile.GetAsByteArray();
    }
    return File(response, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Export.xlsx");
}

这绝对是有前途的。现在的问题是,当我点击动作链接时,能否传递模型给我的视图。目前,我在"审计"上得到了一个空异常。 - user4864716
当我移除审计参数并将其放置在函数内部时,此方法有效。这解决了问题--其他论坛文章说另存为选项无法完成,真是不敢相信。 - user4864716
当您在视图中显示模型时,它是从哪里来的?如果我理解正确,您仅在视图中显示模型(而不将其发送回进行编辑?)。如果是这样,那么在正确显示它的视图中,它是从哪里来的?您能否再次生成它? - Stewart_R
啊 - 看起来你在我留言的时间里就解决了问题!很高兴你把它搞定了。 - Stewart_R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接