主要测试了jexcelapi和apache的poi两个工具
由于数据量很大都出现了内存不足
java.lang.OutOfMemoryError: Java heap space
jvm的最大内存使用值我设到了100m
因为可能会多线程同时跑这个应用所以不考虑再给多内存了
jexcelapi在每个cell20byte输出65535*15到极限
65535*16就爆了
poi更小一点(这取决于两个工具数据结构设计的不同)
他们都是采用等数据收集完成然后一次写入的方式
读取也是一次把整个文件全部读入内存的方式工作
更新也是整个workbook的copy
所以可以理解对内存开销之大
请问针对excel处理还有没有更好的工具包
或者对这写包是否有针对这个问题的改写方案
谢谢各位了
由于数据量很大都出现了内存不足
java.lang.OutOfMemoryError: Java heap space
jvm的最大内存使用值我设到了100m
因为可能会多线程同时跑这个应用所以不考虑再给多内存了
jexcelapi在每个cell20byte输出65535*15到极限
65535*16就爆了
poi更小一点(这取决于两个工具数据结构设计的不同)
他们都是采用等数据收集完成然后一次写入的方式
读取也是一次把整个文件全部读入内存的方式工作
更新也是整个workbook的copy
所以可以理解对内存开销之大
请问针对excel处理还有没有更好的工具包
或者对这写包是否有针对这个问题的改写方案
谢谢各位了
但这两个包更新时都首先要把整个excel读取到内存
也就是说不存在分批写入的可能
谢谢你的回复
我要做的是提供给客户的报表
csv已经完成了
之前的excel是通过vba从csv中挖掘数据填充的
现在想优化一下直接生成excel提供给客户下载
谢谢你的回复
excel单sheet是只能65535行
到达这个数量我会new sheet
我无法就解决的是内存溢出问题
我考虑过每次写一定数据量
但这两个包更新时都首先要把整个excel读取到内存
也就是说不存在分批写入的可能
谢谢你的回复
===================================================excel是输出,你一次把内存中的数据分几次写到几个wookbook不就可以了~
为什么非要一次把所有数据都写到同一个wookbook呢!
能实现也只能是如你所说的
按照内存最大的容量写多个workbook
但我的需求是替代之前vba的程序
要是还有手工操作的部分就没有太大意义了
谢谢你的回复
小日本公司比较讲究这些
考虑用这些包的一个原因是他们都能指定字体颜色等等所有excel行为
所以输出标题画表格都实现了
就是遇到了内存的限制
大数据量 用java 调用vba 用模板生成。
vba的代码还没有,谁有提供一下, 另外是不是还要建odbc数据源
你在命令行加入下列的参数-Xms512m -Xmx1024m,我想也许不需要这么大的内存
楼顶写了
jvm的最大内存使用值设到了100m
由于存在多进程的问题不考虑再加大
但这两个api打开excel的时候好像都是全部读取数据的
就是说你要是做append的操作
首先得有足够的内存读取文件
然后他的保存机制是复制一份内存中的内容写入到文件
就是说需要两倍于文件内容大小的内存才可以
支持excel的绝大部分功能,包括公式(目前已支持260多个,并且可以实时计算),格式(颜色、字体、边框、甚至样式)、图表(条形图、柱状图、饼图、线图等)、图形对象(线条、矩形、多边形、图片)等等。还可以把excel直接导出为PDF文件。
jxcell在大数据量操作时内存占用比jxl、poi少,速度快(需要关闭实时计算模式)。
我现在分次查询数据(数据量几十万)
分次写入流
OutOfMemoryError没有出现但写的excel文件打开出错
只有第一页数据正确
后面的都乱了(没有对齐到列)
ws.setUseTemporaryFileDuringWrite(true);
.
.
.