Apache POI Excel导入采坑记

近期测试给混子提了两个和Excel导入相关的单子:

1、Excel导入数字时自动带上了小数

2、Excel导入时如果中间有换行会导致部分数据没有成功导入,直接丢失

第一个问题描述很清晰,混子很快就定位到了相关的代码

项目使用了Apache POI库来做Excel的导入导出其中获取行更是使用了XSSFRow类,之后再去获取对应列的值,代码里直接使用了

// 省略row获取的逻辑
XSSFRow row;
String cellStr = row.getCell(0).toString();

参考了相关资料,发现直接toString是会导致数字文本读成小数或者科学计数法的形式,解决方法也很简单,只需要使用XSSFCell的setCellType方法将其XSSFCell设置成字符串类型,调用getStringCellValue即可解决。

private String getRowCellStr(XSSFRow row, int index) {
    XSSFCell cell = row.getCell(index);
    if (cell == null) {
        return "";
    }
    cell.setCellType(CellType.STRING);
    return cell.getStringCellValue();
}

第二个问题就比较头疼了,因为表现比较神秘,混子也没怎么接触过Apache POI的Api,光看代码看不出啥问题来,只能一步一步debug,调试过程中发现测试兄弟提上来的附件,实际上有15行,但是代码获取行数的时候只获取了14行,但是之前获取的行数都是准的,于是猜测获取行数的方法可能存在一些问题,于是定位到了相关代码。

int rowNum = sheet.getPhysicalNumberOfRows();

百度了一下发现getPhysicalNumberOfRows是获取有效行数会自动过滤掉空行,而测试兄弟上传的附件正好有个空行,移除这一空行之后,导入正常,实际14行数据,获取共14行。于是将getPhysicalNumberOfRows方法改成了getLastRowNum来获取最大行数,getLastRowNum获取的是下标,原有的逻辑判断也需要从

for(int i=0; i < sheet.getPhysicalNumberOfRows(); i++){
    // 省略业务代码部分
}

变成了

for(int i=0; i < sheet.getLastRowNum() + 1; i++){
    // 省略业务代码部分
}

再把之前有问题的那个附件导入,发现实际15行,代码中也可以获取到空行的部分,至此两个问题均解决。

参考链接:

https://blog.csdn.net/xiaozaq/article/details/54097720

https://blog.csdn.net/qq_36411874/article/details/69062002

你可能感兴趣的:(java)