EPPlus导出模型到Excel:System.NullReferenceException

时间:2015-06-19 20:44:30

标签: c# asp.net-mvc-5 epplus

我有一个正确显示模型的MVC视图。现在我被要求在该页面上放置一个导出到Excel功能,我听说EPPlus并尝​​试了一下。从this site开始,我认为我有一些能够胜任这项工作的东西。

在做出改变以满足我的需求后,我开发了这个。当我在视图中测试功能时,它工作正常。我点击了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.

可能的罪魁祸首是:

  • 空工作表
  • Null newFile
  • 空审核

这很令人费解,因为当我在VS的调试模式下运行它时它会起作用,但是当它在生产服务器上运行时会出现空异常错误。

有没有明显的代码示例我做错了?

1 个答案:

答案 0 :(得分: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");
}