using NPOI.HSSF.UserModel; using NPOI.SS.Formula.Constant; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Data; using System.IO; namespace CaeKnowledge { public class NpoiExcelImportHelper { private static NpoiExcelImportHelper _excelImportHelper; public static NpoiExcelImportHelper Self { get => _excelImportHelper ?? (_excelImportHelper = new NpoiExcelImportHelper()); set => _excelImportHelper = value; } /// /// 读取excel表格中的数据,将Excel文件流转化为dataTable数据源 /// 默认第一行为标题 /// /// excel文档文件流 /// 文档格式 /// 是否转化成功 /// 转换结果消息 /// public DataTable ExcelToDataTable(Stream stream, string fileType, out bool isSuccess, out string resultMsg) { isSuccess = false; resultMsg = "Excel文件流成功转化为DataTable数据源"; var excelToDataTable = new DataTable(); try { // Workbook对象代表一个工作簿,首先定义一个Excel工作薄 IWorkbook workbook; // XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式 #region 判断Excel版本 switch (fileType) { //.XLSX是07版(或者07以上的)的Office Excel case ".xlsx": workbook = new XSSFWorkbook(stream); break; //.XLS是03版的Office Excel case ".xls": workbook = new HSSFWorkbook(stream); break; default: throw new Exception("Excel文档格式有误"); } #endregion 判断Excel版本 var sheet = workbook.GetSheetAt(0); // var rows = sheet.GetRowEnumerator(); var headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum;//最后一行列数(即为总列数) //获取第一行标题列数据源,转换为dataTable数据源的表格标题名称 for (var j = 0; j < cellCount; j++) { var cell = headerRow.GetCell(j); DataColumn column = excelToDataTable.Columns.Add(cell.ToString()); if (j == 0) { column.Unique = true; } } //获取Excel表格中除标题以为的所有数据源,转化为dataTable中的表格数据源 for (var i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++) { var dataRow = excelToDataTable.NewRow(); var row = sheet.GetRow(i); if (row == null) continue; //没有数据的行默认是null  for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null)//单元格内容非空验证 { #region NPOI获取Excel单元格中不同类型的数据 //获取指定的单元格信息 var cell = row.GetCell(j); switch (cell.CellType) { //首先在NPOI中数字和日期都属于Numeric类型 //通过NPOI中自带的DateUtil.IsCellDateFormatted判断是否为时间日期类型 case CellType.Numeric when DateUtil.IsCellDateFormatted(cell): dataRow[j] = cell.DateCellValue; break; case CellType.Numeric: //其他数字类型 dataRow[j] = cell.NumericCellValue; break; //空数据类型 case CellType.Blank: dataRow[j] = ""; break; //公式类型 case CellType.Formula: { IFormulaEvaluator eva = ".xlsx" == fileType ? (IFormulaEvaluator)new XSSFFormulaEvaluator(workbook) : new HSSFFormulaEvaluator(workbook); dataRow[j] = eva.Evaluate(cell).StringValue; break; } //布尔类型 case CellType.Boolean: dataRow[j] = row.GetCell(j).BooleanCellValue; break; //错误 case CellType.Error: dataRow[j] = ErrorConstant.ValueOf(row.GetCell(j).ErrorCellValue); break; //其他类型都按字符串类型来处理(未知类型CellType.Unknown,字符串类型CellType.String) default: dataRow[j] = cell.StringCellValue; break; } #endregion } } excelToDataTable.Rows.Add(dataRow); } isSuccess = true; } catch (Exception e) { resultMsg = e.Message; } return excelToDataTable; } } }