public IDictionary <ExcelDataType, object> ReadTable(IXLTable table) { int rows = table.RowCount(); int columns = table.ColumnCount(); var numericData = new double?[rows, columns]; var textData = new string[rows, columns]; var formula = new string[rows, columns]; for (int i = 1; i <= rows; i++) { for (int j = 1; j <= columns; j++) { IXLCell cell = table.Cell(i, j); switch (cell.DataType) { case XLDataType.Number: numericData[i - 1, j - 1] = cell.GetDouble(); break; case XLDataType.Text: { string textValue = GetSingleCellTextValue(cell); KeyValuePair <ExcelDataType, object> parsed = ParseString(textValue); switch (parsed.Key) { case ExcelDataType.Numeric: numericData[i - 1, j - 1] = (double)parsed.Value; break; case ExcelDataType.Text: textData[i - 1, j - 1] = textValue; break; default: throw new NotImplementedException("I haven't implemented formulas yet"); } break; } } if (cell.HasFormula) { formula[i - 1, j - 1] = cell.FormulaA1; } } } return(new Dictionary <ExcelDataType, object> { { ExcelDataType.Numeric, numericData }, { ExcelDataType.Formulae, formula }, { ExcelDataType.Text, textData } }); }
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); }