package com.cm.bigdata.utils; 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; /** * @author renpc */ public class MergeStrategy extends AbstractMergeStrategy { private final int subjectLength; private final int nameLength; private int nextMerge1 = 0; private int nextMerge2 = 0; public MergeStrategy(int subjectLength, int nameLength) { this.subjectLength = subjectLength; this.nameLength = nameLength; } @Override protected void merge(Sheet sheet, Cell cell, Head head, int relativeRowIndex) { // 由于每个单元格单元格都会调用该方法,为了避免重复合并异常,只在应合并的行、列执行即可 // relativeRowIndex == 0,即表内容的第一行(除去表头) if (cell.getColumnIndex() == 0) { if (relativeRowIndex == 0 || relativeRowIndex == nextMerge1) { int lastRow = (subjectLength * nameLength) - 1; nextMerge1 = relativeRowIndex + lastRow; CellRangeAddress cellRangeAddress = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex() + lastRow - 1, 0, 0); sheet.addMergedRegionUnsafe(cellRangeAddress); } } else if (cell.getColumnIndex() == 4) { if (relativeRowIndex == 0 || relativeRowIndex == nextMerge2) { int lastRow = (subjectLength * nameLength) - 1; nextMerge2 = relativeRowIndex + lastRow; CellRangeAddress cellRangeAddress = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex() + lastRow - 1, 4, 4); sheet.addMergedRegionUnsafe(cellRangeAddress); } } } }