將excel文件內容讀取到datatable數據表中,支持97-2003和2007兩種版本的excel
1.第一種是根據excel文件路徑讀取excel並返回datatable
1 /// <summary> 2 /// 將excel文件內容讀取到DataTable數據表中 3 /// </summary> 4 /// <param name="fileName">文件完整路徑名</param> 5 /// <param name="sheetName">指定讀取excel工作薄sheet的名稱</param> 6 /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param> 7 /// <returns>DataTable數據表</returns> 8 public static DataTable ReadExcelToDataTable(string fileName, string sheetName = null, bool isFirstRowColumn = true) 9 { 10 //定義要返回的datatable對象 11 DataTable data = new DataTable(); 12 //excel工作表 13 Npoi.SS.UserModel.ISheet sheet = null; 14 //數據開始行(排除標題行) 15 int startRow = 0; 16 try 17 { 18 if (!File.Exists(fileName)) 19 { 20 return null; 21 } 22 //根據指定路徑讀取文件 23 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); 24 //根據文件流創建excel數據結構 25 Npoi.SS.UserModel.IWorkbook workbook = Npoi.SS.UserModel.WorkbookFactory.Create(fs); 26 //IWorkbook workbook = new HSSFWorkbook(fs); 27 //如果有指定工作表名稱 28 if (!string.IsNullOrEmpty(sheetName)) 29 { 30 sheet = workbook.GetSheet(sheetName); 31 //如果沒有找到指定的sheetName對應的sheet,則嘗試獲取第一個sheet 32 if (sheet == null) 33 { 34 sheet = workbook.GetSheetAt(0); 35 } 36 } 37 else 38 { 39 //如果沒有指定的sheetName,則嘗試獲取第一個sheet 40 sheet = workbook.GetSheetAt(0); 41 } 42 if (sheet != null) 43 { 44 Npoi.SS.UserModel.IRow firstRow = sheet.GetRow(0); 45 //一行最后一個cell的編號 即總的列數 46 int cellCount = firstRow.LastCellNum; 47 //如果第一行是標題列名 48 if (isFirstRowColumn) 49 { 50 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) 51 { 52 Npoi.SS.UserModel.ICell cell = firstRow.GetCell(i); 53 if (cell != null) 54 { 55 string cellValue = cell.StringCellValue; 56 if (cellValue != null) 57 { 58 DataColumn column = new DataColumn(cellValue); 59 data.Columns.Add(column); 60 } 61 } 62 } 63 startRow = sheet.FirstRowNum + 1; 64 } 65 else 66 { 67 startRow = sheet.FirstRowNum; 68 } 69 //最后一列的標號 70 int rowCount = sheet.LastRowNum; 71 for (int i = startRow; i <= rowCount; ++i) 72 { 73 Npoi.SS.UserModel.IRow row = sheet.GetRow(i); 74 if (row == null) continue; //沒有數據的行默認是null 75 76 DataRow dataRow = data.NewRow(); 77 for (int j = row.FirstCellNum; j < cellCount; ++j) 78 { 79 if (row.GetCell(j) != null) //同理,沒有數據的單元格都默認是null 80 dataRow[j] = row.GetCell(j).ToString(); 81 } 82 data.Rows.Add(dataRow); 83 } 84 } 85 return data; 86 } 87 catch (Exception ex) 88 { 89 throw ex; 90 } 91 }
2.第二種是將excel文件流讀取到datatable中
1 /// <summary> 2 /// 將文件流讀取到DataTable數據表中 3 /// </summary> 4 /// <param name="fileStream">文件流</param> 5 /// <param name="sheetName">指定讀取excel工作薄sheet的名稱</param> 6 /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param> 7 /// <returns>DataTable數據表</returns> 8 public static DataTable ReadStreamToDataTable(Stream fileStream, string sheetName = null, bool isFirstRowColumn = true) 9 { 10 //定義要返回的datatable對象 11 DataTable data = new DataTable(); 12 //excel工作表 13 Npoi.SS.UserModel.ISheet sheet = null; 14 //數據開始行(排除標題行) 15 int startRow = 0; 16 try 17 { 18 //根據文件流創建excel數據結構,NPOI的工廠類WorkbookFactory會自動識別excel版本,創建出不同的excel數據結構 19 Npoi.SS.UserModel.IWorkbook workbook = Npoi.SS.UserModel.WorkbookFactory.Create(fileStream); 20 //如果有指定工作表名稱 21 if (!string.IsNullOrEmpty(sheetName)) 22 { 23 sheet = workbook.GetSheet(sheetName); 24 //如果沒有找到指定的sheetName對應的sheet,則嘗試獲取第一個sheet 25 if (sheet == null) 26 { 27 sheet = workbook.GetSheetAt(0); 28 } 29 } 30 else 31 { 32 //如果沒有指定的sheetName,則嘗試獲取第一個sheet 33 sheet = workbook.GetSheetAt(0); 34 } 35 if (sheet != null) 36 { 37 Npoi.SS.UserModel.IRow firstRow = sheet.GetRow(0); 38 //一行最后一個cell的編號 即總的列數 39 int cellCount = firstRow.LastCellNum; 40 //如果第一行是標題列名 41 if (isFirstRowColumn) 42 { 43 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) 44 { 45 Npoi.SS.UserModel.ICell cell = firstRow.GetCell(i); 46 if (cell != null) 47 { 48 string cellValue = cell.StringCellValue; 49 if (cellValue != null) 50 { 51 DataColumn column = new DataColumn(cellValue); 52 data.Columns.Add(column); 53 } 54 } 55 } 56 startRow = sheet.FirstRowNum + 1; 57 } 58 else 59 { 60 startRow = sheet.FirstRowNum; 61 } 62 //最后一列的標號 63 int rowCount = sheet.LastRowNum; 64 for (int i = startRow; i <= rowCount; ++i) 65 { 66 Npoi.SS.UserModel.IRow row = sheet.GetRow(i); 67 if (row == null || row.FirstCellNum < 0) continue; //沒有數據的行默認是null 68 69 DataRow dataRow = data.NewRow(); 70 for (int j = row.FirstCellNum; j < cellCount; ++j) 71 { 72 //同理,沒有數據的單元格都默認是null 73 Npoi.SS.UserModel.ICell cell = row.GetCell(j); 74 if (cell != null) 75 { 76 if (cell.CellType == Npoi.SS.UserModel.CellType.Numeric) 77 { 78 //判斷是否日期類型 79 if (Npoi.SS.UserModel.DateUtil.IsCellDateFormatted(cell)) 80 { 81 dataRow[j] = row.GetCell(j).DateCellValue; 82 } 83 else 84 { 85 dataRow[j] = row.GetCell(j).ToString().Trim(); 86 } 87 } 88 else 89 { 90 dataRow[j] = row.GetCell(j).ToString().Trim(); 91 } 92 } 93 } 94 data.Rows.Add(dataRow); 95 } 96 } 97 return data; 98 } 99 catch (Exception ex) 100 { 101 throw ex; 102 } 103 }