easyexcel icon indicating copy to clipboard operation
easyexcel copied to clipboard

合并行报错

Open GithubGey opened this issue 2 years ago • 1 comments

异常信息: 我需要怎么才能避面合并行报此错误 Cannot add merged region A24:B24 to sheet because it overlaps with an existing merged region (B24:J24).

代码

public class ExcelMerge implements CellWriteHandler {

    /*开始合并行 index从0开始*/
    private int mergeRowStartIndex;
    /*结束合并行*/
    private int mergeRowEndIndex;
    /*合并列*/
    private int[] mergeColumnIndex;


    private String mergeGs;

    public ExcelMerge() {
    }


    public ExcelMerge(int mergeRowStartIndex, int[] mergeColumnIndex) {
        this.mergeRowStartIndex = mergeRowStartIndex;
        this.mergeColumnIndex = mergeColumnIndex;
    }

    public ExcelMerge(int mergeRowStartIndex,int mergeRowEndIndex, int[] mergeColumnIndex) {
        this.mergeRowStartIndex = mergeRowStartIndex;
        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 afterCellDispose(CellWriteHandlerContext context) {

        Cell cell = context.getCell();
        WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
        //当前行
        int curRowIndex = cell.getRowIndex();
        //当前列
        int curColIndex = cell.getColumnIndex();

        if ( curRowIndex > mergeRowStartIndex && curRowIndex <= mergeRowEndIndex && StringUtils.isBlank(mergeGs)) {
            for (int i = 0; i < mergeColumnIndex.length; i++) {
                if (curColIndex == mergeColumnIndex[i]) {
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                    break;
                }
            }
            return;
        }
        
    }


    /**
     * 当前单元格向上合并
     *
     * @param writeSheetHolder
     * @param cell             当前单元格
     * @param curRowIndex      当前行
     * @param curColIndex      当前列
     */
    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();
        // 将当前单元格数据与上一个单元格数据比较
        Boolean dataBool = preData.equals(curData);
        //此处需要注意:获取每一行第二列数据和上一行第一列数据进行比较,如果相等合并
        Boolean bool = cell.getRow().getCell(0).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getStringCellValue());
        if (dataBool && bool) {
            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);
            }
        }
    }

  

}

GithubGey avatar Dec 27 '22 08:12 GithubGey

这个很明显是合并单元格冲突了,每次输出下合并的单元格。看下是否重叠了

zhuangjiaju avatar Jan 13 '23 09:01 zhuangjiaju

不知道您是否已经通过其他渠道解决该问题?我们先暂时关闭这个问题,如果还存在问题请重新Reopen这个issue

gongxuanzhang avatar Feb 04 '23 06:02 gongxuanzhang