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()

相关推荐
chenxy023 分钟前
国产加速卡-应知应会
linux·运维·服务器
HackTwoHub4 分钟前
免 Root 安卓渗透工具 Stryker|把 Kali 装进手机!随身无线渗透工作站,内置 Nmap/Nuclei/Metasploit 全套武器库
android·linux·运维·人工智能·web安全·macos·智能手机
RuoyiOffice9 分钟前
Spring AI+Vue3 企业知识库设计:让每个答案有依据,让每份资料守住权限
java·spring boot·vue3·rag·企业知识库·spring ai·ruoyi office
代码村新手22 分钟前
Linux-环境变量
linux
kmomo..25 分钟前
Linux 驱动开发学习笔记:I2C 子系统从入门到实践
linux·驱动开发·学习
敲上瘾30 分钟前
分布式系统——Redis哨兵:自动故障转移与选举原理
linux·数据库·redis·分布式·缓存·微服务
倔强的石头1061 小时前
【Linux指南】进程通信系列(二):匿名管道 —— pipe 的本质、fork 继承与四种读写规则
java·linux·运维
一条破秋裤1 小时前
09-读写多个sys属性文件
linux
调试优选官1 小时前
2026年IoT物联网开发赛道年度榜单深度解析:D-coding物联网系统定制与源码交付能力专项解读
java·物联网·struts·iot·开发经验
木井巳1 小时前
【动态规划】三步问题
java·算法·leetcode·动态规划·推荐算法