EasyExcel合并单元格,通过注解方式实现自定义合并策略

简介

今天博主探讨如何实现EasyExcel自定义实现单元格合并策略,考虑需要抽象代码、适用于更多的业务场景,提供了两个工具类,参考过很多博主的方案,并整合优化了一下。
主要思路提供的博主:十一技术斩

代码

  • 首先自定义注解CustomMerge,用于标记哪些属性需要合并,哪个是主键**(这里做了一个优化,可以标记多个主键)**
/*** 自定义注解,用于判断是否需要合并以及合并的主键*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface CustomMerge {/*** 是否需要合并单元格*/boolean needMerge() default false;/*** 是否是主键,即该字段相同的行合并*/boolean isPk() default false;
}
  • 再创建自定义单元格合并策略类CustomMergeStrategy,当Excel中两列主键相同时,合并被标记需要合并的列**(当前类增加多主键判断是否需要合并)**
/*** 自定义单元格合并策略*/
public class CustomMergeStrategy implements RowWriteHandler {/*** 主键下标集合*/private List<Integer> pkColumnIndex = new ArrayList<>();/*** 需要合并的列的下标集合*/private List<Integer> needMergeColumnIndex = new ArrayList<>();/*** DTO数据类型*/private Class<?> elementType;public CustomMergeStrategy(Class<?> elementType) {this.elementType = elementType;}@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {// 如果是标题,则直接返回if (isHead) {return;}// 获取当前sheetSheet sheet = writeSheetHolder.getSheet();// 获取标题行Row titleRow = sheet.getRow(0);if (pkColumnIndex.isEmpty()) {this.lazyInit(writeSheetHolder);}// 判断是否需要和上一行进行合并// 不能和标题合并,只能数据行之间合并if (row.getRowNum() <= 1) {return;}// 获取上一行数据Row lastRow = sheet.getRow(row.getRowNum() - 1);// 将本行和上一行是同一类型的数据(通过主键字段进行判断),则需要合并boolean margeBol = true;for (Integer pkIndex : pkColumnIndex) {String lastKey = lastRow.getCell(pkIndex).getCellType() == CellType.STRING ? lastRow.getCell(pkIndex).getStringCellValue() : String.ValueOf(lastRow.getCell(pkIndex).getNumericCellValue());String currentKey = row.getCell(pkIndex).getCellType() == CellType.STRING ? row.getCell(pkIndex).getStringCellValue() : String.ValueOf(row.getCell(pkIndex).getNumericCellValue());if (!StringUtils.equalsIgnoreCase(lastKey, currentKey)) {margeBol = false;break;}}if (margeBol) {for (Integer needMerIndex : needMergeColumnIndex) {CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(),needMerIndex, needMerIndex);sheet.addMergedRegionUnsafe(cellRangeAddress);}}}/*** 初始化主键下标和需要合并字段的下标*/private void lazyInit(WriteSheetHolder writeSheetHolder) {// 获取当前sheetSheet sheet = writeSheetHolder.getSheet();// 获取标题行Row titleRow = sheet.getRow(0);// 获取DTO的类型Class<?> eleType = this.elementType;// 获取DTO所有的属性Field[] fields = eleType.getDeclaredFields();int i = 0;// 遍历所有的字段,因为是基于DTO的字段来构建excel,所以字段数 >= excel的列数for (Field theField : fields) {// 获取@ExcelProperty注解,用于获取该字段对应在excel中的列的下标ExcelProperty easyExcelAnno = theField.getAnnotation(ExcelProperty.class);// 为空,则表示该字段不需要导入到excel,直接处理下一个字段if (null == easyExcelAnno) {continue;}// 获取自定义的注解,用于合并单元格CustomMerge customMerge = theField.getAnnotation(CustomMerge.class);// 没有@CustomMerge注解的默认不合并if (null == customMerge) {continue;}// 判断是否有主键标识if (customMerge.isPk()) {pkColumnIndex.add(i);}// 判断是否需要合并if (customMerge.needMerge()) {needMergeColumnIndex.add(i);}}// 没有指定主键,则异常if (pkColumnIndex.isEmpty()) {throw new IllegalStateException("使用@CustomMerge注解必须指定主键");}}
}

总结

实现效果可以参考上面十一技术斩
,这里主要对博主的自定义策略做了一些小小的优化,希望能帮到更多需要同学。

EasyExcel合并单元格,通过注解方式实现自定义合并策略相关推荐

  1. html统计表合并单元格的快捷键,word怎样设置合并单元格快捷键

