
å¨ä¸ä¸ªå ·æç»è®¡åè½çç³»ç»ä¸ï¼å¯¼åºexcelåè½å 乿¯ä¸å®çï¼å¦ä½å¯¼åºexcelï¼å¯¼åºçæ°æ®æå¤å°ï¼å¦ä½é«æç导åºï¼
Excelç®ä»
ä»ä¹æ¯excelå°±ä¸ç¨ä»ç»äºï¼è¿é主è¦è¯´æä¸åçæ¬ä¸æ¯ä¸ªsheetä¸çè¡åéå¶ã
çæ¬åºé´ | è¡æ° | åæ° | æä»¶åç¼ |
---|---|---|---|
Excel 2003åä»¥ä¸ | 65535 | 256 | xls |
Excel 2007åä»¥ä¸ | 1048576 | 16384 | xlsx |
ç±ä¸é¢å¯ç¥ Excel 2003å以䏿¯æ æ³å®ç°åsheetç¾ä¸çº§çæ°æ®ã
Apache POI
ç®ä»
Apache POI æ¯ç¨Javaç¼åçå è´¹å¼æºç跨平å°ç Java APIï¼Apache POIæä¾APIç»Javaç¨å¼å¯¹Microsoft Office(ExcelãWORDãPowerPointãVisioç)æ ¼å¼æ¡£æ¡è¯»ååçåè½ãPOI为âPoor Obfuscation Implementationâçé¦åæ¯ç¼©åï¼æä¸ºâå¯æçæ¨¡ç³å®ç°"ã
常ç¨ç±»
- HSSF ï¼ æä¾è¯»åMicrosoft Excel XLSæ ¼å¼æ¡£æ¡çåè½ã
- XSSF ï¼ æä¾è¯»åMicrosoft Excel OOXML XLSXæ ¼å¼æ¡£æ¡çåè½ã
- SXSSF ï¼ ä¸ç§åºäºXSSFçä½å åå ç¨çAPI(3.8çæ¬å¼å§åºç°)ã
- HWPF ï¼ æä¾è¯»åMicrosoft Word DOC97æ ¼å¼æ¡£æ¡çåè½ã
- XWPF ï¼ æä¾è¯»åMicrosoft Word DOC2003æ ¼å¼æ¡£æ¡çåè½ã
- HSLF ï¼ æä¾è¯»åMicrosoft PowerPointæ ¼å¼æ¡£æ¡çåè½ã
- HDGF ï¼ æä¾è¯»Microsoft Visioæ ¼å¼æ¡£æ¡çåè½ã
- HPBF ï¼ æä¾è¯»Microsoft Publisheræ ¼å¼æ¡£æ¡çåè½ã
- HSMF ï¼ æä¾è¯»Microsoft Outlookæ ¼å¼æ¡£æ¡çåè½ã
æä»¬è¿éæ¯å¯¼åºExcelï¼æä»¥ä½¿ç¨çæ¯åä¸ä¸ªã
导åºçç¥
æ¹æ¡
1.使ç¨XSSFåSXSSFåå«å¯¼å ¥1w,10w,100wæ°æ®
2.使ç¨SXSSFï¼SXSSF以10wå页ï¼SXSSFå¤çº¿ç¨ä»¥10wåé¡µå¯¼å ¥100wæ°æ®
æ§è½å¯¹æ¯
æ¶é´ä¸å å«ç½ç»èæ¶
ç±»å | 1wæ¡/æ¶é´ | 10wæ¡/æ¶é´ | 100wæ¡/æ¶é´ |
---|---|---|---|
XSSF | 1331ms | 10496ms | å°å¿çµè? |
SXSSF | 1568ms | 600ms | 5824ms |
ç±»å | 100wæ¡/æ¶é´ | 200w/æ¶é´ |
---|---|---|
SXSSF | 5824ms | è¶ è¿æå¤§è¡æ° |
SXSSF Page | 6040ms | 12473ms |
SXSSF Page Thread | 3410ms | 6217ms |
æ»ç»
æ¹æ¡ä¸
- æ°æ®å¨ä¸æ¡æ¶XSSFåSXSSFç¸å·®ä¸å¤§
- æ°æ®ä¸åä¸åSXSSFæ§è½å¼å§çªåº
- æ°æ®å°è¾¾ç¾ä¸æ¶ï¼XSSFå·²ä¸éå使ç¨
æ¹æ¡äº
- ä¸è¿è¡å表æ¶ï¼SXSSFæå¤å¯åå¨1048576è¡
- ç¾ä¸çº§æ°æ®å表å卿¶ï¼ä½¿ç¨å¤çº¿ç¨å¯¼åºå 乿¯ä¸ä½¿ç¨å¤çº¿ç¨å¯¼åºçä¸åæ¶é´
æç»æå¾åºä¸ä¸ªå¯¼åºç¾ä¸çº§æ°æ®çæé«ææ¹æ¡ï¼å¤çº¿ç¨å表导åº
宿
- controllerå±
@RestController
@RequestMapping("export")
public class ReportController {
public static final String[] TITLE = new String[]{"第1å", "第2å", "第3å", "第4å", "第5å"};
public static final String SHEET_NAME = "page1";
@RequestMapping(value = "/sxssf/page/thread")
@ResponseBody
public void exportSXSSFWorkbookByPageThread(HttpServletResponse response, Integer num) throws Exception {
//excelæä»¶å
String fileName = System.currentTimeMillis() + ".xlsx";
//sheetå
if (Objects.isNull(num)) {
num = 65536;
}
String[][] content = buildContent(num);
long start = System.currentTimeMillis();
SXSSFWorkbook wb = ExcelUtil.getSXSSFWorkbookByPageThread(TITLE, content, null);
long millis = System.currentTimeMillis() - start;
long second = millis / 1000;
System.out.println("SXSSF Page Thread 导åº" + num + "æ¡æ°æ®ï¼è±è´¹ï¼" + second + "s/ " + millis + "ms");
writeAndClose(response, fileName, wb);
wb.dispose();
}
private String[][] buildContent(Integer num) {
String[][] content = new String[num][5];
for (int i = 0; i < content.length; i++) {
content[i][0] = "1";
content[i][1] = "2";
content[i][2] = "3";
content[i][3] = "4";
content[i][4] = "5";
}
return content;
}
private void writeAndClose(HttpServletResponse response, String fileName, Workbook wb) {
try {
this.setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
- å·¥å ·ç±»
public class ExcelUtil {
public static final int PER_SHEET_LIMIT = 500000;
public static SXSSFWorkbook getSXSSFWorkbookByPageThread(String[] title, String[][] values) {
SXSSFWorkbook wb = new SXSSFWorkbook();
int pageNum = values.length / PER_SHEET_LIMIT;
int lastCount = values.length % PER_SHEET_LIMIT;
if (values.length > PER_SHEET_LIMIT) {
CellStyle style = wb.createCellStyle();
int sheet = lastCount == 0 ? pageNum : pageNum + 1;
CountDownLatch downLatch = new CountDownLatch(sheet);
Executor executor = Executors.newFixedThreadPool(sheet);
for (int c = 0; c <= pageNum; c++) {
int rowNum = PER_SHEET_LIMIT;
if (c == pageNum) {
if (lastCount == 0) {
continue;
}
rowNum = lastCount;
}
Sheet sheet = wb.createSheet("page" + c);
executor.execute(new PageTask(downLatch, sheet, title, style, rowNum, values));
}
try {
downLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return wb;
}
}
- å表任å¡ç±»
public class PageTask implements Runnable {
private CountDownLatch countDownLatch;
private Sheet sheet;
private String[] title;
private CellStyle style;
private int b;
private String[][] values;
public PageTask(CountDownLatch countDownLatch, Sheet sheet, String[] title, CellStyle style, int b, String[][] values) {
this.countDownLatch = countDownLatch;
this.sheet = sheet;
this.title = title;
this.style = style;
this.b = b;
this.values = values;
}
@Override
public void run() {
try {
Row row = sheet.createRow(0);
Cell cell = null;
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
for (int i = 0; i < b; i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < values[i].length; j++) {
row.createCell(j).setCellValue(values[i][j]);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (countDownLatch != null) {
countDownLatch.countDown();
}
}
}
}
ç®ç»ææçç¨åºåªï¼å¥³çèå¿«ä¹
æµ·å åç¥å·±,å¤©æ¶¯è¥æ¯é»ï¼åæ¬¢å°±å ³æ³¨å§ï¼