poi仅可以识别文本、数字等类型,无法对自定义时间格式yyyy-MM-dd hh:mm:ss 进行具体的识别。
在仅需要读取年月日的情况下(yyyy-MM-dd): poi读取到到的单元格格式为 Cell.CELL_TYPE_NUMERIC: //数字、日期
随后会根据DateUtil.isCellDateFormatted(cell)的返回值判断是日期还是数字。
如果是日期则 cellValue = fmt.format(cell.getDateCellValue()); //日期型
如果是数字则 cellValue = String.valueOf(cell.getNumericCellValue()); //数字 即可返回正确的日期。
具体代码如下:
switch(cellType) {
case Cell.CELL_TYPE_STRING: //文本
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC: //数字、日期
if(DateUtil.isCellDateFormatted(cell)) {
cellValue = fmt.format(cell.getDateCellValue()); //日期型
} else {
cellValue = String.valueOf(cell.getNumericCellValue()); //数字
}
break;
}
但是,当我们需要yyyy-MM-dd hh:mm:ss 格式的时候,则不能满足需求。
当cellType是数字、日期的时候(即为0时),调用cell.getNumericCellValue()方法可以获取到当前日期、数字的double值
调用poi里org.apache.poi.ss.usermodel.DateUtil类的getJavaDate(double值)方法即可转换成日期。
以一个单元格内容为 -3-9 01:15:02,单元格格式为自定义格式 yyyy-MM-dd hh:mm:ss 为例。
代码如下:
switch(cellType) {
case Cell.CELL_TYPE_STRING: //文本
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC: //数字、日期
if(DateUtil.isCellDateFormatted(cell)) {
//日期型
Double d = cell.getNumericCellValue();// d = 43533.05210648148;
Date date = DateUtil.getJavaDate();
System.out.println("date:"+DatetimeUtils.date2string(date, "yyyy-MM-dd HH:mm:ss"));
//输出-03-09 01:15:02
} else {
cellValue = String.valueOf(cell.getNumericCellValue()); //数字
}
break;
}
可以发现,cell.getNumericCellValue()方法获取到的double值,就是excel将单元格格式从 日期格式 转换为 文本格式后得到的那个数值。