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

在一些业务需求中内容需要占用多个单元格的情况,如下图:

或者是这样

这样

总有一些奇怪怪的需求。

不过使用EasyExcel可以轻松处理这些变态的需求。EasyExcel中提供了@ContentLoopMerge 注解就是为了处理这种问题的。下面先看看如何使用@ContentLoopMerge 注解完成上面三个图中excel的合并。


  • 完成图一

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

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

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

java 复制代码
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
java 复制代码
/**
 * 内容循环合并
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ContentLoopMerge {

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

  /**
   * 当前属性扩展列
   *
   * @return
   */
  int columnExtend() default 1;
}
  • 在通过内容合并拦截器处
java 复制代码
/**
 * 循环合并的区域
 *
 */
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);
    }
  }
}

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

相关推荐
leikooo12 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz13 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主14 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐14 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合14 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI15 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记15 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI15 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰16 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
青山木17 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划