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

前言:

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

模板:

填充后:

自定义拦截器:

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

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

java 复制代码
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()方法,这个方法主要是来获取单元格的内容来进行比较的,具体的实现如下:

java 复制代码
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博客文章浏览阅读9k次,点赞29次,收藏51次。由于填充时第二行开始,easyexcel不会自动合并单元格,所以需要自定义handler根据上一行的合并信息自行合并public class MyHandler extends AbstractMergeStrategy {@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {if(relativeRowIndex==null ||relativeRowIn_easyexcel填充数据合并单元格https://blog.csdn.net/weixin_44682948/article/details/112897500

相关推荐
weixin_727535622 分钟前
MinIO大文件上传深度拆解:从原理到生产落地的完整指南
java·中间件
摇滚侠41 分钟前
Java 全栈开发实战教程 课程笔记 34-36
java·笔记
芝士熊爱编程1 小时前
创建型模式-单例模式
java·单例模式·设计模式
大模型码小白1 小时前
Spring AI 框架实战:Java 后端集成大模型的架构设计与工程落地
java·人工智能·python·spring
weixin_BYSJ19871 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
栋***t1 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
CHANG_THE_WORLD2 小时前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
xexpertS2 小时前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
zy happy2 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
德思特2 小时前
德思特与Amarisoft达成战略合作,为4G/5G终端及无线网络测试提供高性价比新方案
经验分享