EPPlus 在保存 excel 时抛出 NullReferenceException

我使用 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) 行

http://img.mukewang.com/6105158300019f0112520451.jpg

这个案例有趣的一面是它在 2 天前还在工作。突然它停止工作,现在抛出这个错误。


PIPIONE
浏览 259回答 1
1回答

暮色呼如

这里的问题在于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()IEpublic static ExcelPackage GenerateReportingExcel(ReportingViewModel){    var excel = new ExcelPackage();    ...    return excel;}然后在 ExportReportToExcel()try{    ...    excel.SaveAs(memoryStream);    excel.Dispose();    ...}
打开App,查看更多内容
随时随地看视频慕课网APP