Excel导入开发你一定要注意的坑!
前言概述:
Excel导入这里我用的是org.apache.poi这个jar包.需求实际场景简单介绍如下:
用户可以点击新增按钮进行单条数据的配置录入,而导入功能就是上传Excel表格实现了多条数据配置录入
Excel表格的格式如下:
比如上图,sheet1表总共有5行数据,第一行是说明,第二行是名称,第三四五行是配置的数据;第三行对应的附加属性在sheet2表,第四行对应的附加属性在sheet3表,即第N行对应的附加属性在sheet(N-1)表,也就是有N行数据就有对应的N张sheet附加表.
debug发现有坑的地方
//拿到第一个sheet表
Sheet sheet = workbook.getSheetAt(0);
//拿到总行数
int ****rowNum = sheet.getLastRowNum() + 1;//这里这么使用其实没有任何问题,坑就出在用户的操作上
按理说,图一的sheet1表总共有5行,这里的rowNum应该是5.实际上也确实如此:但是!!!假如此时用户只需要导入两行数据了,他把第五行数据删掉,并且也对应地删掉了sheet4表,此时惊奇地发现导入失败了,报空指针异常!
错误的地方出现在这for (int i = 2; i < rowNum; i++) 按理说删除了一行,rowNum 总行数此时应该为4,但是debug发现竟然还是5! 原因是用户的”删除”操作是按了delete,只是该行的数据清除了,而不是把该行整行删掉了,因此空数据的这行出错了并且由于该行还存在(只不过全是空的),但是却没有对应的附加属性sheet表,所以会导致出错.
正确地删除excel该行(是删除该行而不仅仅是”delete”删除数据),记得该行对应的附加属性sheet4表也要删除
Excel表删除记录的正确操作
思考与改进
那么问题来了,如果用户还是忘了删除整行数据,而仅仅是简单地按了delete清空数据,这要怎么搞?
温和地解释教他,如果用户不接受呢? ~~ 打他!!! ~~
咳咳,初步想法:是否可以做个代码健壮性判断,比如,获取到的Excel当前行如果是空内容,则后续的行就不必要进行读取了,并且当前行由于是空的,也不需要去读取对应的附加属性sheet表了(很可能没有然后报空指针异常)