上案例:
public void exportAllAttachInfo(HttpServletResponse response, Map<String, Object> param){
Long t1 = System.currentTimeMillis();
ExportParams exportParams = new ExportParams();
exportParams.setSheetName("信息列表");
ExcelDataHandler excelDataHandler = new ExcelDataHandler(true);
excelDataHandler.setNeedHandlerFields(new String[]{"公司名称","人员状态"});
exportParams.setDataHandler(excelDataHandler);
int pageSize = 10000;
#数据较多,分线程查询或者分页查询
List<TestEntity> records = this.getList(param);
int totalNum = records.size();
int totalPage = (int)Math.ceil((double)totalNum/pageSize);
long t2 = System.currentTimeMillis();
logger.info("查询耗时:"+(t2 - t1)/1000+"秒");
logger.info("总页数==========:"+totalPage);
logger.info("总条数==========:"+totalNum);
logger.info("总页数==========:"+totalPage);
// 会进行数据的append操作 将所有数据分批写入workbook 防止内存溢出
Workbook workbook = ExcelExportUtil.exportBigExcel(exportParams, TestEntity.class, (obj, page1) -> {
if (page1 > totalPage) {
return null;
}
// fromIndex开始索引,toIndex结束索引
int fromIndex = (page1 - 1) * pageSize;
int toIndex = page1 != totalPage ? fromIndex + pageSize : totalNum;
List<Object> list = new ArrayList<>();
list.addAll(records.subList(fromIndex, toIndex));
return list;
}, totalPage);
String fileName = "信息表.xlsx";
Long t3 = System.currentTimeMillis();
logger.info("生成表格耗时:"+(t3 - t2)/1000+"秒");
//告诉浏览器下载excel
downloadExcel(fileName, workbook, response);
logger.info("总共耗时:"+(t3 - t1)/1000+"秒");
}
protected void downloadExcel(String filename, Workbook workbook, HttpServletResponse response) {
OutputStream outputStream = null;
try{
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8"));
outputStream = response.getOutputStream();
workbook.write(outputStream);
} catch (IOException e) {
logger.error("down excel error.", e);
} finally {
IOUtils.closeQuietly(workbook);
IOUtils.closeQuietly(outputStream);
}
}