POI 读写Excel随笔

问题一: POI的用户模式, 和事件模式区别?

用户模式: POI下的userModel相关包, 用户友好, 是把整个文件读取到内存中, 对于海量级别的数据很容易造成内存溢出, 所以一般用来处理数据量比较少的情况
事件模式: POI下面的eventusermodel 相关包, 实现相对复杂, 但是处理速度更快, 占用内存少, 可以用来处理海量的excel数据.

问题二: 之前看到这样的说法: HSSF读写 97-2003版本的微软excel, XSSF可读写 2007版本的, 那么2007版本之后的用什么处理呢? 就没有一种统一的接口么?

解答: 好像还现在还真的没有一个统一的jar包可以处理不同版本的excel问题(如果你知道的话, 可以私信我, 大家一起学习), 目前网上的处理方案大部分都是引入 处理 xls 格式的 poi 和 处理 xlsx格式的 poi-ooxml, 只是在程序处理的时候提供了一种方案, 可以处理不同格式的excel, 具体处理方案请看我的下一篇博客, 里面比较详细的介绍了POI的具体使用.

问题三: POI 怎么解决Excel和表之间的关联关系问题? 采用注解去映射Excel表字段和java实体的关系吗?

解答: 我目前想到的只有定义注解 + 反射去建立联系了, 而且POI 没有提供相关的映射注解, 说实话
这个鬼东西真的不好用, 如果你看到本篇文章, 而且你对excel样式要求不严格, 功能简单的情况下, 我建议你采用 阿里的 EasyExcel 去做Excel导入导出. 这个有定义默认的注解去映射关系

问题四: java 往excel写入数据的时候, 如果java 类型是 int类型, 那么excel 的列 会是整数类型么?

解答: 好像不是, 应该没有去指定具体的类型,不然我在excel中加入一行数据操作对应的列时, 应该不能输入字符和其他类型啊? 但是实际上是可以输入其他类型的, 这就意味着要么类型没有指定, 要么就是excel默认所有数据就是一种无类型的状态, 只有设置了数据有效性, 才会去验证数据的正确性. 验证后是后面的情况. 但是在我读取excel数据的时候 又产生了一个问题, excel中对应的列数据 的获取方式还不一样?
比如下面的表格:
name age
张三 10
李四 20

POI 获取excel 数据的时候, name 列中单元格数据(除表头)要用 字符的方式获取, age列单元格(除表头) 要用 数字的方式获取
这是什么鬼?
excel 不是没有类型的么, 这不是和我前面的结论矛盾了么, 晕!
经过我的查证, 原来是我excel基本功不到位, 往excel写入数据的时候, 如果不先设置某列的数据有效性校验的话, 某一列的数据初始默认是常规格式的, 比如我输入 111, 或者 aaa, 就是默认常规格式, 但是解析的时候, 常规格式的单元格会根据单元格的内容 解析成对应的类型, 比如 111 会被解析成数字类型, aaa 被解析成字符串. 还有一点要注意, 如果输入的是 2021/08/07时候, 会转为日期格式, 10%会转为百分比格式.

如果想了解POI具体使用, 请看我的下篇博文.

总结

  • excel的基本单位是单元格, 类型默认常规, 所以一列数据可以有N中不同的格式, 在做excel的导入和导出的时候要特别注意: 导出excel时要设置列数据的校验, 防止用户输入不符合列要求的数据, 导入的时候同一列的数据必须是同一种数据格式, 不然POI提取数据时候会有问题
  • 选好处理方式真的很重要, 这就是架构为什么这么牛的原因吧, 人家知道怎么在最短的时间采用最有效的处理方式处理一件事, 而我们还在别人的低效处理方式里面打转转.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值