在一些业务需求中内容需要占用多个单元格的情况,如下图:
或者是这样
这样
总有一些奇怪怪的需求。
不过使用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);}// 核心:在完成行内容写入完成后会调用此方法进行处理合并@Overridepublic 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);}}
}
以上结合源码简单说明了内容合并具体还得自行学习源码.