NPOI 导入 Excel
用 NPOI 导入 Excel 时,大部分情况我们预先是不知道每个单元格的数据类型的。对于日期格式的单元格,如果直接转换为字符串将会得到不可预料的日期格式的字符串(如2013/5/31日期将会被转换成 "31/5/13",或者其他)。因此获取日期格式的单元格数据,需要先判断是否为日期格式。
/// <summary> /// 从EXCEL文件导入到DataTable /// </summary> protected DataTable ImportDataTableFromExcel(System.IO.Stream excelFileStream, string sheetName, int headerRowIndex) { //创建工作簿对象 NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(excelFileStream); //获取参数指定的sheet NPOI.SS.UserModel.ISheet sheet = workbook.GetSheet(sheetName); if (sheet == null) return null; DataTable table = new DataTable(); NPOI.SS.UserModel.IRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; //读取并生成标题行 for (int i = headerRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { NPOI.SS.UserModel.IRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); if (row != null) { for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) == null) dataRow[j] = ""; else { ICell cell = row.GetCell(j); //Cell为非NUMERIC时,调用IsCellDateFormatted方法会报错,所以先要进行类型判断 if (cell.CellType == CellType.NUMERIC && DateUtil.IsCellDateFormatted(cell)) dataRow[j] = cell.DateCellValue.ToString("yyyy/MM/dd"); else { dataRow[j] = row.GetCell(j).ToString(); } } } table.Rows.Add(dataRow); } } excelFileStream.Close(); return table; }
这是一个将Excel文件流导入到DataTable的通用方法。通过DateUtil.IsCellDateFormatted方法可以判断单元格是否为日期格式,是日期格式则可以通过 cell.DateCellValue 获取单元格的日期值。然后可以方便地将其转换为想要的字符串格式。另外 DateUtil.IsCellDateFormatted 方法的参数如果是非 NUMERIC 会报错,所以调用前要确保CellType是否为 NUMERIC。

浙公网安备 33010602011771号