private List <string> ObtenerListaDeClasesDesdeXlsx(IXLWorksheet hoja, out List <ZonaDePosicionamiento> listaZonaDePosicionamientos) { var listaDeErrores = new List <string>(); listaZonaDePosicionamientos = new List <ZonaDePosicionamiento>(); try { // Los indices siempre son 1, 2, 3 y 4 porque son las columnas del XLSX generado en la descarga de plantilla, la cual es la aceptada para la carga. const int indiceBodegas = 1; const int indiceZona = 2; const int indiceMandatorio = 3; const int indiceFamilia = 4; // Almacena los registros de la plantilla en TablaIXL IXLTable tableClass = hoja.Table("Clases"); var cantidadFilas = tableClass.RowCount(); // Obtiene la fila de los encabezados var primeraFilaUsada = tableClass.FirstRowUsed(); var fila = primeraFilaUsada.RowUsed(); // Baja una fila para leer la data fila = fila.RowBelow(); var indice = 2; // Recorre las filas de la tabla sin contar el encabezado. for (int i = 1; i < cantidadFilas; i++) { // Valida que las columnas tengan data if (string.IsNullOrEmpty(fila.Cell(indiceBodegas).GetString()) || string.IsNullOrEmpty(fila.Cell(indiceZona).GetString()) || string.IsNullOrEmpty(fila.Cell(indiceMandatorio).GetString()) || string.IsNullOrEmpty(fila.Cell(indiceFamilia).GetString())) { var mensaje = $"La fila No.{indice} tiene campos vacios."; listaDeErrores.Add(mensaje); } else { var zonaPosicionamiento = new ZonaDePosicionamiento { WAREHOUSE_CODE = fila.Cell(indiceBodegas).GetString() , ZONE = fila.Cell(indiceZona).GetString() , MANDATORY = (fila.Cell(indiceMandatorio).GetString().Equals("Si")) , FAMILY = int.Parse(fila.Cell(indiceFamilia).GetString()) }; Console.WriteLine(zonaPosicionamiento); // Agrega las clases encontradas en el XLSX a la lista de clases listaZonaDePosicionamientos.Add(zonaPosicionamiento); } // Baja una fila para continuar leyendo el XLSX fila = fila.RowBelow(); indice++; } } catch (Exception e) { InteraccionConUsuarioServicio.Alerta($"Error al leer la hoja de Familia: {e.Message}"); } return(listaDeErrores); }