近期测试给混子提了两个和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行,代码中也可以获取到空行的部分,至此两个问题均解决。
参考链接: