新闻详情

新闻详情

首页 / 资讯中心 / 详情

【springboot】excel 大数据量导出:分页查询 + 分 sheet 设置数据

发布时间:2026/10/1 15:04:33来源:尧图网络
【springboot】excel 大数据量导出:分页查询 + 分 sheet 设置数据
excel 大数据量导出分页查询 分 sheet 设置数据一、适用场景与核心思路数据量上万甚至几十万时一次性查询 一次性写入 excel 会导致内存溢出、系统卡死需要「边查边写」。核心四步分页查询每页查询固定条数如 1w循环拉取直到返回空或达到总量上限。分 sheet 存放单个 sheet 写满sheetSize行后切换到下一个 sheet。总量上限保护累计条数超过excelMaxSize直接停止避免无限导出。分页不 count导出只需要数据、不需要总数可关闭 count 查询提升性能。关键参数参数说明示例值pageSize每页查询条数10000sheetSize单个 sheet 最大行数10000 ~ 100000excelMaxSize导出总条数上限1000000二、方式一POI/** * 大数据量导出分页查询 分 sheet 写入 * 业务查询条件通过 params 传入方法内只处理分页参数 * * param params 业务查询条件 * param response 响应 * param formClient 数据查询客户端 */publicvoidexportExcel(JSONObjectparams,HttpServletResponseresponse,FormClientformClient){// 每次分页查询大小intpageSize10000;// 每个 sheet 的行数intsheetSize10000;// excel 导出最大值防止内存溢出longexcelMaxSize1000000L;// 已读取的数据量longtotal0;// 当前读取到第几页数据从 1 开始intcurrent1;// 第一步创建一个 workbook对应一个 Excel 文件HSSFWorkbookhwbnewHSSFWorkbook();// 设置样式HSSFCellStylestylesetRowStyle(hwb);try{// 缓存全部数据再按 sheetSize 拆分写入JSONArrayjsonArraynewJSONArray();// 第二步分页拉取数据do{params.put(pageIndex,current);params.put(pageSize,pageSize);JsonResultdkResultformClient.queryForJson(zss_qylb_data2,JSONObject.toJSONString(params));JSONObjectdkObjectJSONObject.parseObject(dkResult.toString());JSONArraydkArraydkObject.getJSONArray(data);if(CollectionUtils.isEmpty(dkArray)){break;}jsonArray.addAll(dkArray);totalcurrent*pageSizedkArray.size();// 已写入的数据已经超过最大值限制则退出if(totalexcelMaxSize){break;}// 换下一页current;}while(true);StringfileName导出数据;// 第三步按 sheetSize 拆分写入多个 sheetif(jsonArray.size()0){intsizejsonArray.size()/sheetSize;for(inti0;isize;i){HSSFSheetsheethwb.createSheet(sheet(i1));// 设置表头createRowHead(sheet,style);// 取当前 sheet 的数据区间ListObjectsubListisize?jsonArray.subList(i*sheetSize,(i1)*sheetSize):jsonArray.subList(i*sheetSize,jsonArray.size());setRowData(newJSONArray(subList),sheet,style);}}// 第四步导出ExcelChangeUtil.exportExcelByDownload(hwb,response,fileName);}catch(Exceptionex){logger.error(ExceptionUtil.getExceptionMessage(ex));MessageUtil.triggerException(出错了请重试,null);}}// 设置样式privateHSSFCellStylesetRowStyle(HSSFWorkbookhwb){HSSFCellStylestylehwb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);// 左右居中style.setVerticalAlignment(style.getVerticalAlignmentEnum().CENTER);// 垂直居中style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());// 背景颜色Fontfonthwb.createFont();font.setFontHeightInPoints((short)11);font.setFontName(宋体);style.setFont(font);returnstyle;}// 创建表头列按业务自行增删privatevoidcreateRowHead(HSSFSheetsheet,HSSFCellStylestyle){HSSFRowrowsheet.createRow(0);String[]heads{序号,名称,统一社会信用代码,所属县区,行业代码,备注};for(inti0;iheads.length;i){HSSFCellcellrow.createCell(i);cell.setCellStyle(style);cell.setCellValue(heads[i]);// 部分列宽度需要加长可单独设置sheet.setColumnWidth(i,i1?10000:5000);}}// 封装数据字段按业务自行替换privatevoidsetRowData(JSONArrayarray,HSSFSheetsheet,HSSFCellStylestyle){for(inti0;iarray.size();i){JSONObjectdataarray.getJSONObject(i);HSSFRowrowsheet.createRow(i1);HSSFCellcrow.createCell(0);c.setCellStyle(style);c.setCellValue(i1);crow.createCell(1);c.setCellStyle(style);c.setCellValue(data.getString(qymc)!null?data.getString(qymc):--);crow.createCell(2);c.setCellStyle(style);c.setCellValue(data.getString(tyshxydm)!null?data.getString(tyshxydm):--);}}三、方式二alibaba-easyexcelPostMapping(/exportExcel)publicvoidexportExcel(QueryDataqueryData,HttpServletResponseresponse){// 每次分页查询大小intpageSize10000;// 每个 sheet 的大小longsheetSize100000L;// excel 导出最大值longexcelMaxSize1000000L;// 已读取的数据量longtotal0;// 当前读取到第几页数据从 1 开始intcurrent1;QueryFilterqueryFilterQueryFilterBuilder.createQueryFilter(queryData);handleFilter(queryFilter);// 重新设置分页控制分页不 countIPagepagenewcom.baomidou.mybatisplus.extension.plugins.pagination.Page(current,pageSize,false);queryFilter.setPage(page);ExcelWriterexcelWriternull;try{excelWriterEasyExcel.write(response.getOutputStream(),Demo.class).build();// 注意同一个 sheet 只要创建一次WriteSheetwriteSheetEasyExcel.writerSheet(sheet1).build();do{page.setCurrent(current);getBaseService().query(queryFilter);ListDemolistpage.getRecords();if(CollectionUtils.isEmpty(list)){break;}excelWriter.write(list,writeSheet);// 如果 sheet 满了换下一个 sheetif(current1(current*pageSize%sheetSize0)){writeSheetEasyExcel.writerSheet(sheet((current*pageSize/sheetSize)1)).build();}totalcurrent*pageSizelist.size();// 已写入的数据已经超过最大值限制则退出if(totalexcelMaxSize){break;}// 换下一页current;}while(true);}catch(Exceptionex){MessageUtil.triggerException(出错了请重试,null);logger.error(ExceptionUtil.getExceptionMessage(ex));}finally{if(excelWriter!null){excelWriter.finish();}}}四、注意事项sheet 行数上限HSSFWorkbook.xls单 sheet 最多 65536 行若sheetSize需要更大如 10w请改用XSSFWorkbook或 EasyExcel.xlsx。EasyExcel 的 WriteSheet同一个 sheet 只创建一次只有切换到新 sheet 时才重新EasyExcel.writerSheet(...).build()。分页不 countnew Page(current, pageSize, false)的第三个参数为false时不执行 count 查询导出场景能明显提速。总量估算total current * pageSize list.size()只是估算值当前页不满时会偏大仅用于上限判断不用于精确统计。边查边写 vs 全量缓存POI 示例是把所有分页数据先缓存到jsonArray再按 sheet 拆分数据量特别大时建议改为边查边写避免缓存占用过多内存。ExcelChangeUtil / MessageUtil / formClient为项目内部工具接入时替换为对应的导出与查询实现。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从零手写轻量神经网络:普通显卡也能训练的开源实战 2026/10/1 16:37:21

从零手写轻量神经网络:普通显卡也能训练的开源实战

先聊点实在的。不少人看到“自研神经网络”这几个字,第一反应是“这得有多少卡、多少算力才玩得动”,第二反应是“这得是多大的团队、多少篇论文堆出来的”。但这次我想说的是另一条路:我最近把一个从零写的神经网络项目完整开源了&#xff0…

阅读更多 →
ROS2通信延迟深度解析:从论文到工程实践 2026/10/1 16:37:01

ROS2通信延迟深度解析:从论文到工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
实体卡带好价盘点:版本、汇率与价格波动逻辑 2026/10/1 16:37:01

实体卡带好价盘点:版本、汇率与价格波动逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
解决H5报错:API can only be initiated by a user gesture的完整指南 2026/10/1 16:37:01

解决H5报错:API can only be initiated by a user gesture的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
小程序 ECharts 真机适配:ec-canvas 从白屏到性能优化 2026/10/1 16:37:00

小程序 ECharts 真机适配:ec-canvas 从白屏到性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
视觉引导拆垛的3D相机选型七条硬性红线 2026/10/1 16:36:54

视觉引导拆垛的3D相机选型七条硬性红线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