用POI上传EXCEL表格 日期解析问题

来源:互联网 发布:七龙珠人物战斗力数据 编辑:程序博客网 时间:2024/05/16 01:33

说一下我遇到的三种情况下日期的解析问题

1.日期在EXCEL中的格式是文本


这是最简单的 和其他文本列获取方式一样 即:

String cell5Value = cell3.getStringCellValue().trim();//获取文本并去空格 或者
String cell5Value = cell5.toString().trim();  

然后可以转换到需要的格式

try {                        detectionDate = sdf.parse(cell5Value);                        } catch (ParseException e) {                        try {                        sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");                        detectionDate = sdf.parse(cell5Value);                        } catch (ParseException e1) {                        try {                        sdf = new SimpleDateFormat("yyyy-MM-dd");                        detectionDate = sdf.parse(cell5Value);                        } catch (ParseException e2) {                        try {                        sdf = new SimpleDateFormat("yyyy/MM/dd");                        detectionDate = sdf.parse(cell5Value);                        } catch (ParseException e3) {                        try {                        sdf = new SimpleDateFormat("yyyyMMdd");                        detectionDate = sdf.parse(cell5Value);                        } catch (ParseException e4) {                        LOGGER.info("上传的检测日期解析错误,日期:" + cell5Value);                        continue;                        }                                                }                        }                        }                        }
2 日期列在EXCEL中就是日期格式的,为了程序的健壮性我测试了一些常见的日期格式

日期格式的列如果直接使用

cell.getStringCellValue();
取会报错:
java.lang.IllegalStateException: Cannot get a text value from a numeric cell

使用 cell5.toString().trim();取值虽然不会报错,但是月份会变成大写,显然不是我想要的结果,这个时候使用下面代码解决:

 if (cell5 != null) {                                              if(cell5.getCellType() == Cell.CELL_TYPE_NUMERIC){ //如果此列的类型是数值型 (数值型包括日期型和数字型)                        boolean b = DateUtil.isCellDateFormatted(cell5); //DateUtil是POI自带的工具类,这句是判断此列是否是日期类型                        if(b){                        detectionDate = cell5.getDateCellValue();//获取日期                        }else{   //else是第三种情况说得                        double value = cell5.getNumericCellValue();                        detectionDate = DateUtil.getJavaDate(value);                        }                        }
3.图2中红色字体标注的日期 是数值型列 但是程序会自动给转换成一个double型的数值型 这个数值表示的是此日期距离元日期的天数,知道这个数值表示的是什么就很简单了,下面直接上代码

double value = cell5.getNumericCellValue();//取数值型列特有的方法                        detectionDate = DateUtil.getJavaDate(value);//使用工具类可以直接转换成日期



原创粉丝点击