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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Apache POI 可以很方便地操作 Excel 文件。下面是一个简单的示例代码,演示如何使用 Apache POI 导入 Excel 文件: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class ExcelImporter { public static void main(String[] args) { try { // 创建文件输入流 FileInputStream fis = new FileInputStream(new File("test.xlsx")); // 通过 WorkbookFactory 创建 Workbook 对象 Workbook workbook = WorkbookFactory.create(fis); // 获取第一个 sheet Sheet sheet = workbook.getSheetAt(0); // 遍历 sheet 中所有的行 for (Row row : sheet) { // 遍历行中的所有单元格 for (Cell cell : row) { // 打印单元格的值 System.out.print(cell + "\t"); } System.out.println(); } // 关闭文件输入流 fis.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们首先创建了一个文件输入流,然后通过 `WorkbookFactory` 创建了一个 `Workbook` 对象。接着,我们获取了第一个 sheet,并遍历了 sheet 中的所有行和单元格,打印出每个单元格的值。最后,我们关闭了文件输入流。 需要注意的是,这里假设我们要导入Excel 文件名为 `test.xlsx`,并且该文件和示例代码在同一个目录下。如果文件名或路径不同,需要根据实际情况修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值