easyexcel版本:3.3.2
需求背景:将一个款下面所有sku相同颜色合并,款维度胚纱合并。
合并后的效果
逻辑:添加对应合并的区间即可
public class ExcelFillCellMergeStrategyHandler implements CellWriteHandler {
private List<ExcelFillCellMergeStrategy> strategies;
public ExcelFillCellMergeStrategyHandler(List<ExcelFillCellMergeStrategy> strategies) {
this.strategies = strategies;
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
int curRowIndex = cell.getRowIndex();
int curColIndex = cell.getColumnIndex();
Sheet sheet = writeSheetHolder.getSheet();
for (ExcelFillCellMergeStrategy strategy : strategies) {
//需要合并的列
if (curColIndex == strategy.getMergeColumn() && !strategy.getIsMerge()) {
//需要合并的行
int startRow = strategy.startRow;
int mergeRow = strategy.getMergeRow();
int lastRow = startRow + mergeRow;
if (curRowIndex <= lastRow && curRowIndex >= startRow) {
// 添加合并的区域
CellRangeAddress cellRangeAddress = new CellRangeAddress(startRow, lastRow, curColIndex, curColIndex);
sheet.addMergedRegion(cellRangeAddress);
strategy.setIsMerge(true);
}
}
}
}
/**
* 合并策略,合并那一列,哪一行下面多少行
*/
@Data
public static class ExcelFillCellMergeStrategy{
/**
* 合并的列
*/
private int mergeColumn;
/**
* 合并行数
*/
private int mergeRow;
/**
* 开始行
*/
private int startRow;
/**
* 是否合并过
*/
private Boolean isMerge;
}
}