private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger, ApplicationDbContext context) { _logger = logger; _context = context; } public IActionResult Index() { return View(); } ApplicationDbContext _context; public List<Contact>Import (string fileName) { var FilePath = $"{Directory.GetCurrentDirectory()}{@""}" + "\\" + fileName; FileInfo fileInfo = new FileInfo(FilePath); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (ExcelPackage package = new ExcelPackage(fileInfo)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault(); int rowCount = worksheet.Dimension.End.Row; for (int row = 2; row <= rowCount; row++) { Contact con = new Contact(); if (row == 1) con.Libelle = worksheet.Cells[row, row].Value.ToString(); else if (row == 2) con.Id = (int)worksheet.Cells[row, row].Value; _context.Add(con); _context.SaveChanges(); } } return _context.Contacts.ToList(); }Estoy tratando de leer el archivo de Excel con EPPLUS, pero tengo una excepción, dice System.NullReferenceException: 'Referencia de objeto no configurada como una instancia de un objeto'. hoja de trabajo a été null.
Sugeriré que adapte el paradigma de 'programación defensiva' a su enfoque en estos casos. Específicamente, lo que significa no escribir código que actúe asumiendo que algo más va bien sin verificar. Cuando lo haga, creo que el problema se mostrará.
Por supuesto, la comunidad no puede ayudarlo si el problema es con la hoja de Excel, a menos que pueda proporcionarla, pero veo algunas sugerencias útiles sobre el estilo de codificación que creo que pueden ayudarlo a resolverlo usted mismo.
Curioso por saber lo que encontraste si lo intentas :)
De:
public List<Contact>Import (string fileName) { var FilePath = $"{Directory.GetCurrentDirectory()}{@""}" + "\\" + fileName; FileInfo fileInfo = new FileInfo(FilePath); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (ExcelPackage package = new ExcelPackage(fileInfo)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault(); int rowCount = worksheet.Dimension.End.Row; for (int row = 2; row <= rowCount; row++) { Contact con = new Contact(); if (row == 1) con.Libelle = worksheet.Cells[row, row].Value.ToString(); else if (row == 2) con.Id = (int)worksheet.Cells[row, row].Value; _context.Add(con); _context.SaveChanges(); } } return _context.Contacts.ToList(); }A:
public List<Contact> Import(string fileName) { //Try not to use uppercase for local variables, to be able to tell them from member properties var FilePath = $"{Directory.GetCurrentDirectory()}{@""}" + "\\" + fileName; FileInfo fileInfo = new FileInfo(FilePath); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (ExcelPackage package = new ExcelPackage(fileInfo)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault(); //Here ok, because a workbook has at least one sheet int rowCount = worksheet.Dimension.End.Row; for (int row = 2; row <= rowCount; row++) { try { Contact con = new Contact(); var cell = worksheet.Cells[row, row]; if (row == 1) { //Do You know how your package handles in case there is nothing in the cell? con.Libelle = cell.Value?.ToString(); } else if (row == 2) { if (int.TryParse(cell.Value, out int parsedResult)) { con.Id = parsedResult; } else throw new Exception("Invalid data"); //Your direct cast in source code justifies it not being possible to be an exceptional case 'impossible' or you wouldn't write code presuming it ;) } _context.Add(con); _context.SaveChanges(); } catch (Exception ex) { //Let Your debugger help you pinpoint the problem System.Diagnostics.Debug.Write($"problem with row {row} :{ex.ToString()}"); } } } //Are You sure Contacts are initialized, know the implementation of the _context return _context.Contacts?.ToList() ?? null; }