Apache poi 版本:3.12
今天在用poi解析excel文件时,碰到一个蛋疼的问题。
在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉):
在读取注册日期这个数据时,返回了一串数字,变成了 42149,
断点调试到读取数据的代码,发现poi是正确识别的,但是在读取具体数据时发生了变化:
从上图可以看到,poi把日期数据也归类为 Cell.CELL_TYPE_NUMERIC
数字类型,
并且在cell中是正确读取到了 2015-05-25,但是在使用cell.getNumericCellValue()
方法获取时却发生了变化,返回了42149.0
,
不知道它在里面进行了怎样的处理,但这不是我们想要的结果。
既然如此,我直接用字符串的方式获取可不可以呢?
把代码改为:
- case Cell.CELL_TYPE_NUMERIC:
- value = cell.getStringCellValue();
- DecimalFormat df = new DecimalFormat("0");
- value = df.format(value);
- break;
抛出如下异常:
- Caused by: java.lang.IllegalStateException: Cannot get a text value from a numeric cell
- at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:888)
- at org.apache.poi.xssf.usermodel.XSSFCell.getRichStringCellValue(XSSFCell.java:310)
- at org.apache.poi.xssf.usermodel.XSSFCell.getStringCellValue(XSSFCell.java:261)
说明不可以把它当作字符串类型来处理,
看方法倒是有个cell.getDateCellValue()
,可是在什么时候进行调用呢,我要怎么能知道它是date类型?
通过查询资料发现,poi在Cell.CELL_TYPE_NUMERIC
中又具体区分了类型,Date
类型就是其中一种,把代码再做处理:
- case Cell.CELL_TYPE_NUMERIC:
- if (HSSFDateUtil.isCellDateFormatted(cell)) {
- Date date = cell.getDateCellValue();
- value = DateFormatUtils.format(date, "yyyy-MM-dd");
- } else {
- value = cell.getNumericCellValue();
- DecimalFormat df = new DecimalFormat("0");
- value = df.format(value);
- }
- break;
成功解决问题。
另外如果日期中有精确到日,精确到秒不同精度的,可以用cell.getCellStyle().getDataFormat()
或cell.getCellStyle().getDataFormatString()
来获取格式。