自定义easyexcel动态合并单元格

289 阅读1分钟

easyexcel版本:3.3.2

需求背景:将一个款下面所有sku相同颜色合并,款维度胚纱合并。

合并后的效果 image.png

逻辑:添加对应合并的区间即可

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;


    }

}