EasyExcel中处理内容占多个单元格
2023-12-21 11:32:18
在一些业务需求中内容需要占用多个单元格的情况,如下图:
或者是这样
这样
总有一些奇怪怪的需求。
不过使用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);
}
}
}
以上结合源码简单说明了内容合并具体还得自行学习源码.
文章来源:https://blog.csdn.net/qq_43072399/article/details/135124331
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!