WEB开发——大批量数据导出经验谈

1、大批量数据导出的时候,需要注意这样的一个问题,Excel2003格式一个sheet只支持65536行,excel 2007 就比较多,是1048576。  

2、NPOI开源的组件,使用时不需要安装office(极大的优势),需要注意的是,目前该方法只能操作office2003。POI什么的都是先在内存里面把Excel的结构构造好再输出的,这个过程很费内存,不要用POI这些,只是导出数据结构简单的话换成文本输出csv用流式输出,Excel一样可以打开的。

3、不要用response.write,用fileWriter;

4、待处理的数据,不要一次性全部放到数据对象中,应该分批处理,以避免JVM内存使用的溢出;

5、Excel如果写入的内容过多,建议分开写到多个excel文件中,然后打成ZIP包提供下载。

6、需要注意的是写入csv 文件时指定的是GB2312的编码,如果指定为UTF-8的编码,采用Excel打开为乱码;如果采用UNICODE编码,逗号可能无法正确解析,数据将合并为一列;注:逗号为英文字符。如图:相同数据量的csv与xls文件比较

7、因为担当者经验不足,在导出CSV时,使用String来拼接字符串,现在我们把String换成StringBuffer就好了,现在到处一万条数据只用几秒就可以实现了

8、oracal数据导出csv文件,使用的未封装的最基本的jdbc,用ResultSet取数据。
10万条全纪录导出用时7秒 导出文件52MB,700万条全纪录导出用时12分42秒 导出文件3.5GB。CPU占用稍高点大约50%,内存占用很少仅仅20MB左右。
测试在本地进行的,机器也是一般的core2。使用语言是java。所以大数据建议用最原始的方法。

8、示例代码:

 1 ServletOutputStream os = response.getOutputStream();
 2             SimpleDateFormat dataFormat = new SimpleDateFormat("yyyyMMddHHmm");
 3             Date today = new Date();
 4             String filetime = dataFormat.format(today);
 5             response.reset();
 6             response.setContentType("application/download;charset=GB2312"); 
 7             response.setHeader("Content-disposition","attachment;filename=\"" +new String("交易清单".getBytes(), "iso-8859-1")+filetime+".csv\""); 
 8 
 9             String[] title = { "流水号", "缴费项目", "缴费时间", "电话号码", "账号", "数量",
10                     "面值", "金额(元)", "订单状态", "处理时间", "处理结果", "机主姓名", "缴前余额",
11                     "归属地区" };
12             StringBuffer csvFileString = new StringBuffer() ;
13             PrintWriter pw = response.getWriter();  
14             for(int i = 0;i<title.length;i++){
15                 csvFileString.append(title[i]);
16                 if(i<title.length-1){
17                     csvFileString.append(",");
18                 }
19             }
20             csvFileString.append("\n");
21 
22 ......................................
23 
24             pw.write(csvFileString.toString());  
25             pw.flush();  
26             pw.close();  
27             os.close();

 

 

posted on 2012-12-25 18:55  Brown Qin  阅读(3177)  评论(0编辑  收藏  举报

导航