- 继承RowWriteHandler
import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; import lombok.AllArgsConstructor; import lombok.Data; import org.apache.poi.ss.util.CellRangeAddress; import java.util.List; import java.util.Map;@Data @AllArgsConstructor public class MergeRowSheetWriteHandler implements RowWriteHandler {// 合并的起始行:key:开始,value;结束private Map<Integer, Integer> map;// 要合并的列,如果需要合并的列不是每行都一样,针对此参数做调整;private List<Integer> cols;@Overridepublic void afterRowDispose(RowWriteHandlerContext context) {// 如果是head或者当前行不是合并的起始行,跳过if (context.getHead() || !map.containsKey(context.getRowIndex())) {return;}Integer endRow = map.get(context.getRowIndex());if (!context.getRowIndex().equals(endRow)) {// 编列合并的列,合并行for (Integer col : cols) {// CellRangeAddress(起始行,结束行,起始列,结束列)context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(new CellRangeAddress(context.getRowIndex(), endRow, col, col));}}}}
- 调用方法
// 获取需要合并的行 Map<Integer, Integer> mergeMap = new HashMap<>(); List<DTO> dtoList= pageResult.getList(); // 要合并的起始行 int index = 2; for (DTO dto: dtoList) {for (SubDTO subDTO : dto.getSubList()) {mergeMap.put(index, index + dto.getSubList().getAccessoryList().size() - 1);index += dto.getSubList().size();} } // Arrays.asList(0, 1, 2, 3, 7, 8, 9) 是需要合并的列 ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), clazz);write.registerWriteHandler(new MergeRowSheetWriteHandler(mapMerge, Arrays.asList(0, 1, 2, 3, 7, 8, 9)).sheet(sheetName).doWrite(dataList);