Apache poi 版本:3.12

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

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

image

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

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

image

从上图可以看到,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()来获取格式。

你可能感兴趣的内容
0条评论

selfly

交流QQ群:32261424
Owner