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

相关推荐
极地星光2 小时前
dmesg 工具的核心功能与作用
linux
panzer_maus2 小时前
归并排序的简单介绍
java·数据结构·算法
Smartdaili China2 小时前
掌握Java网页抓取:技术与示例完整指南
java·网络·学习·指南·网页·住宅ip·爬虫api
公子无缘2 小时前
【Windows】关闭Windows Update自动更新2
windows
程序员游老板3 小时前
基于SpringBoot3_vue3_MybatisPlus_Mysql_Maven的社区养老系统/养老院管理系统
java·spring boot·mysql·毕业设计·软件工程·信息与通信·毕设
福尔摩斯张3 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
@淡 定4 小时前
Spring中@Autowired注解的实现原理
java·后端·spring
hgz07104 小时前
Linux服务器环境部署与JMeter压测准备
linux·服务器·jmeter