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) 编辑 收藏 举报