excel如果是常规格式,系统则会根据单元格中的内容,自动判断数据类型。
例如单元格里的内容是“2011-10-17”,Excel会自动将其识别为日期类型。如果是文本格式,Excel只会将其作为字符串来处理。
所以在导入时,获取Cell 应该有3种模式(日期格式,数字格式,文本格式);
1.excel中的格式
文本格式:为String,
数字格式:有千位符的要替换 ‘,’ 数字类型也可以转化为String。
日期格式:比较特殊,Cell种所获取的为NUMNIC类型,
需要先判断为NUMNIC ,再判断是否为日期类型,代码如下
if(Cell.CELL_TYPE_NUMERIC == Obj.getCellType()) { //日期类型 if(org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(Obj)) { map.put("params"+k, convertCellToString(Obj)); }else { if(StringHelper.IsEmptyOrNull(getValue(Obj))) { continue; }else { Obj.setCellType(Cell.CELL_TYPE_STRING);//转String类型 map.put("params"+k, getValue(Obj)); } } }else { Obj.setCellType(Cell.CELL_TYPE_STRING); map.put("params"+k, getValue(Obj)); if(StringHelper.IsEmptyOrNull(getValue(Obj))) { continue; } }
上面的Obj 为Cell 对象(row中取的 cell).
convertCellToString方法需要 获取 Cell 中的Date类型从而转化为String 类型,
获取Cell中的Date的方法为cell.getDateCellValue(),通过SimpleDateFormat 转化格式 ('yyyy-MM-dd'),
如果Cell为空会报异常,需要给空字符串,如下:
public static String convertCellToString(Cell cell){ //如果为null会抛出异常,应当返回空字符串 if (cell == null) return ""; //POI对单元格日期处理很弱,没有针对的类型,日期类型取出来的也是一个double值,所以同样作为数值类型 //解决日期2006/11/02格式读入后出错的问题,POI读取后变成“02-十一月-2006”格式
if(cell.toString().contains("-") && DateUtil.isCellDateFormatted(cell)){ String ans = ""; try { ans = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue()); } catch (Exception e) { ans = cell.toString(); } return ans; } cell.setCellType(Cell.CELL_TYPE_STRING); return cell.getStringCellValue(); }
自古英雄出炼狱,从来富贵入凡尘。