为了账号安全,请及时绑定邮箱和手机立即绑定

EPPlus 在保存 excel 时抛出 NullReferenceException

EPPlus 在保存 excel 时抛出 NullReferenceException

C#
PIPIONE 2021-07-17 18:00:12
我使用 EPPlus 生成 Excel。这是我的行动 public ActionResult ExportReportToExcel()    {        var model = new ReportingViewModel();        int numOfInvolvedCompanies, numOfRefusedCompanies, numOfSuccessfullCompanies, numOfEmployeesInvolved, projectsCount;        model.Projects = db.GetProjectsReport(1, 1, out projectsCount, out numOfInvolvedCompanies, out numOfRefusedCompanies, out numOfSuccessfullCompanies, out numOfEmployeesInvolved);        model.AllProjectsReport.NumberOfCompanyInvolved = numOfInvolvedCompanies;        model.AllProjectsReport.NumberOfRefusedCompanies = numOfRefusedCompanies;        model.AllProjectsReport.NumberOfSuccessfullParticipated = numOfSuccessfullCompanies;        model.AllProjectsReport.NumberOfEmployeeInvolved = numOfEmployeesInvolved;        ExcelPackage excel =  ExcelGenerator.GenerateReportingExcel(model);        string excelName = "Reporting";        using (var memoryStream = new MemoryStream())        {            try            {                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";                Response.AddHeader("content-disposition", "attachment; filename=" + excelName + ".xlsx");                excel.SaveAs(memoryStream);                memoryStream.WriteTo(Response.OutputStream);                Response.Flush();                Response.End();            }            catch(Exception e)            {                throw;            }        }        return RedirectToAction("Reporting");    }在尝试保存 excel 时,它会抛出 NullReferenceException excel.SaveAs(memoryStream) 行这个案例有趣的一面是它在 2 天前还在工作。突然它停止工作,现在抛出这个错误。
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

这里的问题在于GenerateReportingExcel方法。


在该方法中,您将返回ExcelPackage在 using 语句中创建的对象。


using (ExcelPackage excel = new ExcelPackage())

{

      ...         

      return excel;

}

由于创建的一次性对象using将在您退出块时立即处理,因此在方法之外使用此对象将导致异常,excel.SaveAs(memoryStream)因为excel已被处理。


您必须移动一些代码才能解决此问题。两种潜在的解决方案(取决于您的需求)是:


将excel.SaveAs();调用移入GenerateReportingExcel(),因此它发生在using创建的块中excel

删除using块并手动创建ExcelPackage返回的对象,然后excel.Dispose()在完成后调用ExportReportToExcel()

IE


public static ExcelPackage GenerateReportingExcel(ReportingViewModel)

{

    var excel = new ExcelPackage();

    ...

    return excel;

}

然后在 ExportReportToExcel()


try

{

    ...

    excel.SaveAs(memoryStream);

    excel.Dispose();

    ...

}


查看完整回答
反对 回复 2021-07-31
  • 1 回答
  • 0 关注
  • 258 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信