多态实现excel导出策略的核心是分离“导什么”与“怎么导”:定义统一exporter接口,由standard、streaming、template、annotationbased等实现类分别处理不同场景,通过工厂或spring配置动态选择,共用data结构并注意dispose、模板校验、注解统一处理等细节。

用多态实现多种 Excel 导出策略,核心是把“怎么导”和“导什么”分开——业务逻辑只管调用统一方法,具体格式、样式、性能策略由不同实现类决定。
定义统一导出行为接口
所有 Excel 导出方式都实现同一个接口,约定基本能力:
- export(Data data, String path):执行导出动作
- getFormatName():返回标识,如 "xlsx"、"xls" 或 "streaming-xlsx"
- supportsStreaming()(可选):是否支持流式写入,用于大数据场景判断
这样上层代码不关心是 POI 的 XSSF 还是 SXSSF,也不用写 if-else 分支。
为不同策略编写具体实现类
每种策略专注自身逻辑,互不影响:
-
StandardExcelExporter:用
XSSFWorkbook生成标准 .xlsx,适合中小数据量、需复杂样式或公式 -
StreamingExcelExporter:用
SXSSFWorkbook流式写入,内存可控,适合导出 10 万+ 行 - TemplateExcelExporter:基于预设 Excel 模板(如带表头/LOGO/固定样式),用 POI 填充数据,避免重复构建样式
- AnnotationBasedExcelExporter:配合 @ExcelColumn 等注解自动映射字段,简化实体类到列的绑定
它们都实现同一接口,但内部完全独立——改流式逻辑,不影响模板导出的编译和运行。
用工厂或配置动态选择策略
避免硬编码 new 实例。推荐两种轻量方式:
- 简单工厂:按请求参数(如 exportType=streaming)查 Map 返回对应实例
- Spring 环境下:用
@Qualifier("streamingExporter") Exporter exporter注入,或通过@Value("${excel.export.strategy:standard}")配置默认策略
调用时保持干净:
Exporter exporter = exporterFactory.getExporter("streaming");
exporter.export(orderData, "/tmp/orders.xlsx");
关键细节不能忽略
真正落地时要注意几个易错点:
- 所有实现类必须共用同一套
Data结构(如 List - 流式导出后记得调用
dispose()清理临时文件,否则磁盘可能被占满 - 模板导出要提前校验模板路径是否存在,避免运行时报空指针
- 注解导出需在工具类中统一处理字段顺序、空值显示、日期格式等,别让每个实现类重复写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











