EasyExcel模板填充list时按第一行格式合并单元格(含分页线设置)

news2024/11/24 22:42:29

前言:

在使用easyExcel填充list时,第一行存在合并单元格的情况下,后面使用forceNewRow()填充的行却没有合并样式。

模板:

填充后:

自定义拦截器:

根据官方文档的提示,我们需要自定义拦截器来对单元格进行操作。拦截器MyHandler继承了easyExcel的AbstractMergeStrategy类,并重写了merge方法用于定义具体的单元格合并逻辑。

merge方法主要用于检查当前单元格的上一行对应位置的单元格是否已被合并。如果已被合并,则在当前单元格的位置创建一个新的合并区域,并设置该区域的边框样式,以此来保持填充list时合并区域的连续性。

public class MyHandler extends AbstractMergeStrategy {

    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        if(relativeRowIndex==null ||relativeRowIndex==0){
            return;
        }

        int rowIndex = cell.getRowIndex();
        int colIndex = cell.getColumnIndex();
        sheet=cell.getSheet();
        Row preRow = sheet.getRow(rowIndex - 1);
        Cell preCell = preRow.getCell(colIndex);//获取上一行的该格
        List<CellRangeAddress> list = sheet.getMergedRegions();
        for (int i = 0; i < list.size(); i++) {
            CellRangeAddress cellRangeAddress = list.get(i);
            if (cellRangeAddress.containsRow(preCell.getRowIndex()) && cellRangeAddress.containsColumn(preCell.getColumnIndex())) {
                int lastColIndex = cellRangeAddress.getLastColumn();
                int firstColIndex = cellRangeAddress.getFirstColumn();
                int firstRowIndex = cellRangeAddress.getFirstRow();
                CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex, firstColIndex, lastColIndex);
                sheet.addMergedRegion(cra);

                //设置合并区域cra的边框
                RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);
                RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet);
                RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet);
                RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet);
                return;
            }
        }
    }
}

定义好拦截器后,我们要在填充时调用registerWriteHandler(),将定义的拦截器作为参数。

填充后:

单元格列合并:

上面的效果已经满足了大部分人的需求。但可能有些人会有将第一列相同的item单元格进行列合并的需求,那么我们只需要将拦截器中merge方法的新增合并区域cra修改如下。如果当前单元格的内容和上一行单元格内容相等,我们要先移除上一行单元格的合并区域再和当前单元格组成新的合并区域,而不能直接合并上一行单元格,否则会报错:

修改的部分调用了getCellContent()方法,这个方法主要是来获取单元格的内容来进行比较的,具体的实现如下:

