基于EasyExcel的单元格合并自定义算法处理

本文介绍了如何利用EasyExcel在导出Excel时,通过配置自定义合并规则,达到特定的单元格合并效果。文章包含效果截图、自定义合并规则类的代码展示以及测试代码,展示了如何在第三列不进行合并的情况下,根据相同数据对其他列进行行合并。
摘要由CSDN通过智能技术生成

基于EasyExcel导出Excel后,通过对合并单元格的简单规则配置,实现如下图所示的单元格合并效果:

效果截图

原表格数据如下:

在这里插入图片描述

通过配置单元格合并规则后,生成的合并后的表格如下:

在这里插入图片描述

注:其中第三列,没有配置合并规则,数据保持不动

自定义合并规则类

如下代码类,是处理单元格合并的核心类,主要是按行计算相同数据进行单元格合并。

package com.shanhy.demo.project.service.impl;

import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.shanhy.demo.common.utils.JsonUtils;
import com.shanhy.demo.project.vo.ExcelMergeStrategyModel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Excel 行合并策略
 */
@Slf4j
public class CustomLoopMergeStrategy implements RowWriteHandler {
   

    //上一行
    private Row beforeRow = null;
    //合并规则(多个)
    private List<ExcelMergeStrategyModel> strategyList;
    //总行数(不含表头)
    private int dataRowTotalSize;
    //当前已经处理的行数(不含表头)
    private int dataRowCurrentSize = 0;

    private CustomLoopMergeStrategy() {
   
    }

    /**
     * 构造方法
     *
     * @param loopMergeStrategyJson 合并规则JSON,其中 columnName 为要被自动计算合并的列,relativeColumnNames 表示目标合并列需要参照的相关列(值全部相同则会触发合并目标目标列的单元格)
     *                              示例:
     *                              String  loopMergeStrategyJson =
     *                              [
     *                              {
     *                              "columnName": "A",
     *                              "relativeColumnNames": "A"
     *                              },
     *                              {
     *                              "columnName": "B",
     *                              "relativeColumnNames": "A,B"
     *                              },
     *                              {
     *                              "columnName": "C",
     *                              "relativeColumnNames": "A,B,C"
     *                              },
     *                              {
     *                              "columnName": "D",
     *                              "relativeColumnNames": "A,B,C,D"
     *                              }
     *                              ];
     * @param dataRowTotalSize      所有数据的行数
     */
    public CustomLoopMergeStrategy(String loopMergeStrategyJson, int dataRowTotalSize) {
   
        //记录excel行数
        this.dataRowTotalSize = dataRowTotalSize;
        //解析json 获取合并规则
        this.strategyList = JsonUtils.jsonToList(loopMergeStrategyJson, ExcelMergeStrategyModel.class);
    }

    @SneakyThrows
    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
   
        //表头直接跳过
        if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catoop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值