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

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

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);//使用工具类可以直接转换成日期



猜你喜欢

转载自blog.csdn.net/Yanci_/article/details/78330283