EasyExcel中处理内容占多个单元格

在一些业务需求中内容需要占用多个单元格的情况,如下图:
在这里插入图片描述
或者是这样
在这里插入图片描述
这样
在这里插入图片描述
总有一些奇怪怪的需求。
在这里插入图片描述
不过使用EasyExcel可以轻松处理这些变态的需求。EasyExcel中提供了@ContentLoopMerge 注解就是为了处理这种问题的。下面先看看如何使用@ContentLoopMerge 注解完成上面三个图中excel的合并。


  • 完成图一

    • 创建类模型配置相关注解
    publuc  class User {
         private String name;
         private String age;
         @ContentLoopMerge(eachRow = 4)
         private String address;
    }
    
  • 完成图二

    • 创建类模型配置相关注解
    public class User {
       private String name;
       private String age;
       @ContentLoopMerge(columnExtend = 4)
       private String address;
    }
    
  • 完成图三

    • 创建类模型配置相关注解
    public class User {
        private String name;
         private String age;
         @ContentLoopMerge(eachRow = 4, columnExtend = 5)
         private String address;
    }
    
  • 主测试类

public class Test{
  public static void mian(String[] args){
    List<User> userList = new ArrayList<>();
    User user = new User();
    user.setName("李四");
    user.setAge("12");
    user.setAddress("火星xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    userList.add(user);

    EasyExcel.write("F:\\excel\\a.xls", User.class)
        .sheet()
        .doWrite(userList);
  }
}

在这里插入图片描述


下面看看EasyExcel如何实现。

  • 注解@ContentLoopMerge
/**
 * 内容循环合并
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ContentLoopMerge {

  /**
   * 当前属性扩展行
   *
   * @return
   */
  int eachRow() default 1;

  /**
   * 当前属性扩展列
   *
   * @return
   */
  int columnExtend() default 1;
}
  • 在通过内容合并拦截器处

/**
 * 循环合并的区域
 *
 */
public class LoopMergeStrategy implements RowWriteHandler {
  /**
   * 当前属性扩展行
   */
  private final int eachRow;
  /**
   * 当前属性扩展列
   */
  private final int columnExtend;
  /**
   * 当前属性列索引
   */
  private final int columnIndex;

  public LoopMergeStrategy(int eachRow, int columnIndex) {
    this(eachRow, 1, columnIndex);
  }

  public LoopMergeStrategy(int eachRow, int columnExtend, int columnIndex) {
    if (eachRow < 1) {
      throw new IllegalArgumentException("EachRows must be greater than 1");
    }
    if (columnExtend < 1) {
      throw new IllegalArgumentException("ColumnExtend must be greater than 1");
    }
    if (columnExtend == 1 && eachRow == 1) {
      throw new IllegalArgumentException("ColumnExtend or eachRows must be greater than 1");
    }
    if (columnIndex < 0) {
      throw new IllegalArgumentException("ColumnIndex must be greater than 0");
    }
    this.eachRow = eachRow;
    this.columnExtend = columnExtend;
    this.columnIndex = columnIndex;
  }

  public LoopMergeStrategy(LoopMergeProperty loopMergeProperty, Integer columnIndex) {
    this(loopMergeProperty.getEachRow(), loopMergeProperty.getColumnExtend(), columnIndex);
  }

   // 核心:在完成行内容写入完成后会调用此方法进行处理合并
  @Override
  public void afterRowDispose(RowWriteHandlerContext context) {
    if (context.getHead() || context.getRelativeRowIndex() == null) {
      return;
    }
    if (context.getRelativeRowIndex() % eachRow == 0) {
      CellRangeAddress cellRangeAddress = new CellRangeAddress(context.getRowIndex(),
          context.getRowIndex() + eachRow - 1,
          columnIndex, columnIndex + columnExtend - 1);
      context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(cellRangeAddress);
    }
  }
}

在这里插入图片描述

以上结合源码简单说明了内容合并具体还得自行学习源码.

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel,要实现一对多对象的导出并合并单元格,可以按照以下步骤进行操作: 1. 创建一个DTO类,用于存储需要合并单元格的信息。该类需要包含以下属性: - cellIndex:需要合并的单元格列下标 - startRow:合并开始行 - endRow:合并结束行 2. 在导出时,根据一对多的关系,将需要合并的单元格信息存储到DTO对象。 3. 使用EasyExcel提供的`CellRangeAddress`类来实现单元格合并。该类的构造方法需要传入合并的起始行、结束行、起始列和结束列。 4. 在导出时,根据DTO对象的信息,创建`CellRangeAddress`对象,并将其添加到合适的地方,以实现单元格的合并。 下面是一个示例代码,演示了如何在EasyExcel导出一对多对象并合并单元格: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.util.CellRangeAddress; import java.util.ArrayList; import java.util.List; public class ExportDemo { public static void main(String[] args) { // 创建一对多对象列表 List<ParentObject> parentList = new ArrayList<>(); // 添加一对多对象数据 // 创建DTO列表,用于存储需要合并单元格的信息 List<MergeCellDTO> mergeCellList = new ArrayList<>(); // 添加需要合并单元格的信息到DTO列表 // 导出Excel String fileName = "output.xlsx"; EasyExcel.write(fileName) .registerWriteHandler(getCellStyleStrategy()) .sheet("Sheet1") .doWrite(parentList); // 合并单元格 ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(fileName); ExcelWriterSheetBuilder sheetBuilder = excelWriterBuilder.sheet("Sheet1"); for (MergeCellDTO mergeCellDTO : mergeCellList) { CellRangeAddress cellRangeAddress = new CellRangeAddress( mergeCellDTO.getStartRow(), mergeCellDTO.getEndRow(), mergeCellDTO.getCellIndex(), mergeCellDTO.getCellIndex() ); sheetBuilder.merge(cellRangeAddress); } sheetBuilder.doWrite(parentList); } // 设置单元格样式 private static HorizontalCellStyleStrategy getCellStyleStrategy() { WriteCellStyle headWriteCellStyle = new WriteCellStyle(); headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); } } ``` 请注意,上述代码的`ParentObject`是一对多对象的父对象,你需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值