我们都知道excle表格的问题是2010版之前的excle一次只能装几万条数据,在这个数据时代这根本满足不了我们的需求,所以2010版以后excle可以装一百万多条数据,在正常需求下来说是ok的
那么我们还面临一个问题就是数据太多,时间太长会导致内存溢出,怎么办呢? 首先将直接导出改为离线导出,将数据分开导出,比如说分成两万条数据导出一次
private void threadExport(ViewPsnPrvtFundUserQO qo, CurrentUser user) throws Exception {
// 替换查询参数
//qo = replaceQuery(qo, codeType, codeNum, query, quarter, advancedPopExport);
SXSSFWorkbook wb = new SXSSFWorkbook(20000);
// 表头样式
CellStyle columnTopStyle = getColumnTopStyleSXSSF(wb);
// 单元格样式
final CellStyle style = getStyleSXSSF(wb);
// 处理管理人导出内容
wb = newFundInvestmentService.fundDetailListNew(tzztype,spvsPpdmCde,qo, style, wb, columnTopStyle);
FileOutputStream output=new FileOutputStream(filePath);
// 设置打开excel默认选中的sheet页
/*if (!"".equals(codeType) && codeType != null){
wb.setActiveSheet(Integer.parseInt(codeType) - 1);
}*/
wb.write(output);//写入磁盘
output.close();
// 调用oltp上传附件
File file =new File(filePath);
String fileKey = oltpFileMetaBo.fileUpload(file,
user.getId(), FileConfig.FILE_SECRET_NONE, FileConfig.srcApp);
po.setFileSeevcOgnAtchId(fileKey);
po.setLastAlterTime(new Date());
// 0为导出成功
po.setDownloadIndc("0");
prvtAndAtchRltnDao.updateByPk(po);
prvtAndAtchRltnDao.updateByPk(deletePO);
// 删除oltp文件
if ("0".equals(deletePO.getDownloadIndc())){
// 如果导出状态为成功删除文件,导出异常的不需要删除文件
oltpFileMetaBo.fileDelete(deletePO.getFileSeevcOgnAtchId(), user.getId());
}
}
}
// logger.info("----------------------------------------------------------------------->"+fileKey);
file.deleteOnExit();
}
}).start();
return "1";
}
将导出分为两个部分,一个是导出一个是下载,在导出过程中重新写一个线程为不影响另一部分数据导出,最后点击下载则可以直接查看