Модель экспорта EPPlus в Excel: система.Исключение NullReferenceException


У меня есть представление 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.

Возможные виновники:

  • нулевой лист
  • Null newFile
  • нулевой аудит

Это озадачивает, потому что он работает, когда я запускаю его в режиме отладки с VS, но ошибка null exception появляется, когда он работает с рабочего сервера.

Есть ли что-то очевидное, что я делаю неправильно в примере кода?

1 3

1 ответ:

Вы не можете (ну, конечно, не должны) пытаться сохранить непосредственно в файловую систему пользователя из веб-приложения.

Я подозреваю, что ваша нулевая ссылка находится где-то в объекте 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");
}