、问题截图:
2、问题分析:
在网上找过一些答案,都说是excel2003版本的问题,对单元格的样式有限制。当时公司没有网络,也不能查找到更多的资料、
后经过领导批准找到另外的资料图:
3、执行测试:
<1> 针对单个SHEET和多个SHEET两种情况,执行批量写入,查看在多少数据量时会发生格式丢失异常。
分析结果:执行单个SHEET写入,数据总行数超过5000行就会出现格式丢失;多个SHEET写入,数据总行超过2500行会出现格式丢失。
<2> 针对出现格式丢失的SHEET,再次执行该SHEET的写入,查看是否是由于SHEET本身引起的问题。
分析结果:未发现异常,格式全部正确。
<3> 手动修改生成的EXCEL的单元格格式,查看数据是否可以回复正常。
分析结果:经过手动格式刷刷新,单元格格式恢复正常,数据也恢复正常。
4、最后讨论结果
EXCEL本身确实对同一种样式的单元格写入有数量的限制。若用户工作簿中存在着4000种以上的单元格格式组合,那么在执行许多命令时(包括排序),Excel都会提示“不同的单元格格式太多”。
这里的单元格格式组合,指工作簿中任意单元格,若所设置的单元格格式与其他单元格有任何细微的差别,即成为一种单元格格式组合。例如,有两个单元格,都设置单元格格式为红色宋体12号字,若其中一个单元格的数字格式使用2位小数,而另一个单元格的数据格式不使用小数,则两个单元格各使用一种单元格格式组合。
但经过多次不同形式的测试我们发现尽管EXCEL有诸多格式限制,但其本身只是一个数据的载体不负责数据的写入,写入的过程是我们使用POI框架完成的操作。其单元格的样式也是通过POI框架构建并写入的,如果我们可以在写入时控制单元格样式的创建,应该可以解决这个问题
5、解决方式
通过观察汇总流程和代码,现在源系统中的数据写入功能执行无误,但性能不佳。且存在单元格格式频繁创建的弊端,源系统创建的单元格样式是跟随单元格的创建而生成的,假设1张表有10行数据,10列,那么创建单元格样式就要重复执行100次,效率十分低,并且会导致“单元格丢失”问题的出现。通过分析,我们得知系统已规范了excel中的单元格格式总计6种分别是常规类型、会计专用、整数、日期yyyy-mm、日期yyyy-mm-dd、百分比。所以我们可以提前的创建好这六种单元格样式,在不同的单元格使用时直接调用就可以,避免了样式的批量创建,不仅避免了单元格丢失异常,还大大提升了性能。通过优化子系统部分代码,将单元格样式提前创建放入HashMap中,到使用时直接调用。测试结果显示问题未出现,单元格格式未丢失,数据正确。
6、具体代码跟踪
<1>问题代码
<2>新增代码
7、结论:
使用POI写入excel数据时,如果使用的excel版本是2003,当批量创建过多的样式(格式)时容易发生单元格丢失问题(这样操作性能也差劲),所以需要严格控制单元格样式的创建和生成,提前将样式创建,放入Map中,等用到的时候直接从Map中去,避免了样式的频繁创建和单元格样式丢失问题,大大提升了性能。