///// <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;
            }
        }