///// <summary> ///// Abre un archivo xlsx y extrae la información de una hoja de excel para convertirla ///// en una lista de objetos expandos usando la función ///// ExtractRowsData(data, worksheet, ssTable, cellFormats); ///// </summary> ///// <param name="workSheet"> Índice cero de la columna de Excel. </param> ///// <returns> Una lista con objetos expandos. </returns> ///// <exception cref="System.IO.IOException">Excepción lanzada cuando el archivo de Excel ///// está siendo usado por otro proceso.</exception> //public static List<ExpandoObject> GetSpreadsheetData(string workSheet, string filePath) //{ // List<ExpandoObject> data = new List<ExpandoObject>(); // using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false)) // { // IEnumerable<Sheet> sheets = spreadsheetDocument.WorkbookPart.Workbook.Descendants<Sheet>(); // WorksheetPart worksheetPart = (WorksheetPart)spreadsheetDocument.WorkbookPart.GetPartById(sheets.First().Id); // Worksheet worksheet = worksheetPart.Worksheet; // SharedStringTablePart sstPart = spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); // SharedStringTable ssTable = null; // if (sstPart != null) // ssTable = sstPart.SharedStringTable; // WorkbookStylesPart workbookStylesPart = spreadsheetDocument.WorkbookPart.GetPartsOfType<WorkbookStylesPart>().First(); // CellFormats cellFormats = (CellFormats)workbookStylesPart.Stylesheet.CellFormats; // ExtractRowsData(data, worksheet, ssTable, cellFormats); // } // return data; //} /// <summary> /// Obtener informacion de una hoja de Excel asumiendo que en la primera fila se nombran las columnas /// y que el resto de las filas contiene información asociada al nombre de las columnas /// </summary> /// <param name="data">La lista de objetos expando que guardará toda la información que se extraiga /// de la tabla.</param> /// <param name="worksheet">El nombre de la hoja de Excel.</param> /// <param name="ssTable">La tabla de cadenas compartidas del archivo xlsx en el cual se encuentra /// la hoja de Excel de la que se extraerán los datos.</param> /// <param name="cellFormats">El formato de celdas.</param> private static void ExtractRowsData(List<ExpandoObject> data, Worksheet worksheet, SharedStringTable ssTable, CellFormats cellFormats) { var columnHeaders = worksheet.FirstRow().Descendants<Cell>().Select(c => Convert.ToString(ProcessCellValue(c, ssTable, cellFormats))).ToArray(); var columnHeadersCellReference = worksheet.FirstRow().Descendants<Cell>().Select(c => c.CellReference.InnerText.Replace("1", string.Empty)).ToArray(); var spreadsheetData = worksheet.SkipFirstRow(); int dataRowIndex = 2; foreach (var dataRow in spreadsheetData) { dynamic row = new ExpandoObject(); Cell[] rowCells = dataRow.Descendants<Cell>().ToArray(); for (int i = 0; i < columnHeaders.Length; i++) { // Selecciona y agrega la celda correcta al archivo de la fila. Cell cell = dataRow.Descendants<Cell>().Where(c => c.CellReference == columnHeadersCellReference[i] + dataRow.RowIndex).FirstOrDefault(); if (cell != null) ((IDictionary<String, Object>)row).Add(new KeyValuePair<String, Object>(dataRowIndex + "," + i, ProcessCellValue(cell, ssTable, cellFormats))); } data.Add(row); ++dataRowIndex; } }