package com.alibaba.excel.write.merge; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import com.alibaba.excel.metadata.Head; /** * The regions of the loop merge * * @author Jiaju Zhuang */ public class LoopMergeStrategy extends AbstractMergeStrategy { private int eachRow; private int columnCount; private int columnIndex; public LoopMergeStrategy(int eachRow, int columnIndex) { this(eachRow, 1, columnIndex); } public LoopMergeStrategy(int eachRow, int columnCount, int columnIndex) { if (eachRow < 1) { throw new IllegalArgumentException("EachRows must be greater than 1"); } if (columnCount < 1) { throw new IllegalArgumentException("ColumnCount must be greater than 1"); } if (columnCount == 1 && eachRow == 1) { throw new IllegalArgumentException("ColumnCount or eachRows must be greater than 1"); } if (columnIndex < 0) { throw new IllegalArgumentException("ColumnIndex must be greater than 0"); } this.eachRow = eachRow; this.columnCount = columnCount; this.columnIndex = columnIndex; } @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { if (relativeRowIndex == null) { return; } Integer currentColumnIndex; if (head != null) { currentColumnIndex = head.getColumnIndex(); } else { currentColumnIndex = cell.getColumnIndex(); } if (currentColumnIndex == columnIndex && relativeRowIndex % eachRow == 0) { CellRangeAddress cellRangeAddress = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex() + eachRow - 1, cell.getColumnIndex(), cell.getColumnIndex() + columnCount - 1); sheet.addMergedRegionUnsafe(cellRangeAddress); } } }