EasyExcel导出动态合并行单元格

  1. 继承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));
                }
            }
        }
    
    }
    
  2. 调用方法
    // 获取需要合并的行
    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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值