使用jxl導出大數據量EXCEL時內存溢出的解決辦法
1、通過jx1最新版本的採用臨時文件寫入EXCEL功能,設定臨時文件的位置,可以有效的避免內存溢出: wbSetting.setUseTemporaryFileDuringWrite(true);
wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//臨時文件夾的位置
2、EXCEL獲取的list集合先讀取數據總行數,再通過ROWNUM進行控制,設定每次讀取多少行數據,比如一個List設定爲50000; WorkbookSettings wbSetting = new WorkbookSettings();
wbSetting.setUseTemporaryFileDuringWrite(true);
wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//臨時文件夾的位置
workbook = Workbook.createWorkbook(new File(fullPath),wbSetting);
int returnCount=0;
if(null!=pager)
{
returnCount = BrasDatabase.getReturnCount(pager.getStartTime(),
pager.getEndTime(), pager);
}
if (returnCount > 0) {
pager.setPageSize(50000);
pager.setTotalRows(returnCount);// 獲取總行數
pager.setNewTotalPages(pager.getTotalRows()); // 總頁數
for (int i = 1; i <= pager.getTotalPages(); i++) {
pager.setCurrentPage(i); // 當前頁面d
List<BrasAuth> list = BrasDatabase
.getBrasAuthResultByIpToExcelList(pager
.getStartTime(), pager.getEndTime(), pager);
this.createExcel(list,excelFilePath);
list.clear();
}
}
3、在寫入EXCEL的時候,將讀取的LIST分割,每50000條數據生成一個EXCEL的sheet(一個sheet最多能存儲60000多行數據),再寫入,寫入的時候,如果設置了採用臨時文件寫入的話,jx1會自動採用生成臨時文件的方式寫入EXCEL:
for(int i=1;i<=list.size();i++)
{
if(i%50000==0)
{
sheetName=format.format(new Date());
toExcel(list.subList(reNum, i),sheetName);
reNum=i;
}
}
http://www.blogjava.net/japper/archive/2012/07/16/383208.html