EPPlus при сохранении Excel выдает NullReferenceException - PullRequest
0 голосов
/ 08 июня 2018

Я использую 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

        public static ExcelPackage GenerateReportingExcel(ReportingViewModel model)
    {
        using (ExcelPackage excel = new ExcelPackage())
        {
            var workSheet = excel.Workbook.Worksheets.Add("Reporting");

            workSheet.TabColor = System.Drawing.Color.Black;
            workSheet.DefaultRowHeight = 12;
            workSheet.Row(1).Height = 20;
            workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            workSheet.Row(1).Style.Font.Bold = true;

            workSheet.Cells[1, 1].Value = "Name";
            workSheet.Cells[1, 2].Value = "Sector";
            workSheet.Cells[1, 3].Value = "N of companies involved";
            workSheet.Cells[1, 4].Value = "N of refused companies";
            workSheet.Cells[1, 5].Value = "N of successful participated";
            workSheet.Cells[1, 6].Value = "N of employee involved";
            workSheet.Cells[1, 7].Value = "Start date";
            workSheet.Cells[1, 8].Value = "Finish date";



            int i = 2;
            foreach (var item in model.Projects)
            {
                workSheet.Cells[i, 1].Value = item.Name;
                workSheet.Cells[i, 2].Value = item.SectorValues;
                workSheet.Cells[i, 3].Value = item.NumberOfCompanyInvolved;
                workSheet.Cells[i, 4].Value = item.NumberOfRefusedCompanies;
                workSheet.Cells[i, 5].Value = item.NumberOfSuccessfullParticipated;
                workSheet.Cells[i, 6].Value = item.NumberOfEmployeeInvolved;
                workSheet.Cells[i, 7].Value = item.StartDate;
                workSheet.Cells[i, 8].Value = item.FinishDate;
                i++;
            }


            workSheet.Cells[i, 2].Value = "Total";
            workSheet.Cells[i, 3].Value = model.AllProjectsReport.NumberOfCompanyInvolved;
            workSheet.Cells[i, 4].Value = model.AllProjectsReport.NumberOfRefusedCompanies;
            workSheet.Cells[i, 5].Value = model.AllProjectsReport.NumberOfSuccessfullParticipated;
            workSheet.Cells[i, 6].Value = model.AllProjectsReport.NumberOfEmployeeInvolved;


            for (int colNum = 1; colNum <= 8; colNum++)
            {
                workSheet.Column(colNum).AutoFit();
            }

            return excel;
        }
    }

При попытке сохранить Excelон выдает строку NullReferenceException excel.SaveAs (memoryStream)

enter image description here

Интересная сторона этого случая заключается в том, что он работал 2 дня назад.И вдруг перестало работать и теперь выдает эту ошибку.

1 Ответ

0 голосов
/ 08 июня 2018

Проблема здесь в методе GenerateReportingExcel.

В этом методе вы возвращаете объект ExcelPackage, созданный в операторе using.

using (ExcelPackage excel = new ExcelPackage())
{
      ...         
      return excel;
}

AsОдноразовые объекты, созданные using, будут удалены, как только вы выйдете из блока, использование этого объекта вне метода вызовет исключение для excel.SaveAs(memoryStream), так как excel уже удален.

You 'Мне придется переместить часть вашего кода, чтобы решить эту проблему.Два возможных решения (в зависимости от ваших потребностей):

  1. Переместите вызов excel.SaveAs(); в GenerateReportingExcel(), чтобы он происходил в блоке using, который создал excel
  2. Удалите блок using и вручную создайте возвращаемый объект ExcelPackage, а затем вызовите excel.Dispose(), когда закончите с ним, в ExportReportToExcel()

т.е.

public static ExcelPackage GenerateReportingExcel(ReportingViewModel)
{
    var excel = new ExcelPackage();
    ...
    return excel;
}

затем в ExportReportToExcel()

try
{
    ...
    excel.SaveAs(memoryStream);
    excel.Dispose();
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...