核心是数据、样式、输出三层解耦:数据层自动映射字段并预处理;样式层封装三类模板并支持自定义;输出层统一封装响应控制;采用注解驱动、模板工厂、监听钩子与动态样式扩展。

核心思路是把“数据怎么填”和“样式怎么配”从业务逻辑里剥离开,用统一入口收口,让调用方只关心导出什么数据、叫什么名字、放哪张表——其余全是组件内部的事。
分层抽象:数据、样式、输出三块解耦
不把所有代码塞进一个方法里。典型结构是:
-
数据层:接收 List
或 Map ,自动映射字段;支持空值跳过、日期格式化、数字千分位等预处理 - 样式层:定义 titleStyle、headerStyle、contentStyle 三类模板,每类封装对齐、字体、背景、边框、缩放等属性;允许传入自定义 CellStyle 实例覆盖默认
- 输出层:负责设置响应头(Content-Type、Content-Disposition)、编码、流关闭控制;对 HttpServletResponse 做包装防提前关闭
模板驱动:避免硬编码行列位置
写死 createRow(0)、createCell(2) 很难维护。更稳的做法是:
- 用注解(如 @ExcelProperty、@ColumnWidth)标记实体类字段,由工具类自动推导列顺序和宽度
- 对多 Sheet 场景,用 Map
> 包装不同模块数据,key 作为 sheetName,遍历写入 - 合并单元格用坐标区间描述(如 "A1:C1"),或通过注解 @Merge({1,0,1,2}) 表示从第1行第0列到第1行第2列合并
样式复用:用工厂模式统一创建
每次 new HSSFCellStyle() 容易漏设属性。建议封装 style 工厂:
- createTitleStyle() 固定黑体+15号+居中+灰色背景
- createHeaderStyle() 固定加粗+浅灰底+细边框+自动换行
- createDateStyle() 绑定 "yyyy-MM-dd" 格式 + 居右对齐
- 所有方法返回已 fully configured 的 CellStyle,调用方直接 setCellStyle() 即可
容错与扩展:预留钩子点
复杂报表常需动态干预,比如某列要加超链接、某行要标红、最后插入小计行。组件应提供:
- writeBeforeListener / writeAfterListener 接口,允许在写入前/后插入自定义逻辑
- 支持传入 ICellStyleProvider,按行或按列动态返回样式,而非全局一套
- 对大数据量场景,默认启用 SXSSFWorkbook 模式,并暴露 flushRows 参数
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











