今天須要寫一個導出的Excel的功能,可是發現當數據量到3萬條時,列數在23列時,內存溢出,CPU使用100%,測試環境直接炸掉。在本地測試時發現,導出3000條左右的數據的時候,堆內存瞬間升高500M左右。而後發現了SXSSFWorkbook
這個類。bash
SXSSFWorkbook
須要poi-ooxml
包3.8
及以上開始支持,我這邊適使用的是3.9
版本,本質是一個XSSFWorkbook
類(Excel2007
),它使用的方式是採用硬盤空間
來大幅下降堆內存
的佔用,在系統的臨時文件夾目錄建立一個臨時文件,而後將全部大於約定行數的數據都存入臨時文件,而不是所有放在內存中,內存中只存放最新的的約定條數的數據,從而實現以硬盤空間換取內存空間,避免內存溢出測試
與正常的Excel導出方法沒有區別,只是將實例化的類換爲SXSSFWorkbook
spa
SXSSFWorkbook workbook = null;
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
//建立工做簿
workbook = new SXSSFWorkbook();
// 打開壓縮功能 防止佔用過多磁盤
workbook.setCompressTempFiles(true);
// 建立一個工做表
Sheet sheet = workbook.createSheet("表名");
// 建立一行
Row titleRow = sheet.createRow(0);
// 建立一個單元格
Cell cell = titleRow.createCell(0);
// 給單元格賦值
cell.setCellValue("內容");
// 將工做簿寫入輸出流
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (workbook != null) {
//使用完畢後將產生的臨時文件刪除 防止將磁盤搞滿
workbook.dispose();
}
if (outputStream != null) {
outputStream.close();
}
}
複製代碼
最好開啓壓縮模式 workbook.setCompressTempFiles(true);
這樣能夠使得臨時文件體積大幅減小code
使用完畢後釋放 workbook.dispose();
防止臨時文件一直增長 撐爆硬盤xml