package com.dy.pmsProduct.schedule; 
 | 
  
 | 
import com.alibaba.excel.util.BooleanUtils; 
 | 
import com.alibaba.excel.write.handler.CellWriteHandler; 
 | 
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; 
 | 
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.poi.ss.usermodel.*; 
 | 
import org.apache.poi.ss.util.CellRangeAddress; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * 自定义拦截器。 
 | 
 * 根据排班,设置横跨几行 
 | 
 */ 
 | 
@Slf4j 
 | 
@Component 
 | 
public class CustomCellWriteHandler implements CellWriteHandler { 
 | 
  
 | 
    // 设置合并相同名称的单元列 
 | 
    private int[] mergeColumnIndex = {1,2,3}; 
 | 
    // 从哪行开始合并 
 | 
    private int mergeRowIndex = 3; 
 | 
  
 | 
    @Override 
 | 
    public void afterCellDispose(CellWriteHandlerContext context) { 
 | 
        Cell cell = context.getCell(); 
 | 
        //当前行 
 | 
        int curRowIndex = cell.getRowIndex(); 
 | 
        //当前列 
 | 
        int curColIndex = cell.getColumnIndex(); 
 | 
  
 | 
        WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); 
 | 
  
 | 
        if (curRowIndex >= mergeRowIndex) { 
 | 
            for (int i = 0; i < mergeColumnIndex.length; i++) { 
 | 
                if (curColIndex == mergeColumnIndex[i]) { 
 | 
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 当前单元格向上合并 
 | 
     * 
 | 
     * @param writeSheetHolder 
 | 
     * @param cell             当前单元格 
 | 
     * @param curRowIndex      当前行 
 | 
     * @param curColIndex      当前列 
 | 
     */ 
 | 
    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) { 
 | 
        Object curId = cell.getSheet().getRow(curRowIndex).getCell(0).getStringCellValue(); 
 | 
        Object preId = cell.getSheet().getRow(curRowIndex-1).getCell(0).getStringCellValue(); 
 | 
  
 | 
        // 比较当前行的id值与上一行是否相同,相同合并当前单元格与上一行 
 | 
        if (curId.equals(preId)) { 
 | 
            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); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |