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(); }