Модель экспорта 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 ответ:
Вы не можете (ну, конечно, не должны) пытаться сохранить непосредственно в файловую систему пользователя из веб-приложения.
Я подозреваю, что ваша нулевая ссылка находится где-то в объекте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"); }