EasyPOI 大数据导出

核心原理

通过 EasyPOI 的 exportBigExcel方法实现分页流式导出,避免一次性加载所有数据到内存。

适合百万级数据导出,占用内存恒定,性能稳定。

代码结构

1. 数据查询服务器(核心)

复制代码
private class DataExportServer implements IExcelExportServer {
    private final int PAGE_SIZE = 2000;  // 每页条数
    
    @Override
    public List<Object> selectListForExcelExport(Object query, int page) {
        // 1. 设置分页参数
        PageDTO pageQuery = (PageDTO) query;
        pageQuery.setPageNum(page);
        pageQuery.setPageSize(PAGE_SIZE);
        
        // 2. 查询当前页数据
        PageResult<DataVO> pageResult = dataService.getDataByPage(pageQuery);
        
        // 3. 返回数据(空列表表示结束)
        return pageResult == null ? 
            Collections.emptyList() : 
            new ArrayList<>(pageResult.getList());
    }
}

2. 导出接口

复制代码
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws IOException {
    // 设置响应头
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment;filename=data.xlsx");
    
    // 创建导出参数
    ExportParams params = new ExportParams("报表", "数据");
    
    // 创建查询条件
    PageDTO query = new PageDTO();
    query.setStartTime("2024-01-01");
    query.setEndTime("2024-12-31");
    
    // 执行导出
    Workbook workbook = ExcelExportUtil.exportBigExcel(
        params,
        DataVO.class,
        new DataExportServer(),
        query
    );
    
    // 写入响应流
    workbook.write(response.getOutputStream());
    workbook.close();
}

执行流程

  1. 启动导出 :调用 exportBigExcel方法

  2. 分页查询 :EasyPOI 自动循环调用 DataExportServer.selectListForExcelExport

    • 第1次:page=1,查询前2000条

    • 第2次:page=2,查询2001-4000条

    • 直到返回空列表为止

  3. 流式写入:每查询一页,立即写入Excel,不堆积内存

  4. 完成导出:关闭流,发送给用户

关键优势

  • 内存友好:每次只处理一页数据(如2000条)

  • 支持海量数据:理论无上限

  • 避免OOM:不会一次性加载所有数据

  • 自动分页:EasyPOI 控制分页逻辑

注意事项

  1. PAGE_SIZE设置:根据数据行宽调整(1000-5000)

  2. 数据库索引:确保分页查询效率

  3. 事务管理:长时间查询需注意事务超时

  4. 资源释放 :必须调用 workbook.close()

相关推荐
Boilermaker19925 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维6 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
C_心欲无痕6 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
alonewolf_996 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子6 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
冰西瓜6006 小时前
国科大2025操作系统高级教程期末回忆版
linux
sheji34166 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体17 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
HIT_Weston7 小时前
93、【Ubuntu】【Hugo】搭建私人博客:面包屑(一)
linux·运维·ubuntu
wszy18097 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos