EasyExcel列表填充数据时指定单元格合并

package com.susing.security.handler;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.susing.common.utils.RowRangeDto;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;
import java.util.Map;/*** easyexcel 拦截器, 拦截设置相同的类别合并单元格* @Author * @Date 2021/11/30 22:31* @description*/
public class BizMergeStrategy  extends AbstractMergeStrategy {private Map<String, List<RowRangeDto>> strategyMap;private Sheet sheet;public BizMergeStrategy(Map<String, List<RowRangeDto>> strategyMap) {this.strategyMap = strategyMap;}@Overrideprotected void merge(org.apache.poi.ss.usermodel.Sheet sheet, Cell cell, Head head, Integer integer) {this.sheet = sheet;if (cell.getRowIndex() == 2 && cell.getColumnIndex() == 0) {/*** 保证每个cell被合并一次,如果不加上面的判断,因为是一个cell一个cell操作的,* 例如合并A2:A3,当cell为A2时,合并A2,A3,但是当cell为A3时,又是合并A2,A3,* 但此时A2,A3已经是合并的单元格了*/for (Map.Entry<String, List<RowRangeDto>> entry : strategyMap.entrySet()) {Integer columnIndex = Integer.valueOf(entry.getKey());entry.getValue().forEach(rowRange -> {//添加一个合并请求sheet.addMergedRegionUnsafe(new CellRangeAddress(rowRange.getStart(),rowRange.getEnd(), columnIndex, columnIndex));});}}}
}

ExcelUtil 方法

package com.susing.common.utils;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Author * @Date 2021/11/30 22:57* @description*/
public class ExcelUtil {/*** 添加合并策略*/public static Map<String, List<RowRangeDto>> addMerStrategy(List<Map<String, Object>>  excelDtoList) {Map<String, List<RowRangeDto>> strategyMap = new HashMap<>();Map<String, Object> preExcelDto = null;for (int i = 0; i < excelDtoList.size(); i++) {Map<String, Object> currDto = excelDtoList.get(i);if (preExcelDto != null) {//从第二行开始判断是否需要合并if (currDto.get("categoryName").equals(preExcelDto.get("categoryName"))) {//如果类别一样,则可合并单位格为一列fillStrategyMap(strategyMap, "0", i+1);}}preExcelDto = currDto;}return strategyMap;}/*** 新增或修改合并策略**/private static void fillStrategyMap(Map<String, List<RowRangeDto>> strategyMap, String key, int index) {List<RowRangeDto> rowRangeDtoList = strategyMap.get(key) == null ? new ArrayList<>() : strategyMap.get(key);boolean flag = false;for (RowRangeDto dto : rowRangeDtoList) {//分段list中是否有end索引是上一行索引的,如果有,则索引+1if (dto.getEnd() == index) {dto.setEnd(index + 1);flag = true;}}//如果没有,则新增分段if (!flag) {rowRangeDtoList.add(new RowRangeDto(index, index + 1));}strategyMap.put(key, rowRangeDtoList);}
}
package com.susing.common.utils;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;/*** @Author dfp* @Date 2021/11/30 22:57* @description*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class RowRangeDto {private int start;private int end;
}

引用

 Map<String, List<RowRangeDto>> strategyMap = ExcelUtil.addMerStrategy(list);WriteSheet writeSheet = EasyExcel.writerSheet("统计表").registerWriteHandler(new BizMergeStrategy(strategyMap)).build();

完结
…∧_∧   ∧_∧
( ゚ ー ゚)  (´・ω・`)
( ∪   ∪ )
と__))((__つ

【EasyExcel】EasyExcel列表填充数据时指定单元格合并相关推荐

  1. 阿里 easyExcel 动态写入数据,多级表头,单元格合并示例

    excel写入流程 public static void main(String[] args) throws Exception {//标题List<List<String>> ...

  2. java怎么确定数据在区间内_处理数据时,单元格内内容太多无法计数怎么破?...

    在职场办公中,处理数据时有时会遇到古里古怪的数据源,比如从系统导出来的或是表哥表弟们录入数据的不规范.从而使得后续处理起来比较棘手.规范数据源很重要! 话不多说,先来看看今天要分享的案例:每个订单下有 ...

  3. EasyExcel:利用模板进行填充字段,生成公式处理,监听单元格填充后触发事件,相同日期单元格合并

    EasyExcel EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https://github.c ...

  4. easyexcel 无模板写入_给位,问个问题,用easyExcel无模板导出数据时,怎么在指定单元格添加计算公式呢?...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 easyExcel没用过,spire.xls.jar可以给指定单元格添加各种公式 import com.spire.xls.*; public class ...

  5. 基于java + easyExcel实现模板填充生成动态模板并设置指定单元格为下拉框样式

    需求描述:java后端开发过程中,为了满足动态生成excel模板并设置指定单元格为下拉框,且下拉框的数据项来源为动态查询的需求,在基于easyExcel的情况下,使用模板填充的方式,完成该需求. 1. ...

  6. 基于注解和EasyExcel指定单元格下拉选内容

    基于注解和EasyExcel指定单元格下拉选内容 1.场景描述 要求基于EasyExcel进行导出,有的单元格的内容必须是通过下拉选内容进行编辑,以便于后续修改导入,规避用户随意录入数据. 2.编写测 ...

  7. EasyExcel锁定指定单元格 禁止表格复制

    3.0版本:https://github.com/asdfLiang/easy-excel-test 2.0版本:https://github.com/asdfLiang/easyexcel-low- ...

  8. EasyExcel使用模板填充数据导出遇到的坑

    EasyExcel使用模板填充数据导出遇到的坑 1.最近需求涉及excel的导出,所以选择用阿里的EasyExcel框架来使用是比较方便的,这个框架封装了许多方法来供我们使用,比传统POI简单许多 2 ...

  9. 关于使用EasyExcel进行单元格合并的问题

    关于使用EasyExcel进行单元格合并的问题 1.项目场景: 简介:报销单导出要根据指定的excel模板去自动替换对应,然后重新生成一份新的excel.在给定的excel模板中,有部分字段进行了单元 ...

最新文章

  1. android布局共享,布局共享(如所有ACTIVITY拥有相同的布局部分,比如ACTIONBAR,在BASEACTIVITY中写入布局)...
  2. 如何在命令行模式下升级的你Visual Studio的Solution文件
  3. Nginx正则表达式之匹配操作符详解
  4. Dataset之Cityscapes:Cityscapes数据集的简介、安装、使用方法之详细攻略
  5. navigationController的NavigationBar和ToolBar的POP或PUSH消失问题
  6. 个人DP训练(基础版)
  7. oracle 体系结构及内存管理 15_存储结构
  8. 面对对象三大特性之一继承性。
  9. java实现贪吃蛇小游戏(源码+注释)
  10. html简单的网页制作
  11. 数据库Update操作的一些技巧总结
  12. blender 51个必须熟练记住的基础操作
  13. Android 8.0 状态栏信号显示、信号定制
  14. Gridea+Coding Page个人网站搭建
  15. linux怎么卸载gdb,卸载GDB 包
  16. ceph rgw:bucket policy实现
  17. 名校博士生临近毕业突然离世!去世前一直在熬夜完善毕业论文...
  18. 微信小程序_4,WXSS模板样式
  19. Mysql递归调用,报错:Subquery returns more than 1 row
  20. PAT——1006 换个格式输出整数

热门文章

  1. HPCC实践教程(初步)
  2. “小丑”(Joker)Android恶意窃听软件
  3. 中望3D 2021“草图”之“使用先前平面”
  4. 直播协议服务器,p2p直播服务器和流媒体协议有关系吗?
  5. 迅雷大全官方免费下载【互联网影视资源聚合平台】
  6. 实验七 团队作业3:团队项目原型设计与开发
  7. 20200521小鸡叫叫(中台测试工程师)面试经验
  8. WinPcap学习(十)wpcap.dll
  9. Thread 模拟营业大厅叫号程序
  10. python形状识别算法_Python人工智能使用OpenCV进行图片形状的中心检测