poi解析excel读取日期为数字的问题

时间:2022-10-19 16:09:06

Apache poi 版本:3.12

今天在用poi解析excel文件时,碰到一个蛋疼的问题。

在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉):

poi解析excel读取日期为数字的问题

在读取注册日期这个数据时,返回了一串数字,变成了 42149,

断点调试到读取数据的代码,发现poi是正确识别的,但是在读取具体数据时发生了变化:

poi解析excel读取日期为数字的问题

从上图可以看到,poi把日期数据也归类为 Cell.CELL_TYPE_NUMERIC 数字类型,

并且在cell中是正确读取到了 2015-05-25,但是在使用cell.getNumericCellValue()方法获取时却发生了变化,返回了42149.0

不知道它在里面进行了怎样的处理,但这不是我们想要的结果。

既然如此,我直接用字符串的方式获取可不可以呢?

把代码改为:

 
  
  1. case Cell.CELL_TYPE_NUMERIC:
  2. value = cell.getStringCellValue();
  3. DecimalFormat df = new DecimalFormat("0");
  4. value = df.format(value);
  5. break;

抛出如下异常:

 
  
  1. Caused by: java.lang.IllegalStateException: Cannot get a text value from a numeric cell
  2. at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:888)
  3. at org.apache.poi.xssf.usermodel.XSSFCell.getRichStringCellValue(XSSFCell.java:310)
  4. at org.apache.poi.xssf.usermodel.XSSFCell.getStringCellValue(XSSFCell.java:261)

说明不可以把它当作字符串类型来处理,

看方法倒是有个cell.getDateCellValue(),可是在什么时候进行调用呢,我要怎么能知道它是date类型?

通过查询资料发现,poi在Cell.CELL_TYPE_NUMERIC中又具体区分了类型,Date类型就是其中一种,把代码再做处理:

 
  
  1. case Cell.CELL_TYPE_NUMERIC:
  2. if (HSSFDateUtil.isCellDateFormatted(cell)) {
  3. Date date = cell.getDateCellValue();
  4. value = DateFormatUtils.format(date, "yyyy-MM-dd");
  5. } else {
  6. value = cell.getNumericCellValue();
  7. DecimalFormat df = new DecimalFormat("0");
  8. value = df.format(value);
  9. }
  10. break;

成功解决问题。

另外如果日期中有精确到日,精确到秒不同精度的,可以用cell.getCellStyle().getDataFormat()cell.getCellStyle().getDataFormatString()来获取格式。

标签: