EasyExcel 文件导出 - 合并某些列值相同的行

2024-09-05 22:12

本文主要是介绍EasyExcel 文件导出 - 合并某些列值相同的行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • EasyExcel 文件导出 - 合并某些列值相同的行
    • 最终效果
    • 实现思路
    • 创建单元格合并的策略类
    • 使用

EasyExcel 文件导出 - 合并某些列值相同的行

在数据处理与文件导出的过程中,我们常常会遇到各种特定的需求。今天,我们就来探讨一下使用 EasyExcel 进行文件导出时,如何合并某些列值相同的行,以实现更加高效和整洁的数据呈现。

最终效果

下面对2、3、4列进行单元格合并。
在这里插入图片描述

实现思路

判断当前行与上一行对应的值是否相等,若相等则进行合并操作。整个过程十分简洁明了。

创建单元格合并的策略类

注意:下面有使用lombok包,我的EasyExcel版本是4.0.2

public class RowSameValueMergeStrategy extends AbstractMergeStrategy {/*** 需要合并的列位置索引*/private int[] mergeColumnIndexArray;// 记录mergeColumnIndexArray中每一列的上一行的值和索引private Map<Integer, ValueAndIndex> lastValueMap;/*** 用来记录上一次的值和索引,用于判断是否需要合并*/@Data@AllArgsConstructorstatic class ValueAndIndex {private String value;private int index;}public RowSameValueMergeStrategy(int[] mergeColumnIndexArray) {this.mergeColumnIndexArray = mergeColumnIndexArray;int initialCapacity = (int) Math.ceil(mergeColumnIndexArray.length / 0.75);lastValueMap = new HashMap<>(initialCapacity);}@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {if (head == null) {return;}if (mergeColumnIndexArray == null) {return;}for (int i = 0; i < mergeColumnIndexArray.length; i++) {int mergeIndex = mergeColumnIndexArray[i];if (head.getColumnIndex() == mergeIndex) {String value = cell.getStringCellValue();int rowIndex = cell.getRowIndex();if (lastValueMap.get(mergeIndex) == null) {lastValueMap.put(mergeIndex, new ValueAndIndex(value, rowIndex));}ValueAndIndex valueAndIndex = lastValueMap.get(mergeIndex);Integer lastRowIndex = valueAndIndex.getIndex();String lastValue = valueAndIndex.getValue();// 合并值相同的相邻单元格,当前单元格合并上一个单元格if (Objects.equals(value, lastValue) && lastRowIndex != rowIndex) {sheet.addMergedRegionUnsafe(new CellRangeAddress(lastRowIndex, // 起始行rowIndex,     // 结束行mergeIndex,   // 起始列mergeIndex   // 结束列));}lastValueMap.put(mergeIndex, new ValueAndIndex(value, rowIndex));}}}}

使用

使用registerWriteHandler把上面的合并单元格的策略类注册即可。

         int[] mergeColumnIndexArray = {2, 3, 4}; // 要合并的列excelWriter = EasyExcel.write(outputStream, clazz).registerWriteHandler(new RowSameValueMergeStrategy(mergeColumnIndexArray)).build();

这篇关于EasyExcel 文件导出 - 合并某些列值相同的行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140207

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

MySQL使用mysqldump导出数据

mysql mysqldump只导出表结构或只导出数据的实现方法 备份数据库: #mysqldump 数据库名 >数据库备份名 #mysqldump -A -u用户名 -p密码 数据库名>数据库备份名 #mysqldump -d -A --add-drop-table -uroot -p >xxx.sql 1.导出结构不导出数据 mysqldump --opt -d 数据库名 -u

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

【Python从入门到进阶】64、Pandas如何实现数据的Concat合并

接上篇《63.Pandas如何实现数据的Merge》 上一篇我们学习了Pandas如何实现数据的Merge,本篇我们来继续学习Pandas如何实现数据的Concat合并。 一、引言 在数据处理过程中,经常需要将多个数据集合并为一个统一的数据集,以便进行进一步的分析或建模。这种需求在多种场景下都非常常见,比如合并不同来源的数据集以获取更全面的信息、将时间序列数据按时间顺序拼接起来以观察长期趋势等

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{"fieldName": "userId","fieldDesc": "用户id"},{"fieldName": "age","fieldDe

如何根据相同分隔符提取间隔数据?

最近遇到很多提问怎么提取字符的,而这些问题都有一个相同的特征,就是要提取的内容与内容之间,都有着相同的分隔符。当然,这种问题直接用“数据” →  “分列”功能就可以一步到位实现的,但有人喜欢折腾,而更多的人又非得指定函数公式的方法,或者更多的是要保持数据的同步性。   下面,我们就来讲讲用函数公式应该怎么实现这个提取,首先来个数据和要求,如下图,将 - 号间隔的内容依次提取到右边单元格内:

eclipse中相同变量显示变色设置

java文件的设置"Window"-"preferences"-"Java"-"Editor"-"Mark Occurrences"复选框勾选 js文件的设  置"Window"-"preferences"-"web"-"javascript"-"Mark Occurrences"复选框勾选 。