您的位置:首页 > Web前端

Web前端:POI操作EXCEL出现的单元格格式丢失问题的解决方案

2013-05-13 17:30 429 查看
1、问题截图:



 

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中去,避免了样式的频繁创建和单元格样式丢失问题,大大提升了性能。
 
以上为解决问题时,在web上找到的方法,果断收藏;自己遇到的问题,是一样的,于是果断使用 统一创建样式,封装map 的方式解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poi
相关文章推荐