真无语了,咋那么多客户要导出数据到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