背景
今天需要寫一個(gè)導(dǎo)出的Excel的功能矾策,但是發(fā)現(xiàn)當(dāng)數(shù)據(jù)量到3萬條時(shí)凶硅,列數(shù)在23列時(shí)厢破,內(nèi)存溢出荣瑟,CPU使用100%,測(cè)試環(huán)境直接炸掉。在本地測(cè)試時(shí)發(fā)現(xiàn)摩泪,導(dǎo)出3000條左右的數(shù)據(jù)的時(shí)候笆焰,堆內(nèi)存瞬間升高500M左右。然后發(fā)現(xiàn)了SXSSFWorkbook
這個(gè)類见坑。
簡(jiǎn)介
SXSSFWorkbook
需要poi-ooxml
包3.8
及以上開始支持嚷掠,我這邊適使用的是3.9
版本,本質(zhì)是一個(gè)XSSFWorkbook
類(Excel2007
)荞驴,它使用的方式是采用硬盤空間
來大幅降低堆內(nèi)存
的占用不皆,在系統(tǒng)的臨時(shí)文件夾目錄創(chuàng)建一個(gè)臨時(shí)文件,然后將所有大于約定行數(shù)的數(shù)據(jù)都存入臨時(shí)文件熊楼,而不是全部放在內(nèi)存中霹娄,內(nèi)存中只存放最新的的約定條數(shù)的數(shù)據(jù),從而實(shí)現(xiàn)以硬盤空間換取內(nèi)存空間鲫骗,避免內(nèi)存溢出
使用方式
與正常的Excel導(dǎo)出方法沒有區(qū)別项棠,只是將實(shí)例化的類換為SXSSFWorkbook
SXSSFWorkbook workbook = null;
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
//創(chuàng)建工作簿
workbook = new SXSSFWorkbook();
// 打開壓縮功能 防止占用過多磁盤
workbook.setCompressTempFiles(true);
// 創(chuàng)建一個(gè)工作表
Sheet sheet = workbook.createSheet("表名");
// 創(chuàng)建一行
Row titleRow = sheet.createRow(0);
// 創(chuàng)建一個(gè)單元格
Cell cell = titleRow.createCell(0);
// 給單元格賦值
cell.setCellValue("內(nèi)容");
// 將工作簿寫入輸出流
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (workbook != null) {
//使用完畢后將產(chǎn)生的臨時(shí)文件刪除 防止將磁盤搞滿
workbook.dispose();
}
if (outputStream != null) {
outputStream.close();
}
}
注意點(diǎn)
最好開啟壓縮模式
workbook.setCompressTempFiles(true);
這樣可以使得臨時(shí)文件體積大幅減少使用完畢后釋放
workbook.dispose();
防止臨時(shí)文件一直增加 撐爆硬盤