POI获取excel的使用建议

问题来源

一开始,为了跟别人的旧系统实现远程对接,借助excel来作为中介,来导入到新的库里。而主力就是大名鼎鼎的POI,优秀的读EXCEL组件。

主要建议

  • 若引用jar包后仍出错,请注意Xmlbeans是否有加载,没有请下载,这是因为POI内部会将表解析成xml格式,必须用到这个包。
  • 注意HSSF和XSSF的区别:HSSF用于xls(即旧版),XSSF用于xlsx(即新版)。
  • 合理利用各类get方法:在明确类型的值中使用get系列方法,很快捷方便,但若不明确是数值还是字符,会容易出现类型转换出错的情况,这种情况较建议使用toString(),或自定义。

  • 留意单元格里有公式的情况:


出现这种情况,使用普通的toString()或类似方法会得到,I7,这是因为公式元素位于值元素之上,普通的cell读取会读取第一层。层结构如图。

很明显,读取J6单元格时,cell读取第一个子元素,若存在公式会遮挡值,不利于我们的需求(当然你主要是拿公式则另说)。这时候合理的方法应该是:
yourXSSFRow.getCell(index).getCTCell().getV()
getCTCell()就是获取最基本的xml,通过xml来找到这个值,很明显,值的标签是<v>,所以后面跟了个getV()。
注意:不要什么时候都用getV(),若是非数字型,它会给你匹配成数字。因为xml里字符的表示不一定准确。如下图,A-E其实都是字符串,但xml却读成数字,所以要注意。

  • 空值的判断:主要使用到CELL的类型常量(其他类型的判断也可以如法炮制)
yourRow.getCell(index)!=null && yourRow.getCell(index).getCellType!=CELL.CELL_TYPE_BLANK
  • 删除行方法:用ShiftRows而不用其他方法,因为只有ShiftRows是直接替换,而其他还是会保留空白行。(即是将你要保留的行范围上升替换)
特别注意:用得过多会有bug,注意在try中运行
sheet.shiftRows(最后删行+1,lastRowNum,-删除的跨度);//注意第一个参数不要大于第二个参数,否则会有超限错误



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值