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取数据。 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();
|
|