После экспорта Excel на основе EasyExcel посредством простой настройки правил объединения ячеек достигается эффект объединения ячеек, как показано на следующем рисунке:
Скриншот эффекта
Исходные данные таблицы следующие:
После настройки правил объединения ячеек объединенная таблица будет выглядеть следующим образом:
Примечание. В третьем столбце правила слияния не настроены, и данные остаются неизменными.
Класс пользовательского правила слияния
Следующий класс кода является основным классом для обработки слияния ячеек. Он в основном вычисляет одни и те же данные построчно для слияния ячеек.
package com.shanhy.demo.project.service.impl;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.shanhy.demo.common.utils.JsonUtils;
import com.shanhy.demo.project.vo.ExcelMergeStrategyModel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Excel 行合并策略
*/
@Slf4j
public class CustomLoopMergeStrategy implements RowWriteHandler {
//上一行
private Row beforeRow = null;
//合并规则(多个)
private List<ExcelMergeStrategyModel> strategyList;
//总行数(不含表头)
private int dataRowTotalSize;
//当前已经处理的行数(不含表头)
private int dataRowCurrentSize = 0;
private CustomLoopMergeStrategy() {
}
/**
* 构造方法
*
* @param loopMergeStrategyJson 合并规则JSON,其中 columnName 为要被自动计算合并的列,relativeColumnNames 表示目标合并列需要参照的相关列(值全部相同则会触发合并目标目标列的单元格)
* 示例:
* String loopMergeStrategyJson =
* [
* {
* "columnName": "A",
* "relativeColumnNames": "A"
* },
* {
* "columnName": "B",
* "relativeColumnNames": "A,B"
* },
* {
* "columnName": "C",
* "relativeColumnNames": "A,B,C"
* },
* {
* "columnName": "D",
* "relativeColumnNames": "A,B,C,D"
* }
* ];
* @param dataRowTotalSize 所有数据的行数
*/
public CustomLoopMergeStrategy(String loopMergeStrategyJson, int dataRowTotalSize) {
//记录excel行数
this.dataRowTotalSize = dataRowTotalSize;
//解析json 获取合并规则
this.strategyList = JsonUtils.jsonToList(loopMergeStrategyJson, ExcelMergeStrategyModel.class);
}
@SneakyThrows
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
//表头直接跳过
if