当前位置: 首页 > 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.dtcms.com/a/295453.html

相关文章:

  • 100元以下的儿童益智玩具推荐
  • 达梦数据库集群启停顺序全解析
  • GitHub开源项目Zerox:AI驱动的OCR革命
  • 5G-RAN与语义通信RAN
  • 社区资源媒体管理系统设计与实现
  • Spring Boot 遇上 MyBatis-Plus:高效开发的奇妙之旅
  • IO密集型、CPU密集型、负载、负载均衡
  • 250714脑电分析课题进展——基础知识扩展与论文阅读
  • java中如何返回一个可以执行返回操作(return action)的函数或对象
  • 商场导航软件的核心技术实现:3D+AI 如何解决用户搜索意图识别难题
  • 两台电脑连接交换机,使用其中一台电脑的网络上网(NAT转发)
  • Solo:基于 zkHE 的身份验证协议,构建 Web3 可信匿名身份层
  • 数字系统自动设计:从C++到门级网表
  • 在LLM中中 写好prompt 最快的方式
  • Prompt自优化框架核心信息及举例
  • 【自用】JavaSE--阶段测试
  • Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器
  • C++开发---奥比中光(Orbbec)的ob库
  • list 介绍 及 底层
  • esp32 挂载mpu6050实现加速度计
  • MiniCPM 学习部署实战 vlm
  • OSPF开放式最短路径优先
  • 【Git知识】Git 常用知识集合之基础--分支系统与 Tag 标签机制
  • YOLO算法演进综述:从YOLOv1到YOLOv13的技术突破与应用实践,一文掌握YOLO家族全部算法!
  • 2025最新MySQL面试题实战记录,互联网公司常问题目
  • 如何在 Ubuntu 24.04 服务器或桌面版上安装和使用 gedit
  • Spring AI Alibaba 快速入门指南(适合初学者)
  • 【C++】简单学——list类
  • 磁性材料如何破解服务器电源高频损耗难题?
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(3)