    word2010中合并单元格的快捷键是什么?求解答. 合并单元格没有快捷键,不过有个f4是重复上一步操作,所以你要合并多个单元格,那么你可以先点一合并单元格,然后选定你要合并的区域. WORD合并单元 ...

  2. excel模板合并单元格(jxls 合并单元格)---工具net.sf.jxls扩展---支持合并单元格(无需代码方式合并)

    概述 excel比较常用的工具类就是poi和jxl当然后者已经停止维护很久而且只支持excel2003,不支持excel2007. 对2003版,最大行数是65536行 ,对2007以上版本,最大行数 ...

  3. EasyExcel合并单元格(同列相同数据合并)

    合并后效果如下: 合并策略代码: public class CustomMergeStrategy extends AbstractMergeStrategy {/*** 分组,每几行合并一次*/pr ...

  4. CSS合并单元格四种方式:table/display/flex/grid

    目录 方式一:table[最简单写法] 方式二:display: table--不推荐 方式三:display: flex 方式四:display: grid 效果图: 方式一:table[最简单写法 ...

  5. poi 读取excel合并单元格两种方式

    说明: excel合并是用选择的两个或更多单元格创建一个单元格的过程.合并单元格时,如果有多个选择的单元格包含数据,则将保留左上角或右上角(取决于当前的视图方向)单元格中的数据,并删除其余的所有数据. ...

  6. 在合并单元格中数组公式无效_Excel合并单元格查找,公式没错,结果为0,你知道这是什么原因吗...

    如果说你能够熟练运用Excel函数中的查询家族,可以说大多数的问题你都可以解决了.但很多情况下,我们会遇到脑壳疼的问题,比如你看看下面的例子. 下图中,需要在右边的表格中通过E列的机型查找其对应的品牌 ...

  7. Pandas读取excel合并单元格的正确姿势(openpyxl合并单元格拆分并填充内容)

    问题介绍(ffill填充存在的问题) 在pandas读取excel经常会遇到合并单元格的问题.例如: 此时使用pandas读取到的内容为: 如果去百度,几乎所有人会说应该用如下代码: df['班级'] ...

  8. 合并单元格后打字换行_excel中合并了单元格以后往里面打字如果打两行字,怎么换行...

    点击查看excel中合并了单元格以后往里面打字如果打两行字,怎么换行具体信息 答:1.演示使用的软件为Excel电子表格,软件版本为office家庭和学生版2016. 2.为了演示如何在合并的单元格中 ...

  9. html表格怎么纵向合并单元格,在html中表格如何合并单元格

    在html中表格如何合并单元格 发布时间:2020-04-28 10:55:12 来源:亿速云 阅读:777 作者:小新 这篇文章主要为大家详细介绍了在html中表格如何合并单元格,文中示例代码介绍的 ...

最新文章

  1. Android setOnItemClickListener cannot be used with a spinner
  2. css sprites之圆角
  3. 美团某程序员困惑:辅导组里妹子两三年,对方工作依然不行,想让她走又不舍得,怎么办?...
  4. Django1.9开发博客02- 模型
  5. MapReduce工作原理图文详解
  6. bootstrap4导航栏点击弹出表单_Bootstrap4从入门到精通
  7. 微课堂迎圣诞送福利 | 姬十三@你:我想和你相聚社区共度圣诞良宵,约么?
  8. Delphi将输入汉字自动产生拼音简码
  9. Python有了concurrent的话mutiprocessing和threading还有存在的意义吗?
  10. python中运算符号怎样表示_Python中的运算符与表达式
  11. 前端学习(1743):前端调试值之调试元素的hover样式
  12. 晨哥真有料丨你太容易被得到了!
  13. Unity3D引擎工作笔记0002---Unity3D 5下载安装
  14. 唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题
  15. Spark 集群安装
  16. 现实中的软件工程:如何快速迭代代码
  17. centos win xp双系统 安装手记 9660 grldr U盘安装
  18. ubuntu git clone 报错error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected
  19. CMake的使用例子
  20. win10卸载python3

热门文章

  1. 代码太长看不懂怎么办
  2. Browser-sync安装与使用
  3. 3. 驱动初步-------Uboot
  4. 四、忘记电脑开机密码怎么办?(附详细教程)
  5. 重磅!陀螺财经发布2019「年度影响力专栏」百强榜
  6. for、for...in、for...of、forEach的区别
  7. uniCloud云函数
  8. cf游戏服务器显示怪文,cf游戏服务器异常怎么解决方案
  9. 计算机网络要点(第二章)
  10. 毕业设计-基于深度学习的指针式仪表读数识别系统