在一些业务需求中内容需要占用多个单元格的情况,如下图:
或者是这样
这样
总有一些奇怪怪的需求。
不过使用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);
}
}
}
以上结合源码简单说明了内容合并具体还得自行学习源码.