EasyExcel写入Excel函数
基本实现方案(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void writeWithFormula() {
String fileName = "测试公式.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
// 1. 写入正常数据
List<DemoData> dataList = getData();
excelWriter.write(dataList, writeSheet);
// 2. 写入公式行
// 假设金额在第3列,数据从第2行开始(第1行是表头)
int lastRow = dataList.size() + 1; // 最后一行的位置
List<List<Object>> formulaRowList = new ArrayList<>();
List<Object> formulaRow = new ArrayList<>();
formulaRow.add("合计"); // 第1列
formulaRow.add(null); // 第2列
// 第3列写入SUM函数,计算从第2行到最后一行的和
formulaRow.add(new FormulaData("SUM(C2:C" + lastRow + ")"));
formulaRowList.add(formulaRow);
excelWriter.write(formulaRowList, writeSheet);
}
}
// FormulaData类用于包装公式
public class FormulaData {
private String formula;
public FormulaData(String formula) {
this.formula = formula;
}
}使用CellWriteHandler实现
1
2
3
4
5
6
7
8
9
10
11
12public class FormulaCellWriteHandler implements CellWriteHandler {
public void afterCellDispose(CellWriteHandlerContext context) {
Cell cell = context.getCell();
// 判断是否是最后一行的第三列
if (cell.getRowIndex() == context.getWriteSheetHolder().getSheetNo()
&& cell.getColumnIndex() == 2) {
// 设置公式
cell.setCellFormula("SUM(C2:C" + (cell.getRowIndex()) + ")");
}
}
}支持的常用Excel函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 求和函数
"SUM(C2:C10)"
// 平均值函数
"AVERAGE(C2:C10)"
// 最大值函数
"MAX(C2:C10)"
// 最小值函数
"MIN(C2:C10)"
// 计数函数
"COUNT(C2:C10)"
// IF条件函数
"IF(C2>100,\"高\",\"低\")"注意事项
- 函数单元格需要使用FormulaData包装
- 函数引用的单元格范围要准确
- 注意行列的索引从0开始
- 可以使用相对引用和绝对引用
- 复杂函数建议使用CellWriteHandler实现
EasyExcel写入公式完整示例
1 |
|
关键点说明:
- 使用
.registerWriteHandler()
注册处理器 - 处理器会在每个单元格写入时被调用
- 不需要单独写入最后一行,处理器会自动处理
- 相比之前的方案更加简洁和自动化