情景:我们在做项目中,有个20万左右的数据要导出来,我们查出数据库要导出的话,系统就卡死了,
我们分批查询,分批导出
public void exportDmfAll(HttpServletResponse response,ProcessCompletionVo vo) {
ExcelWriter excelWriter = null;
try {
String fileName = "数据导出";
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" +
new String(fileName.getBytes("UTF-8"), "ISO8859-1") + ".xlsx");
excelWriter = EasyExcel.write(response.getOutputStream()).build();
Integer page = 1;
while (true) {
vo.setPageNum(page);
vo.setPageCount(5000);
R r = this.getBusinessArea(vo);
List<DmFbillprocessNodeDetailModel> list = ((Page<DmFbillprocessNodeDetailModel>) r.get("data")).getContent();
if (list.size()==0) {
return;
}
R typeFlagR = getTypeFlagByBill(vo.getProcessName());
String typeFlag = "";
if (!ObjectUtils.isEmpty(typeFlagR.get("business_type"))) {
typeFlag = String.valueOf(typeFlagR.get("business_type"));
}
//if ("国内".equals(typeFlag)) {
List<DmfAllExcelOne> listResult = new ArrayList<>();
for (DmFbillprocessNodeDetailModel dmFprocessNodeReportModel : list) {
DmfAllExcelOne excel = new DmfAllExcelOne();
BeanUtils.copyProperties(dmFprocessNodeReportModel, excel);
listResult.add(excel);
}
WriteSheet writeSheet = EasyExcel.writerSheet(page - 1, "数据导出" + (page)).head(DmfAllExcelOne.class)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
excelWriter.write(listResult, writeSheet);
//}
page = page + 1;
}
} catch (IOException e) {
e.printStackTrace();
log.error("导出失败[{}]", e.getMessage());
} finally {
excelWriter.finish();
}
}
大家有不明白的可以留言,或者有更好的方法,可以直接联系我,本人十分感谢~