• 超级恶心的大批量数据导出到Excel 分类: java 20100714 16:11 866人阅读 评论(1) 收藏


    真无语了,咋那么多客户要导出数据到Excel?还都动不动就好几万条到几十万?导出了都看不看啊,真是倒霉催的。唉,牢骚一顿,进入正题。

    业务功能比较简单就是把数据库内的数据,导出到Excel文件,文件里也没有什么修饰,比如颜色,底纹之类的啥都不带,纯数据文件,客户要拿这个文件查看,做些筛选之类的操作。

      起初就是用poi,很简单的方式,生成Excel并输出到输出流,直接让用户下载。可惜好景不长,突然数据到了19w条,撑不住了,5万左右就内存溢出了,网上找了很多文章,基本上都无法搞定。

    1.首先,poi和jxl这2个主要开发包,都是要把Excel放入内存,最后写文件的时候一起写入。所以写入之前所有的row,cell都在内存,不能释放,造成内存溢出。也因为以上原因,分次写入也是行不通的。

    2.网上有篇文章“解决大批量数据导出Excel产生内存溢出的方案”,方法是生成一些小的临时文件,最后再合并为大文件,而且用了一些poi的二进制方式。但是使用以后,能处理的数据增加了一倍,但是还是难逃溢出的厄运。文章作者说可以避免溢出,但是我这确实不行。二进制写入的方式我是实在找不到文档,也作罢。

       实在无奈,想起了很早以前,使用odbc操作Excel的方式,一试,还真行,不带溢出的。本来嘛,就是循环执行些sql语句,这要是再溢出,只能怪自己太烂了。如下

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      String url = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};readOnly=false;DBQ=d://t.xls";
      Connection con = DriverManager.getConnection(url);

    连接好Excel后,直接insert,没错。url中readOnly=false是必须的,否则无法写入。至于sheet,可以使用poi或jxl建立,也能用数据库连接后的create table建立,方便得很。

    有缺陷的话,就是只能在windows上运行,不能处理样式。终极解决方式还是bin模式。

    还有一种方法,就是用XMl方式存储Excel,就是某些Excel特性不支持了,比如嵌入图片。

    在此记录一下,备忘。


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yys79/archive/2009/02/06/3866204.aspx

  • 相关阅读:
    hash介绍
    序列化
    面向对象编程
    计算机系统基础知识05
    19、Python之队列
    18、Python之多线程
    17、Python之paramikomo
    16、Python之socket网络编程
    15、Python之异常处理
    14、Python之反射
  • 原文地址:https://www.cnblogs.com/configman/p/4657612.html
Copyright © 2020-2023  润新知