private String getCellContent(Cell cell) {
        if (cell == null) {
            return null;
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    return Double.toString(cell.getNumericCellValue());
                }
            case BOOLEAN:
                return Boolean.toString(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
}

填充后:

分页线:

可以看到现在第一列的item,相同内容的已经进行列合并了。但是我发现一个问题就是分页线错位了,在填充完list之后,分页线并没有随数据一起下移。所以我们需要在拦截器的merge方法中添加下面几行代码,就可以重新设置分页线了。

下面代码将分页线设置在填充的list最后一行数据的下一行,有其他需求的伙伴可以看情况自行修改:

填充后:

参考:EasyExcel填充时合并单元格_easyexcel填充数据合并单元格-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1531542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

backtrader回测股票:突破20日均线买入,跌破20日均线卖出

数据源&#xff1a;akshare 回测工具&#xff1a;backtrader 策略&#xff1a;突破20日均线买入&#xff0c;跌破20日均线卖出 代码&#xff1a; from datetime import datetime import backtrader as bt #1.9.78.123 import matplotlib.pyplot as plt #3.8.3 import aks…

[Qt学习笔记]QT下获取Halcon图形窗口鼠标事件并执行相应操作

目录 1、背景2、参考信息3、目标4、步骤4.1 Halcon库的配置4.2 读取图像&#xff0c;并实现图像自适应窗体控件大小4.3 主要的图形绘制和贴图操作见如下代码&#xff0c;其中重点为全局函数的创建来实现选择Select、拖拽Drag和尺寸Resize事件响应。 5、总结 1、背景 在视觉项目…

春暖花开,一起来看看2024年品牌春分海报吧!

春分&#xff08;Vernal equinox&#xff09;已至&#xff0c;春花烂漫、燕子归来、百草回芽。 今天我们要分享的是2024年品牌发布的春分节气海报合集&#xff0c;快来随我们一起感受这昂扬、蓬勃的春意吧! &#xff08;1&#xff09;泸州老窖 &#xff08;2&#xff09;BD…

C语言——自定义类型——结构体(从零到一的跨越)

目录 前言 1.什么是结构体 2.结构体类型的声明 2.1结构体的声明 2.2结构体的创建和初始化 2.3结构成员访问操作符 2.3.1结构体成员直接访问 2.3.2结构体成员的间接访问 2.4结构体变量的重命名 2.5结构体的特殊声明 2.6结构的自引用 3.结构体内存对齐 3.1对齐规则 3…

docker harbor.v2.9.2搭建镜像无法下载问题解决

在通过部署docker harbor时&#xff0c;采用的是离线包的方式&#xff0c;当解压压缩包后&#xff0c;执行prepare脚本步骤中有一步是要获取prepare:v2.9.2版本镜像 结果执行脚本时报如下错误&#xff1a; Unable to find image goharbor/prepare:v2.9.2 locally 这时候我们就…

网络: DHCP 协议简介

文章目录 1. 前言2. DHCP 协议简介2.1 DHCP 客户端广播 DHCPDISCOVER 消息2.2 DHCP 服务器回复 DHCPOFFER 消息2.3 DHCP 客户端广播 DHCPREQUEST 消息2.4 DHCP 服务器回复 DHCPACK 消息2.5 剩余的工作 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&…

【Linux】shell命令运行原理---认识Linux基本指令

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.shell命令以及运行原理 1.1 shell命令 1.2 Linux内核权限 1.3 图示Linux shell和bash的区别 2.认识Linux基本指令 2.1 指令的…

Vue.js前端开发零基础教学(一)

目录 第一章 初识Vue.js 前言 开发的好处 一.前端技术的发展 什么是单页Web应用&#xff1f; 二. Vue的简介 三. Vue的特性 四. Vue的版本 五.常见的包管理 六.安装node环境 第一章 初识Vue.js 学习目标&#xff1a; 了解前端技术的发展 了解什么是Vue掌握使用方…

Zero-Shot Learning with Joint Generative Adversarial Networks 中文版

目录 摘要介绍1.研究背景和意义2.先前的模型提出了什么方法&#xff1f;解决了什么问题&#xff1f;有什么不足&#xff1f;3.最近的研究提出了什么方法&#xff1f;解决了什么问题&#xff1f;4.最新的研究提出了什么方法&#xff1f;解决了什么问题&#xff1f;有什么不足&am…

关于自己Nginx的使用(ant design pro 部署)

一 原因 工作需要部署 ant design pro 框架开发的前端程序&#xff0c;并且需要有用到代理。就选择了nginx部署。 二 使用nginx部署 ant design pro 框架程序 1. 前端项目打包 &#xff08;1&#xff09;打包命令&#xff1a;npm run build 或者 yarn bulid &#…

SAP STMS请求重复传输

STMS 在接请求的导入的时候&#xff0c;第一次发生了错误&#xff0c;在修复了错误之后&#xff0c; 该请求二次导入显示已经该请求已全部导入 可以按如下操作进行再次导入 附加--》其他请求--》添加 输入请求号并勾选再次导入 然后点选需要重复导入的请求号即可再次导入

Redisinsight默认端口改成5540了!网上的8001都是错误的

Redisinsight 打开白屏解决方法 最近发现一个很讨厌的bug&#xff0c;就是redisinsight运行之后&#xff0c;不行了&#xff0c;在网上找到的所有资料里面&#xff0c;redis insight都是运行在8001端口&#xff0c;但是我现在发现&#xff0c;变成了5540 所以对应的docker-com…

华为ensp中rip动态路由协议原理及配置命令(详解)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言————— RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种距离矢…

什么样才叫计算机?

我和小宇早恋了&#xff0c;我们家住隔壁。 一、编码与电路——信号的转换 晚上父母会把手机没收&#xff0c;但我们还想继续聊天&#xff0c;又不敢发出声音&#xff0c;于是我们想到了这个办法... 我们把所有的中文都用灯泡的亮灭组合来表示&#xff0c;同时约定好每隔一秒读…

IDA反汇编工具详解之工程和窗口

文章目录 什么是反汇编反汇编的目的ID介绍打开创建工程IDA的基本规则窗口介绍反汇编窗口Names窗口Strings窗口十六进制窗口导出窗口导入窗口函数窗口结构体窗口枚举窗口段窗口签名窗口类型库窗口函数调用窗口问题窗口 什么是反汇编 程序员使用编译器、汇编器和链接器中的一个或…

位图与布隆过滤器

目录 一、位图 1、问题用位图来解决&#xff1a; 二、 布隆过滤器 1、将哈希与位图结合&#xff0c;即布隆过滤器 2.布隆过滤器的查找 3.布隆过滤器的删除 4.布隆过滤器优点 5、布隆过滤器缺陷 三、海量数据处理问题&#xff1a; 一、位图 问题1&#xff1a;给40亿个不…

【C++】详解 INT_MAX 和 INT_MIN(INT_MAX 和 INT_MIN是什么?它们的用途是什么?如何防止溢出?)

目录 一、前言 二、什么是 INT_MAX 和 INT_MIN &#xff1f; 三、INT_MAX 和 INT_MIN 的用途 四、如何避免溢出问题出现 &#xff1f; 五、 INT_MAX 和 INT_MIN 的运算 六、leetcode 常考面试题 七、共勉 一、前言 大家在平时刷 leetcode 的时候&#xff0c;肯定会碰到 溢出…

谷歌seo网络营销哪家好?

对于一个好的服务商的评判标准其实不难&#xff0c;保证结果&#xff0c;服务透明化&#xff0c;专业的服务&#xff0c;专业的指导&#xff0c;但怕就怕在你什么都不懂&#xff0c;只看重短期的结果&#xff0c;不懂谷歌seo的基础 一些做谷歌seo的反面例子也是需要了解的&…

上位机图像处理和嵌入式模块部署(qmacvisual三维测量)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qmacvisual软件里面&#xff0c;关于三维测量方面的内容讲的比较少。目前来说只有一个插件完成这个功能。这可能也和作者自己当时的开发环境有关…