当前位置: 首页 > news >正文

easyexcel流式导出

EasyExcel 支持流式导出,这是它的一个重要特性。流式导出可以有效解决大数据量导出时的内存溢出问题。

流式导出的优势

  1. 内存友好 :不会一次性将所有数据加载到内存中
  2. 适合大数据量 :可以处理百万级甚至更多的数据
  3. 性能稳定 :内存占用相对固定,不会随数据量增长而线性增加

基本用法示例

1. 简单流式导出

@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=data.xlsx");// 创建ExcelWriter对象ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), DemoData.class).build();// 分页查询数据并写入int pageSize = 1000;int pageNum = 1;while (true) {List<DemoData> dataList = getDataFromDatabase(pageNum, pageSize);if (dataList.isEmpty()) {break;}// 写入当前页数据WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();excelWriter.write(dataList, writeSheet);pageNum++;}// 关闭流excelWriter.finish();
}

2. 使用分页助手

@GetMapping("/exportWithPage")
public void exportWithPage(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=data.xlsx");EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("Sheet1").doWrite(() -> {// 分页查询数据List<DemoData> dataList = new ArrayList<>();int pageSize = 1000;int pageNum = 1;while (true) {List<DemoData> pageData = getDataFromDatabase(pageNum, pageSize);if (pageData.isEmpty()) {break;}dataList.addAll(pageData);pageNum++;}return dataList;});
}

3. 手动控制写入过程

@GetMapping("/exportManual")
public void exportManual(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=data.xlsx");ExcelWriter excelWriter = null;try {excelWriter = EasyExcel.write(response.getOutputStream(), DemoData.class).build();WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();// 分批写入数据int pageSize = 1000;int pageNum = 1;while (true) {List<DemoData> dataList = getDataFromDatabase(pageNum, pageSize);if (dataList.isEmpty()) {break;}excelWriter.write(dataList, writeSheet);pageNum++;}} finally {if (excelWriter != null) {excelWriter.finish();}}
}

4. 多Sheet流式导出

@GetMapping("/exportMultiSheet")
public void exportMultiSheet(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=data.xlsx");ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), DemoData.class).build();try {// 第一个SheetWriteSheet sheet1 = EasyExcel.writerSheet(0, "Sheet1").build();List<DemoData> data1 = getDataForSheet1();excelWriter.write(data1, sheet1);// 第二个SheetWriteSheet sheet2 = EasyExcel.writerSheet(1, "Sheet2").build();List<DemoData> data2 = getDataForSheet2();excelWriter.write(data2, sheet2);} finally {excelWriter.finish();}
}

注意事项

  1. 及时关闭资源 :使用完后要调用 excelWriter.finish() 关闭流
  2. 异常处理 :要做好异常处理,确保资源能够正确释放
  3. 数据分页 :合理设置分页大小,一般建议1000-5000条数据为一批
  4. 内存监控 :虽然流式导出内存友好,但仍需监控JVM内存使用情况

流式导出是EasyExcel处理大数据量导出的最佳实践,特别适合需要导出大量数据的业务场景。

http://www.lryc.cn/news/597941.html

相关文章:

  • Windows计算器项目全流程案例:从需求到架构到实现
  • 4.5 优化器中常见的梯度下降算法
  • 绿色转向的时代红利:创新新材如何以技术与标准主导全球铝业低碳重构
  • 从手动操作到自动化:火语言 RPA 在多系统协作中的实践
  • 飞腾D3000麒麟信安系统下配置intel I210 MAC
  • 基础入门 [CMD] Windows SSH 连接服务器教程(系统自带方式)
  • Linux和Windows基于V4L2和TCP的QT监控
  • 【MAC电脑系统变量管理】
  • 进程调度的艺术:从概念本质到 Linux 内核实现
  • n8n AI资讯聚合与分发自动化教程:从数据获取到微信与Notion集成
  • RabbitMQ--消息顺序性
  • 【华为】笔试真题训练_20250611
  • go下载包
  • 数据库常用DDL语言
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • M²IV:面向大型视觉-语言模型中高效且细粒度的多模态上下文学习
  • RabbitMQ简述
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-16,(知识点:电平转换电路)
  • RabbitMQ—仲裁队列
  • <论文>(斯坦福)DSPy:将声明式语言模型调用编译为自我优化的pipeline
  • 等保二级、三级配置表(阿里云)
  • RuoYi-Vue 项目 Docker 全流程部署实战教程
  • 【LeetCode数据结构】二叉树的应用(一)——单值二叉树问题、相同的树问题、对称二叉树问题、另一棵树的子树问题详解
  • [数据结构]#6 树
  • JVM Java虚拟机
  • 【Qt开发】信号与槽(一)
  • 机器学习入门指南它来了
  • LeetCodeOJ题:回文链表
  • Java学习----原型模式
  • vant-field 显示radio