2 changed files with 110 additions and 3 deletions
@ -0,0 +1,106 @@ |
|||||
|
package com.epmet.commons.tools.utils.poi.excel.handler; |
||||
|
|
||||
|
import com.alibaba.excel.write.handler.RowWriteHandler; |
||||
|
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; |
||||
|
import com.alibaba.excel.write.metadata.holder.WriteTableHolder; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.apache.poi.ss.usermodel.Cell; |
||||
|
import org.apache.poi.ss.usermodel.CellType; |
||||
|
import org.apache.poi.ss.usermodel.Row; |
||||
|
import org.apache.poi.ss.usermodel.Sheet; |
||||
|
import org.apache.poi.ss.util.CellRangeAddress; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* desc:按行对单元格合并策略 依据是第一列的值 |
||||
|
* |
||||
|
* @author liujianjun |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
public class ExcelFillRowMergeStrategy implements RowWriteHandler { |
||||
|
|
||||
|
/** |
||||
|
* 需要合并的列 下标 |
||||
|
*/ |
||||
|
private int[] mergeColumnIndexArr; |
||||
|
/** |
||||
|
* 从下标n行开始合并 |
||||
|
*/ |
||||
|
private int mergeRowIndex; |
||||
|
/** |
||||
|
* 默认隐藏第一列 用于合并数据 |
||||
|
*/ |
||||
|
private boolean hiddenFirst = true; |
||||
|
|
||||
|
|
||||
|
public ExcelFillRowMergeStrategy(int mergeRowIndex, int[] mergeColumnIndexArr) { |
||||
|
this.mergeRowIndex = mergeRowIndex; |
||||
|
this.mergeColumnIndexArr = mergeColumnIndexArr; |
||||
|
} |
||||
|
|
||||
|
public ExcelFillRowMergeStrategy(int mergeRowIndex, int[] mergeColumnIndexArr, boolean hiddenFirst) { |
||||
|
this.mergeRowIndex = mergeRowIndex; |
||||
|
this.mergeColumnIndexArr = mergeColumnIndexArr; |
||||
|
this.hiddenFirst = hiddenFirst; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { |
||||
|
// 隐藏id列
|
||||
|
if (hiddenFirst) { |
||||
|
writeSheetHolder.getSheet().setColumnHidden(0, true); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { |
||||
|
//当前行索引
|
||||
|
int curRowNum = row.getRowNum(); |
||||
|
if (mergeColumnIndexArr != null && mergeColumnIndexArr.length > 0 && !isHead) { |
||||
|
//当前行第一列单元格
|
||||
|
Cell curA1Cell = row.getCell(0); |
||||
|
Object curA1Data = curA1Cell.getCellType() == CellType.STRING ? curA1Cell.getStringCellValue() : curA1Cell.getNumericCellValue(); |
||||
|
//上一行第一列单元格
|
||||
|
Cell preA1Cell = row.getSheet().getRow(curRowNum - 1).getCell(0); |
||||
|
Object preA1Data = preA1Cell.getCellType() == CellType.STRING ? preA1Cell.getStringCellValue() : preA1Cell.getNumericCellValue(); |
||||
|
|
||||
|
if (curA1Data.equals(preA1Data)) { |
||||
|
for (int value : mergeColumnIndexArr) { |
||||
|
mergeSameRow(writeSheetHolder, curRowNum, value); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
private void mergeSameRow(WriteSheetHolder writeSheetHolder, int curRowIndex, int curColIndex) { |
||||
|
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.addMergedRegionUnsafe(cellRangeAddr); |
||||
|
isMerged = true; |
||||
|
} |
||||
|
} |
||||
|
// 若上一个单元格未被合并,则新增合并单元
|
||||
|
if (!isMerged) { |
||||
|
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); |
||||
|
sheet.addMergedRegionUnsafe(cellRangeAddress); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
Loading…
Reference in new issue