package com.monkeylessey.excel; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import java.util.List; /** * @author:xp * @date:2024/3/16 11:20 */ public class DynamicMergeCellStrategy extends AbstractMergeStrategy { /** * 第几行到第几行合并一次 */ private List rowMergeList; /** * 哪些列需要合并行 */ private List mergeWhichColumn; public DynamicMergeCellStrategy(List rowMergeList, List mergeWhichColumn) { this.rowMergeList = rowMergeList; this.mergeWhichColumn = mergeWhichColumn; } @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { // 只有单元格的行列在合并范围内才合并 if (mergeWhichColumn.contains(cell.getColumnIndex())) { rowMergeList.stream().forEach(rowItem -> { if (rowItem.getStart() <= relativeRowIndex && rowItem.getEnd() >= relativeRowIndex) { CellRangeAddress cellRangeAddress = new CellRangeAddress(rowItem.getStart(), rowItem.getEnd(), cell.getColumnIndex(), cell.getColumnIndex()); sheet.addMergedRegionUnsafe(cellRangeAddress); } }); } } }