策略效果
上下合并策略
//EasyExcel上下合并单元格策略
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler{
//合并字段的下标,如第1列至第5列 new int[]{0,1,2,3,4}
private int[] mergeColumnIndex;
//从第几行开始合并,如果表头占两行,这个数字就是2
private int mergeRowIndex;
public ExcelFillCellMergeStrategy(){}
public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex){
this.mergeRowIndex = mergeRowIndex;
this.mergeColumnIndex = mergeColumnIndex;
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead){}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
Head head, Integer relativeRowIndex, Boolean isHead){}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead){}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead){
//当前行
int curRowIndex = cell.getRowIndex();
//当前列
int curColIndex = cell.getColumnIndex();
if(curRowIndex > mergeRowIndex){
for(int i = 0; i < mergeColumnIndex.length; i++){
if(curColIndex == mergeColumnIndex[i]){
mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
break;
}
}
}
}
private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex){
//获取当前行的当前列的数据和上一行的当前行的当前列的数据,对比是否相同进行合并
Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
//比较当前行的第一列单元格与上一行是否相同,相同合并当前单元格与上一行
if(curData.equals(preData)){
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);
}
}
}
}
策略使用
//表头两行 合并第一列
.registerWriteHandler(new ExcelFillCellMergeStrategy(2,new int[]{0}))