1.傳統的導出方式會消耗大量的內存,2003每個sheet頁最多65536條數據,2007每個sheet頁可以達到100萬條數據以上,2007會在生成Workbook時清理數據,所以2007導出量更大;
2.可以導出多個excel文件到某個目錄中,然后打包下載;
3.導出excel格式的xml文件,這種方式可以分批導出數據,適用於大批量數據的導出,以下簡單介紹這種方式:
代碼如下:
1 package com.epay.utils; 2 3 /** 4 * 大數據量導出成EXCEL或XML 5 * @author qad 6 * 2017-04-22 7 */ 8 import java.io.BufferedOutputStream; 9 import java.io.DataOutputStream; 10 import java.io.File; 11 import java.io.FileNotFoundException; 12 import java.io.FileOutputStream; 13 import java.io.IOException; 14 15 public class Test { 16 public static void main(String[] args) { 17 StringBuffer sb = new StringBuffer(); 18 try { 19 DataOutputStream rafs = new DataOutputStream( 20 new BufferedOutputStream(new FileOutputStream(new File( 21 "d://test.xls")))); 22 sb.append("<?xml version=\"1.0\" encoding=\"GBK\" ?>"); 23 sb.append("\n"); 24 sb.append("<?mso-application progid=\"Excel.Sheet\"?>"); 25 sb.append("\n"); 26 sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\""); 27 sb.append("\n"); 28 sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\""); 29 sb.append("\n"); 30 sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\""); 31 sb.append("\n"); 32 sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\""); 33 sb.append("\n"); 34 sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">"); 35 sb.append("\n"); 36 sb.append("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\"> "); 37 sb.append("\n"); 38 sb.append(" <Styles>\n"); 39 sb.append(" <Style ss:ID=\"Default\" ss:Name=\"Normal\">\n"); 40 sb.append(" <Alignment ss:Vertical=\"Center\"/>\n"); 41 sb.append(" <Borders/>\n"); 42 sb.append(" <Font ss:FontName=\"宋體\" x:CharSet=\"134\" ss:Size=\"12\"/>\n"); 43 sb.append(" <Interior/>\n"); 44 sb.append(" <NumberFormat/>\n"); 45 sb.append(" <Protection/>\n"); 46 sb.append(" </Style>\n"); 47 sb.append(" </Styles>\n"); 48 int sheetcount = 0; 49 int recordcount = 65535; 50 int currentRecord = 0; 51 int total = 100000; 52 int col = 20; 53 sb.append("<Worksheet ss:Name=\"Sheet0\">"); 54 sb.append("\n"); 55 sb.append("<Table ss:ExpandedColumnCount=\"" + col 56 + "\" ss:ExpandedRowCount=\"" + total 57 + "\" x:FullColumns=\"1\" x:FullRows=\"1\">"); 58 sb.append("\n"); 59 for (int i = 0; i < total; i++) { 60 if ((currentRecord == recordcount 61 || currentRecord > recordcount || currentRecord == 0) 62 && i != 0) {// 一個sheet寫滿 63 currentRecord = 0; 64 rafs.write(sb.toString().getBytes()); 65 sb.setLength(0); 66 sb.append("</Table>"); 67 sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">"); 68 sb.append("\n"); 69 sb.append("<ProtectObjects>False</ProtectObjects>"); 70 sb.append("\n"); 71 sb.append("<ProtectScenarios>False</ProtectScenarios>"); 72 sb.append("\n"); 73 sb.append("</WorksheetOptions>"); 74 sb.append("\n"); 75 sb.append("</Worksheet>"); 76 sb.append("<Worksheet ss:Name=\"Sheet" + i / recordcount 77 + "\">"); 78 sb.append("\n"); 79 sb.append("<Table ss:ExpandedColumnCount=\"" + col 80 + "\" ss:ExpandedRowCount=\"" + recordcount 81 + "\" x:FullColumns=\"1\" x:FullRows=\"1\">"); 82 sb.append("\n"); 83 } 84 sb.append("<Row>"); 85 for (int j = 0; j < col; j++) { 86 System.out.println(i); 87 sb.append("<Cell><Data ss:Type=\"String\">111</Data></Cell>"); 88 sb.append("\n"); 89 } 90 sb.append("</Row>"); 91 if (i % 5000 == 0) { 92 rafs.write(sb.toString().getBytes()); 93 rafs.flush(); 94 sb.setLength(0); 95 } 96 sb.append("\n"); 97 currentRecord++; 98 } 99 rafs.write(sb.toString().getBytes()); 100 sb.setLength(0); 101 sb.append("</Table>"); 102 sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">"); 103 sb.append("\n"); 104 sb.append("<ProtectObjects>False</ProtectObjects>"); 105 sb.append("\n"); 106 sb.append("<ProtectScenarios>False</ProtectScenarios>"); 107 sb.append("\n"); 108 sb.append("</WorksheetOptions>"); 109 sb.append("\n"); 110 sb.append("</Worksheet>"); 111 sb.append("</Workbook>"); 112 sb.append("\n"); 113 rafs.write(sb.toString().getBytes()); 114 rafs.flush(); 115 rafs.close(); 116 } catch (FileNotFoundException e) { 117 e.printStackTrace(); 118 } catch (IOException e) { 119 e.printStackTrace(); 120 } 121 } 122 }
導出xml文件之后直接修改后綴名為.xlsx就可以直接打開,弊端:無法導出.xls格式的excel文件.以上只是一種簡單想法,留待以后具體實現.
擴展:既然可以使用xml文件導出excel,那么導出csv文件之后也可以直接改后綴名為.xls,目前只是一種想法,尚未證實可行性.
