public static DataTable GenerateDataTableFromExcel(string excelfileName) { var dt = new DataTable(); using (var spreadSheetDocument = SpreadsheetDocument.Open(excelfileName, false)) { var workbookPart = spreadSheetDocument.WorkbookPart; var sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild <Sheets>().Elements <Sheet>(); var relationshipId = sheets.First().Id.Value; var worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId); var workSheet = worksheetPart.Worksheet; var sheetData = workSheet.GetFirstChild <SheetData>(); var rows = sheetData.Descendants <Row>(); if (rows == null) { return(dt); } var enumerable = rows.ToList(); // dt.Columns.Add("Blank"); Global.ClearColumnCellReferenceMaps(); foreach (var openXmlElement in enumerable.ElementAt(0)) { var cell = (Cell)openXmlElement; var columnName = GetCellValue(spreadSheetDocument, cell); dt.Columns.Add(columnName); var columnIndex = Regex.Replace(cell.CellReference.Value, @"[\d-]", string.Empty); Global.ColumnNameCellReferenceMap.Add(columnName, columnIndex); } Global.ClearRowIndexes(); foreach (var row in enumerable) //this will also include your header row... { var tempRow = dt.NewRow(); int i; if (row.ToString() == String.Empty) { } for (i = 0; i < row.Descendants <Cell>().Count(); i++) { //tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i)); var cell = row.Descendants <Cell>().ElementAt(i); var actualCellIndex = CellReferenceToIndex(cell); tempRow[actualCellIndex] = GetCellValue(spreadSheetDocument, cell); } try { if (string.IsNullOrEmpty(tempRow[0].ToString())) { //last row of excel } if (row.RowIndex > 1 && !string.IsNullOrEmpty(tempRow[0].ToString())) { Global.MetaIdRowIndexMap.Add(int.Parse(tempRow[0].ToString()), (int)row.RowIndex.Value); } dt.Rows.Add(tempRow); } catch (Exception exception) { RConsole.WriteLineRed(exception.StackTrace + exception.InnerException?.StackTrace); } } dt.Rows.RemoveAt(0); //...so i'm taking it out here. } return(dt); }