1、大批量數(shù)據(jù)導出的時候,需要注意這樣的一個問題,Excel2003格式一個sheet只支持65536行,excel 2007 就比較多,是1048576。
2、NPOI開源的組件,使用時不需要安裝office(極大的優(yōu)勢),需要注意的是,目前該方法只能操作office2003。POI什么的都是先在內(nèi)存里面把Excel的結(jié)構(gòu)構(gòu)造好再輸出的,這個過程很費內(nèi)存,不要用POI這些,只是導出數(shù)據(jù)結(jié)構(gòu)簡單的話換成文本輸出csv用流式輸出,Excel一樣可以打開的。
3、不要用response.write,用fileWriter;
4、待處理的數(shù)據(jù),不要一次性全部放到數(shù)據(jù)對象中,應該分批處理,以避免JVM內(nèi)存使用的溢出;
5、Excel如果寫入的內(nèi)容過多,建議分開寫到多個excel文件中,然后打成ZIP包提供下載。
6、需要注意的是寫入csv 文件時指定的是GB2312的編碼,如果指定為UTF-8的編碼,采用Excel打開為亂碼;如果采用UNICODE編碼,逗號可能無法正確解析,數(shù)據(jù)將合并為一列;注:逗號為英文字符。如圖:相同數(shù)據(jù)量的csv與xls文件比較
7、因為擔當者經(jīng)驗不足,在導出CSV時,使用String來拼接字符串,現(xiàn)在我們把String換成StringBuffer就好了,現(xiàn)在到處一萬條數(shù)據(jù)只用幾秒就可以實現(xiàn)了
8、oracal數(shù)據(jù)導出csv文件,使用的未封裝的最基本的jdbc,用ResultSet取數(shù)據(jù)。
10萬條全紀錄導出用時7秒 導出文件52MB,700萬條全紀錄導出用時12分42秒 導出文件3.5GB。CPU占用稍高點大約50%,內(nèi)存占用很少僅僅20MB左右。
測試在本地進行的,機器也是一般的core2。使用語言是java。所以大數(shù)據(jù)建議用最原始的方法。
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 = { "流水號", "繳費項目", "繳費時間", "電話號碼", "賬號", "數(shù)量",10 "面值", "金額(元)", "訂單狀態(tài)", "處理時間", "處理結(jié)果", "機主姓名", "繳前余額",11 "歸屬地區(qū)" };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();