当前位置: 首页 > 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.xdnf.cn/news/1177165.html

相关文章:

  • 网络测试工具
  • 在vue3中watch和watchEffect的区别
  • Windows下使用UIAutomation技术遍历桌面窗口和指定窗口内容的AutomationWalker.exe的C#源代码
  • C++高效实现轨迹规划、自动泊车、RTS游戏、战术迂回包抄、空中轨迹、手术机器人、KD树
  • Java技术栈/面试题合集(17)-Git篇
  • Spring-狂神说
  • day20 双向链表
  • MAC包头、IP包头 、UDP包头中的长度含义是啥?三者之间有啥区别?
  • 【SpringAI实战】提示词工程实现哄哄模拟器
  • 中小企业安全落地:低成本漏洞管理与攻击防御方案
  • SpringCache
  • 双紫擒龙紫紫红黄安装使用攻略,2025通达信指标源码,擒龙追踪源码公式学习
  • 遨游三防平板|国产芯片鸿蒙系统单北斗三防平板,安全高效
  • 算法调试技巧
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——4. 前后端联动:打通QML与C++的任督二脉
  • 【基础】go基础学习笔记
  • 极客大挑战2019-HTTP
  • 基于Odoo的微信小程序全栈开发探索分析
  • 探索复杂列表开发:从基础到高级的全面指南
  • SSE与Websocket有什么区别?
  • 如何在 conda 中删除环境
  • rust-结构体使用示例
  • Elasticsearch 的聚合(Aggregations)操作详解
  • 使用phpstudy极简快速安装mysql
  • Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的深度应用(361)
  • API安全监测工具:数字经济的免疫哨兵
  • 五、Vue项目开发流程
  • LeetCode 2563.统计公平数对的数目
  • Effective Python 第16条:用get处理字典缺失键,避免in与KeyError的陷阱
  • 【低空经济之无人集群】