主要测试了jexcelapi和apache的poi两个工具
由于数据量很大都出现了内存不足
java.lang.OutOfMemoryError: Java heap space
jvm的最大内存使用值我设到了100m
因为可能会多线程同时跑这个应用所以不考虑再给多内存了
jexcelapi在每个cell20byte输出65535*15到极限 
65535*16就爆了
poi更小一点(这取决于两个工具数据结构设计的不同)
他们都是采用等数据收集完成然后一次写入的方式
读取也是一次把整个文件全部读入内存的方式工作
更新也是整个workbook的copy
所以可以理解对内存开销之大
请问针对excel处理还有没有更好的工具包
或者对这写包是否有针对这个问题的改写方案
谢谢各位了

解决方案 »

  1.   

    我考虑过每次写一定数据量
    但这两个包更新时都首先要把整个excel读取到内存
    也就是说不存在分批写入的可能
    谢谢你的回复
      

  2.   

    你可以尝试一下用csv格式,这样就可以不用那些API,直接往csv文件里写(该文件是用“,”将数据分隔开的文本文件)
      

  3.   

    to brooksychen(初晨之阳):
    我要做的是提供给客户的报表
    csv已经完成了
    之前的excel是通过vba从csv中挖掘数据填充的
    现在想优化一下直接生成excel提供给客户下载
    谢谢你的回复
      

  4.   

    to li_d_s:
    excel单sheet是只能65535行
    到达这个数量我会new sheet
    我无法就解决的是内存溢出问题
      

  5.   

    shiwen1981(reinhardt) ( ) 信誉:100    Blog   加为好友  2007-04-26 11:44:33  得分: 0  
     
     
       我考虑过每次写一定数据量
    但这两个包更新时都首先要把整个excel读取到内存
    也就是说不存在分批写入的可能
    谢谢你的回复
      
     ===================================================excel是输出,你一次把内存中的数据分几次写到几个wookbook不就可以了~
    为什么非要一次把所有数据都写到同一个wookbook呢!
      

  6.   

    csv格式也可以让客户直接下载,也是用Excel打开,客户应该不关心究竟是csv格式还是xls格式吧?呵呵
      

  7.   

    to daniel_kaka(卡卡):
    能实现也只能是如你所说的
    按照内存最大的容量写多个workbook
    但我的需求是替代之前vba的程序
    要是还有手工操作的部分就没有太大意义了
    谢谢你的回复
      

  8.   

    to brooksychen(初晨之阳):
    小日本公司比较讲究这些
    考虑用这些包的一个原因是他们都能指定字体颜色等等所有excel行为
    所以输出标题画表格都实现了
    就是遇到了内存的限制
      

  9.   

    如果没有好的解决办法,我考虑小数据量直接用jxl 或poi
    大数据量 用java 调用vba 用模板生成。
    vba的代码还没有,谁有提供一下, 另外是不是还要建odbc数据源
      

  10.   

    我想你需要了解Java堆内存和设置一下参数,内存不可能不够用,
    你在命令行加入下列的参数-Xms512m -Xmx1024m,我想也许不需要这么大的内存
      

  11.   

    to zfqjava
      楼顶写了
      jvm的最大内存使用值设到了100m
      由于存在多进程的问题不考虑再加大
      

  12.   

    数据量大肯定要分次写入excel,比如每个单sheet只写入1万行,有10万行数据就生成10个sheet.这样就避免了内存不足和excel单sheet最多行限制的问题.
      

  13.   

    to zhuxr2003:
    但这两个api打开excel的时候好像都是全部读取数据的
    就是说你要是做append的操作
    首先得有足够的内存读取文件
    然后他的保存机制是复制一份内存中的内容写入到文件
    就是说需要两倍于文件内容大小的内存才可以
      

  14.   

    倒,这是个问题,顶!!!!我的项目马上也要搞生成excel报表了.......
      

  15.   

    java下操作excel推荐使用jxcell,商业组件,功能强大。
    支持excel的绝大部分功能,包括公式(目前已支持260多个,并且可以实时计算),格式(颜色、字体、边框、甚至样式)、图表(条形图、柱状图、饼图、线图等)、图形对象(线条、矩形、多边形、图片)等等。还可以把excel直接导出为PDF文件。
    jxcell在大数据量操作时内存占用比jxl、poi少,速度快(需要关闭实时计算模式)。
      

  16.   

    遇到同样问题
    我现在分次查询数据(数据量几十万)
    分次写入流
    OutOfMemoryError没有出现但写的excel文件打开出错
    只有第一页数据正确
    后面的都乱了(没有对齐到列)
      

  17.   

    我也遇到同样的问题,一开始是每个sheet的不能超过65535的问题,后来进行了分页(sheet),但现在也出现了内存溢出的问题.现在正在考虑进行批量数据的追加方式,所谓"追加"我的思路其实就是"修改".如果有好的建议希望一起探讨.[email protected]
      

  18.   

    試試下載 jxl 2.6.12版本,輸出前先加上以下設定:WorkbookSettings ws = new WorkbookSettings();
    ws.setUseTemporaryFileDuringWrite(true);
    .
    .
    .