easyPoi使用
一、核心定位区别
- EasyPoi:全能型,支持 Excel、Word、PDF 导出,注解极简,适合小数据、快速开发
- EasyExcel:高性能型,只专注 Excel,主打低内存、大数据量,适合海量数据导出
二、EasyPoi 优缺点
1、优点
①使用最简单
纯注解开发,一行代码导出,上手成本极低,新手友好。
②功能更全面
支持 Excel、Word、PDF 导出,支持图片、复杂表头、合并单元格、模板导出。
③生态成熟
文档齐全,社区问题多,适合传统企业、后台管理系统快速开发。
④小数据场景效率极高
几十行、几百行数据导出,代码量比 EasyExcel 少很多。
2、缺点
①内存占用极高(致命缺点)
底层基于Apache POI,会把整个文件加载到内存,数据上万行极易OOM(内存溢出)。
②大数据量完全不行
不支持流式读写,几万行以上就会卡、崩。
③性能差
大数据导出速度远不如 EasyExcel。
3、使用场景
- 后台管理系统
- 小数据量导出(<1 万行)
- 需要导出 Word/PDF/ 图片
- 追求开发速度,不追求极致性能
三、EasyExcel 优缺点
1、优点
①性能天花板,低内存
底层自研解析引擎,不加载全量数据到内存,采用逐行读写。百万行数据导出也不会 OOM。
②速度极快
百万行数据导出速度是 EasyPoi 的 5~10 倍。
③专门为大数据设计
阿里内部大规模使用,稳定性极强。
④API 清晰,扩展性强
2、缺点
①只支持 Excel,不支持 Word、PDF
②功能没有 EasyPoi 丰富
复杂样式、图片、合并单元格、模板语法不如 EasyPoi 灵活。
③学习成本略高
比 EasyPoi 多几行代码,需要理解读写监听器。
3、适用场景
- 大数据量导出(1 万~100 万行)
- 电商、金融、报表系统
- 高并发、高可用服务
- 怕 OOM、追求稳定性
四、引入方法
五、使用介绍
高级功能应用介绍
导出方法说明
@GetMapping("/exportByTemplate") public void exportByTemplate(HttpServletResponse response) throws IOException { // 1. 准备数据 Map<String, Object> map = new HashMap<>(); map.put("title", "用户列表"); map.put("date", new Date()); map.put("users", getUserList()); // 2. 获取模板路径 TemplateExportParams params = new TemplateExportParams( "templates/export_template.xlsx"); // 3. 导出 Workbook workbook = ExcelExportUtil.exportExcel(params, map); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment;filename=template_export.xlsx"); workbook.write(response.getOutputStream()); }模板主要参数类型:
①基础文本参数
②图片参数
easyPoi中使用对象ImageEntity
③数组集合
模板中使用特殊表达式{{$fe: list t}}这种表达式
使用参考文档:https://blog.csdn.net/m0_46300599/article/details/137911866?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-137911866-blog-99696008.235%5Ev43%5Epc_blog_bottom_relevance_base8&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-137911866-blog-99696008.235%5Ev43%5Epc_blog_bottom_relevance_base8&utm_relevant_index=1
处理单元格格式合并问题
①利用easyPoi注解
public class MergeData { @Excel(name = "部门", mergeVertical = true) // 垂直合并相同内容 private String department; @Excel(name = "姓名") private String name; @Excel(name = "月份", mergeRely = {"department"}) // 依赖于department列的合并 private String month; @Excel(name = "销售额") private BigDecimal amount; }