说一下我遇到的三种情况下日期的解析问题
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);//使用工具类可以直接转换成日期