合并效果
定义策略
//EasyExcel左右合并单元格策略
@Data
public class ExcelFillCellMergePrevCol implements CellWriteHandler{
private static final String KEY = "%s-%s";
//所有的合并信息都存放在了这个map
Map<String,Integer> mergeInfo = new HashMap<>();
public ExcelFillCellMergePrevCol(){}
public ExcelFillCellMergePrevCol(Map<String,Integer> mergeInfo){
this.mergeInfo = mergeInfo;
}
@Override
public void beforeellCreate(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<?>> list, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead){
//当前行
int curRowIndex = cell.getRowIndex();
//当前列
int curColIndex = cell.getColumnIndex();
Integer num mergeInfo.get(String.format(KEY, curRowIndex, curColIndex));
if(null != num){
//合并最后一行、列
mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, num);
}
}
private void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex, int num){
Sheet sheet = writeSheetHolder.getSheet();
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + num);
sheet.addMergedRegion(cellRangeAddress);
}
//curRowIndex 在第几行进行 行合并
//curColIndex 在第几列进行合并
//num 从第几列开始增加多少列
//第三行,0列,开始合并3列 (3,0,2)
public void add(int curRowIndex, int curColIndex, Int num){
mergeInfo.put(String.format(KEY, curRowIndex, curColIndex),num);
}
}
如何使用
ExcelFillCellMergePrevCol mergePrevCol = new ExcelFillCellMergePrevCol();
//data为数据集合
int size = data.size();
for(int i = 0; i < size; i++){
//如果表头有两行 需要 i+2 不然报错
//从i+2行操作 在第0列合并2列
//此处传入的值和效果图无关
if(i >= size - 2){
mergePrevCol.add(i + 2, 0, 2);
}
}
.registerWriteHandler(mergePrevCol)