- 继承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; @Override public 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);
12-01
2万+
11-04
9729
12-21
2276
04-25
2027