2015-06-19 2 views
2

У меня есть представление MVC, которое правильно отображает модель. Теперь, когда меня попросили включить функцию Export to Excel на эту страницу, я услышал об EPPlus и попробовал. От this site Я думал, что у меня есть что-то, что просто выполнит эту работу.Модель экспорта EPPlus в Excel: System.NullReferenceException

После внесения изменений, соответствующих моим потребностям, я разработал это. Когда я тестировал функциональность в представлении, это сработало. Я нажал ссылку 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 исключения» ошибка: System.NullReferenceException: Object reference not set to an instance of an object.

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

  • Null лист
  • Null NewFile
  • Null аудит

Это вызывает недоумение, потому что это работает, когда я запускаю это в режиме отладки с помощью VS, но ошибка нулевой ошибки появляется, когда она отключается от производственного сервера.

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

ответ

3

Вы не можете (ну, конечно, НЕ ДОЛЖНЫ) пытаться сохранить непосредственно в файл-файл пользователя из веб-приложения.

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

Это определенно перспективно. Теперь трюк может передать модель из моего представления, когда я нажимаю actionlink. Прямо сейчас, я получаю исключение null для «аудита». –

+0

Это работает, когда я удаляю параметр аудита и помещаю его в функцию. Это сделало трюк - и подумать, что в других статьях форума говорится, что сохранить как вариант невозможно. –

+0

Где находится модель, когда вы показываете ее в своем представлении? Если мое понимание правильное, вы только ОТОБРАЖИТЕ модель в представлении (и не отправляете ее для редактирования?). Если да, то откуда он берется для представления, которое его правильно отображает? Не могли бы вы снова создать? –