poi(java操作office利器)在excel中生成大量数据的方式

  • poi 3.9   官网地址:http://poi.apache.org/
  • java 6
前提故事:
  • excel2003之前版本最大数据保存65535行,对于保存大数据量的内容必须用到excel2007.最新版的excel最大可以支持100万的行的数据
  • 碰到的问题,生成大数据的时候产生的list到15万的时候会OOM。
解决办法:
  • 原理是通过poi提供的方法将内存中的数据刷到excel2007中,然后再重新读取。就不会导致对象过多而出现OOM。
www.r66r.net
参见代码如下:

private  int writeExcel(List listconlume,String srcfileName,String targetFile)
    throws FileNotFoundException, IOException {
    RandomAccessFile rddata = new RandomAccessFile(srcfileName, “r”);
    rddata.seek(0);
    Workbook wb = new SXSSFWorkbook(10000);
    Sheet sheet = wb.createSheet();
    String dataline;
    int lines = 0;
    int position = 0;
    while ((dataline = rddata.readLine()) != null) {
    Row row = sheet.createRow(lines);
    String dataTmp[] = dataline.split(“\t”);
    for (int i = 0; i < dataTmp.length; i++) {
    Cell cell = row.createCell(i);
    if (listconlume.get(i * 2 + 1).toString().trim()
    .equals(“string”)) {
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(new String(dataTmp[i]
    .getBytes(“iso-8859-1″), “UTF-8″));
    } else if (listconlume.get(i * 2 + 1).toString().trim()
    .equals(“double”)) {
    if(dataTmp[i]==null||dataTmp[i].toLowerCase().equals(“null”))
    {
    dataTmp[i]=”0.0″;
    }
    cell.setCellValue(Double.parseDouble(dataTmp[i]));
    } else if (listconlume.get(i * 2 + 1).toString().trim()
    .equals(“bigint”)) {
    if(dataTmp[i]==null||dataTmp[i].toLowerCase().equals(“null”))
    {
    dataTmp[i]=”0″;
    }
    cell.setCellValue(Integer.parseInt(dataTmp[i]));
    }
    }
    lines++;
    position += dataline.length() + 1;
    if(lines%10000==0)
    {
    this.sendMessage(“生成数据中…. 完成”+lines+”行”, -1);
    logger.debug(“write data 10000:”+lines);
    }
    }
    rddata.close();
    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream(targetFile);
    wb.write(fileOut);
    fileOut.close();
    return 0;
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值