EasyExcel上下合并单元格

策略效果

在这里插入图片描述
在这里插入图片描述

上下合并策略

//EasyExcel上下合并单元格策略
@Data
    public class ExcelFillCellMergeStrategy implements CellWriteHandler{
        //合并字段的下标,如第1列至第5列  new int[]{0,1,2,3,4}
        private int[] mergeColumnIndex;
        //从第几行开始合并,如果表头占两行,这个数字就是2
        private int mergeRowIndex;

        public ExcelFillCellMergeStrategy(){}

        public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex){
            this.mergeRowIndex = mergeRowIndex;
            this.mergeColumnIndex = mergeColumnIndex;
        }

        @Override
        public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                    Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead){}

        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                   Head head, Integer relativeRowIndex, Boolean isHead){}

        @Override
        public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                          WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead){}

        @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();

            if(curRowIndex > mergeRowIndex){
                for(int i = 0; i < mergeColumnIndex.length; i++){
                    if(curColIndex == mergeColumnIndex[i]){
                        mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                        break;
                    }
                }
            }
		 }

        private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex){
            //获取当前行的当前列的数据和上一行的当前行的当前列的数据,对比是否相同进行合并
            Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
            Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
            Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
            //比较当前行的第一列单元格与上一行是否相同,相同合并当前单元格与上一行
            if(curData.equals(preData)){
                Sheet sheet = writeSheetHolder.getSheet();
                List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
                boolean isMerged = false;
                for(int i = 0; i < mergeRegions.size() && !isMerged; i++){
                    CellRangeAddress cellRangeAddr = mergeRegions.get(i);
                    //若上一个单元格已经被合并,则先移出原有的合并单元,在重新添加合并单元
                    if(cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)){
                        sheet.removeMergedRegion(i);
                        cellRangeAddr.setLastRow(curRowIndex);
                        sheet.addMergedRegion(cellRangeAddr);
                        isMerged = true;
                    }
                }
                //若上一行的单元未被合并,则新增合并单元
                if(!isMerged){
                    CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
                    sheet.addMergedRegion(cellRangeAddress);
                }
            }
        }
    }

策略使用

//表头两行 合并第一列
.registerWriteHandler(new ExcelFillCellMergeStrategy(2,new int[]{0}))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值