当前位置: 首页 > news >正文

【学习总结】EasyExcel合并同列不同行,表格数据相同的行

实体类

@Data
@HeadRowHeight(50)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, wrapped = BooleanEnum.TRUE)
public class CriterionDataExportDTO {@ColumnWidth(15)@ExcelProperty(value = "所属街道")private String streetName;@ColumnWidth(25)@ExcelProperty(value = "点位类型")private String pointType;@ColumnWidth(40)@ExcelProperty(value = "测评点位")private String pointName;@ColumnWidth(50)@ExcelProperty(value = "问题明细")private String issueDetails;@ColumnWidth(15)@ExcelProperty(value = "问题笔数")private Integer issueCount;@ColumnWidth(25)@ExcelProperty(value = "二级负责单位")private String responsibleUnit2;@ColumnWidth(25)@ExcelProperty(value = "二级单位接件时间")private String assignTime2;@ColumnWidth(25)@ExcelProperty(value = "三级负责单位")private String responsibleUnit3;@ColumnWidth(25)@ExcelProperty(value = "三级单位接件时间")private String assignTime3;@ExcelIgnoreprivate Integer pushStatus;}

工具类

继承合并单元格,重写合并方法

package com.jeesite.modules.utils.easyExcel;import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.*;public class EasyExcelUtils extends AbstractMergeStrategy {private Map<String, List<Integer>> nameRowMap = new HashMap<>();@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {int columnIndex = cell.getColumnIndex();if (columnIndex == 0) {String currentValue = cell.getStringCellValue();if (currentValue == null || currentValue.isEmpty()) {return;}int currentRowIndex = cell.getRowIndex();List<Integer> rowList = nameRowMap.getOrDefault(currentValue, new ArrayList<>());rowList.add(currentRowIndex);nameRowMap.put(currentValue, rowList);mergeRows(sheet, currentValue, rowList, columnIndex);}if (columnIndex == 2) {String currentValue = cell.getStringCellValue();if (currentValue == null || currentValue.isEmpty()) {return;}int currentRowIndex = cell.getRowIndex();List<Integer> rowList = nameRowMap.getOrDefault(currentValue, new ArrayList<>());rowList.add(currentRowIndex);nameRowMap.put(currentValue, rowList);mergeRows(sheet, currentValue, rowList, columnIndex);}}private void mergeRows(Sheet sheet, String value, List<Integer> rowList, int columnIndex) {if (rowList.size() <= 1) {return;}int startRow = rowList.get(0);int endRow = rowList.get(rowList.size() - 1);// 检查是否存在重叠合并区域CellRangeAddress existingRegion = findOverlappingRegion(sheet, startRow, endRow, columnIndex);if (existingRegion != null) {// 扩展现有合并区域以适应新的合并行startRow = Math.min(existingRegion.getFirstRow(), startRow);endRow = Math.max(existingRegion.getLastRow(), endRow);// 移除现有合并区域removeMergedRegion(sheet, existingRegion);}CellRangeAddress range = new CellRangeAddress(startRow, endRow, columnIndex, columnIndex);sheet.addMergedRegionUnsafe(range);}private CellRangeAddress findOverlappingRegion(Sheet sheet, int startRow, int endRow, int columnIndex) {for (CellRangeAddress region : sheet.getMergedRegions()) {if (region.getFirstColumn() == columnIndex && region.getLastColumn() == columnIndex) {// 只考虑指定列的合并区域if (startRow <= region.getLastRow() && endRow >= region.getFirstRow()) {return region;}}}return null;}private void removeMergedRegion(Sheet sheet, CellRangeAddress region) {int index = -1;for (int i = 0; i < sheet.getNumMergedRegions(); i++) {CellRangeAddress mergedRegion = sheet.getMergedRegion(i);if (mergedRegion.equals(region)) {index = i;break;}}if (index >= 0) {sheet.removeMergedRegion(index);}}
}

调用

public void exportTaskDetails() {List<CriterionDataExportDTO> dataDetails = dataDao.findTaskDataDetails();for (CriterionDataExportDTO item : dataDetails) {//数据处理}}//写入路径String fileName =  "D:\\数据测试_" + System.currentTimeMillis() + ".xlsx";WriteCellStyle contentWriteCellStyle = new WriteCellStyle();contentWriteCellStyle.setBorderTop(BorderStyle.THIN);contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);WriteCellStyle headWriteCellStyle = new WriteCellStyle();WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short)15);headWriteCellStyle.setWriteFont(headWriteFont);HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);EasyExcel.write(fileName, CriterionDataExportDTO.class).registerWriteHandler(new EasyExcelUtils()).registerWriteHandler(horizontalCellStyleStrategy).sheet("模板").doWrite(dataDetails);}

相关文章:

【学习总结】EasyExcel合并同列不同行,表格数据相同的行

实体类 Data HeadRowHeight(50) ContentStyle(horizontalAlignment HorizontalAlignmentEnum.CENTER, verticalAlignment VerticalAlignmentEnum.CENTER, wrapped BooleanEnum.TRUE) public class CriterionDataExportDTO {ColumnWidth(15)ExcelProperty(value "所属…...

Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角

Tokenview作为一家领先的多链区块浏览器&#xff0c;为了进一步优化区块链用户的使用体验&#xff0c;我们推出了X-ray&#xff08;余额透视&#xff09;功能。该功能将帮助您深入了解EVM系列浏览器上每个地址的交易过程&#xff0c;以一种直观、简洁的方式呈现地址的进出账情况…...

【洛谷 P1364】医院设置 题解(图论+深度优先搜索)

医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c;相邻接…...

【Java基础】- RMI原理和使用详解

【Java基础】- RMI原理和使用详解 文章目录 【Java基础】- RMI原理和使用详解一、什么RMI二、RMI原理2.1 工作原理图2.2 工作原理 三、RMI远程调用步骤3.1 RMI远程调用运行流程图3.2 RMI 远程调用步骤 四、JAVA RMI简单实现4.1 如何实现一个RMI程序4.2 JAVA实现RMI程序 一、什么…...

无水印免费4K视频素材网站 可商用-Free Stock Video

Free Stock Video是一个在线无水印免费4K视频素材网站&#xff0c;提供各种类型的4k、1080p的视频素材共免费下载&#xff0c;包括美食、水、自然、冬季、无人机、云朵、慢动作、夕阳、动态背景、缩时摄影、旅游和烟火&#xff0c;也可通过关键词搜索方式找到相关视频素材内容&…...

kubesphere中间件部署

微服务部署前中间件部署 一、MySQL部署 1.1 使用Docker实现MySQL主从复制 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql/master/log:/var/log/mysql \ -v /mydata/mysql/master/data:/var/lib/mysql \ -v /mydata/mysql/master/conf:/etc/mysql \ -e My…...

使用 AWS S3 SDK 访问 COS-腾讯云国际站代充

腾讯云国际站对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;提供了 AWS S3 兼容的 API&#xff0c;因此当用户的数据从 S3 迁移到 COS 之后&#xff0c;只需要进行简单的配置修改&#xff0c;即可让客户端应用轻松兼容 COS 服务。下面unirech小编主要介…...

c语言每日一练(15)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;上学期间将看学业情况更新。 五道选择题&#xff1a; 1、程序运行的结果…...

如何利用软文推广进行SEO优化(打造优质软文,提升网站排名)

在当今的互联网时代&#xff0c;SEO优化成为了网站推广的关键。而软文推广作为一种有效的推广方式&#xff0c;其优点不仅仅局限于SEO&#xff0c;还可以带来更多的曝光和用户流量。本文将深入探讨如何做好软文推广&#xff0c;从而提升网站排名和流量。 了解目标受众群体 内容…...

Java线程池ExecutorService和Executors应用(Spring Boot微服务)

记录&#xff1a;476 场景&#xff1a;在Spring Boot微服务中使用ExecutorService管理Java线程池。使用Executors创建线程池。使用Runnable接口实现类提交线程任务到线程池执行。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3。 1.线程和线程池基础 JDK自带线程和线程池包位…...

机器学习笔记之最优化理论与方法(八)无约束优化问题——常用求解方法(中)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[中] 引言回顾&#xff1a;最速下降算法的缺陷经典牛顿法基本介绍经典牛顿法的问题经典牛顿法的优点与缺陷经典牛顿法示例 修正牛顿法介绍拟牛顿法拟牛顿法的算法过程 矩阵 B k 1 \mathcal B_{k1} Bk1​的…...

Django系列:Django简介与MTV架构体系概述

Django系列 Django简介与MTV架构体系概述 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132890054 【介…...

锐捷交换机WEB管理系统EXCU_SHELL密码信息泄漏漏洞

一、漏洞简介 锐捷交换机 WEB 管理系统 EXCU_SHELL存在密码信息泄露漏洞&#xff0c;攻击者可从漏洞获取到管理员账号密码&#xff0c;从而以管理员权限登录。 二、影响版本 锐捷交换机 WEB 管理系统 三、资产测绘 hunterweb.body"img/free_login_ge.gif"&&…...

线性代数(六) 线性变换

前言 《线性空间》定义了空间&#xff0c;这章节来研究空间与空间的关联性 函数 函数是一个规则或映射&#xff0c;将一个集合中的每个元素&#xff08;称为自变量&#xff09;映射到另一个集合中的唯一元素&#xff08;称为因变量&#xff09;。 一般函数从 “A” 的每个元…...

Python基础运算分享

Python的运算符和其他语言类似 &#xff08;我们暂时只了解这些运算符的基本用法&#xff0c;方便我们展开后面的内容&#xff0c;高级应用暂时不介绍&#xff09; 数学运算 >>>print 19 # 加法>>>print 1.3-4 # 减法>>>print 3*5 …...

【MySQL】mysql中有哪几种类型的备份技术?它们各自有什么优缺点?

为什么要备份&#xff1f;备份类型&#xff08;从类型的角度&#xff09;备份技术&#xff08;从技术手段的角度&#xff09;不同备份方法的比较感谢 &#x1f496; 为什么要备份&#xff1f; 数据库或它所在的平台可能会出现问题&#xff0c;这时候数据库中的数据可能就遭到了…...

5基于pytorch的多目标粒子群算法,MOPSO,引导种群逼近真实Pareto前沿,算法运行结束后将外部存档中粒子作为获得的Pareto最优解近似。

基于pytorch的多目标粒子群算法&#xff0c;MOPSO,引导种群逼近真实Pareto前沿&#xff0c;算法运行结束后将外部存档中粒子作为获得的Pareto最优解近似。程序已调通&#xff0c;可以直接运行。 5pytorch多目标粒子群算法最优解5pytorch多目标粒子群算法最优解 (xiaohongshu.co…...

002 Linux 权限

前言 本文将会向您介绍关于linux权限方面的内容&#xff0c;包括文件类型&#xff0c;如何切换用户、基本权限、粘滞位等等 Linux具体的用户 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的…...

【Java 基础篇】Java可变参数:灵活处理不定数量的方法参数

在Java编程中&#xff0c;可变参数是一项强大的功能&#xff0c;它允许你编写更加灵活的方法&#xff0c;接受不定数量的参数。本文将详细解释Java可变参数的用法、语法以及最佳实践。 什么是可变参数&#xff1f; 可变参数是Java 5引入的一项功能&#xff0c;它允许你在方法…...

“网站建设流程详解:从概念到上线的每个细节“

以下是网站建设流程的详细步骤&#xff0c;从概念到上线的每个细节&#xff1a; 确定网站目标和定位&#xff1a;明确网站的主题和目标&#xff0c;根据目标受众和市场定位来决定网站的内容和设计风格。考虑网站的目的、目标受众、行业或领域等方面&#xff0c;以及网站的定位…...

DC/DC开关电源学习笔记(七)低压大电流DC/DC变换技术

低压大电流DC/DC变换技术 1. 无暂态要求的低压大电流DC/DC变换技术2. 负载极其快速变化的低压大电流DC/DC变换技术2.1 非隔离型 VRM2.2 隔离型VRM低压大电流高功率 DC/DC 变换技术,已从前些年的 3.3V 降至现在的 1.0V 左右,电流目前已可达到几十安至几百安。同时,电源的输出指标…...

XUbuntu22.04之查找进程号pidof、pgrep总结(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

BI与数据治理以及数据仓库有什么区别

你可能已经听说过BI、数据治理和数据仓库这些术语&#xff0c;它们在现代企业中起着重要的作用。虽然它们都与数据相关&#xff0c;但它们之间有着明显的区别和各自独特的功能。数聚将详细探讨BI&#xff08;商业智能&#xff09;、数据治理和数据仓库之间的区别&#xff0c;帮…...

java---jar详解

一、help C:\Users\lichf1>jar 用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项:-c 创建新档案-t 列出档案目录-x 从档案中提取指定的 (或所有) 文件-u 更新现有档案-v 在标准输出中生成详细输出-f 指定档案文件名-m…...

uni-app 新增 微信小程序之新版隐私协议

一、manifest.json中配置 "__usePrivacyCheck__": true 二、编写封装后的组件 <template><view class"privacy" v-if"showPrivacy"><view class"content"><view class"title">隐私保护指引</…...

nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(四)

到目前为止&#xff0c;虽然基础的formdesigner部分已经完成&#xff0c;但流程用formdesigner提交与审批过程中的显示还有问题。 1、后端部分 其中FormConf修改如下&#xff1a; package com.ruoyi.flowable.core;import lombok.Data;import java.util.List; import java.uti…...

公交查询系统

目录 需求分析 1 概述 2 课题分析 3 实现功能步骤 4 项目背景 概要设计 1 系统流程图. 2 功能模块. 3 各功能模块 4 数据存储 5 类设计 三、详细设计 1公交线路查询系统用户界面 2公交信息存储模快 3公交信息查询模块 4用户信息输入和输出模块 四、调试分析 五、使用说明 六、…...

opencv 轮廓顶点重新排序----四边形

def reorder(myPoints):# print(myPoints.shape)# 创建一个与myPoints具有相同形状和类型的数组myPointsNew np.zeros_like(myPoints)# 数组重塑为一个4行2列的数组myPoints myPoints.reshape((4,2))# 计算myPoints数组中每一行&#xff08;即每个点&#xff09;的坐标和add …...

【项目实战】【已开源】USB2.0 HUB 集线器的制作教程(详细步骤以及电路图解释)

写在前面 本文是一篇关于 USB2.0 HUB 集线器的制作教程&#xff0c;包括详细的步骤以及电路图解释。 本文记录了笔者制作 USB2.0 HUB 集线器的心路历程&#xff0c;希望对你有帮助。 本文以笔记形式呈现&#xff0c;通过搜集互联网多方资料写成&#xff0c;非盈利性质&#xf…...

分布式运用之rsync远程同步

一、rsync的相关知识 1.1 rsync简介 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09;是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限&#xff0c;且采用优化的同步算法&am…...

自己做的网站百度搜到/sem推广软件哪家好

#练习 #程序购物车 #启动程序后&#xff0c;让用户输入工资&#xff0c; 然后打印商品列表&#xff0c;允许用户根据商品编号购买商品用户选择商品后 #检测余额是否够&#xff0c;够就直接扣款&#xff0c;不够就提醒可随时退出&#xff0c;退出时&#xff0c;打印已购买商品和…...

中天钢铁 网站建设/google代理

启用 php-fpm 的 slow log 日志&#xff0c;查看执行时间过长的php文件&#xff0c;并将执行时间过长的进程直接终止掉&#xff01;看看效果如何&#xff01;具体操作方法也简单&#xff0c;就修改一个文件&#xff0c;执行命令&#xff1a;# vi /usr/local/php/etc/php-fpm.co…...

企业网站添加栏目/新发布的新闻

给定n个正整数ai&#xff0c;请你输出这些数的乘积的约数之和&#xff0c;答案对1097取模。 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含一个整数ai。 输出格式 输出一个整数&#xff0c;表示所给正整数的乘积的约数之和&#xff0c;答案需对1097取模。 数据…...

专业建设金融行业网站的公司/网络seo软件

类和对象面向过程和面向对象的初步认识1.类的引入1.1类的定义1.2 类的两种定义方式2. 类的访问限定符及封装2.1 访问限定符2.2 class定义的类与struct定义的类的区别2.3 封装3.类的作用域4.类的实例化5.类对象模型5.1 如何计算类对象的大小6.this指针6.1 this指针的形成6.2 thi…...

怎么看网站后台什么语言做的/今天今日头条新闻

夜光序言&#xff1a; 倔强是最难改的脾气。 假如要改&#xff0c;也要倔强地去改。 不用改&#xff0c;只有倔强的人才温柔。 怎见得呢&#xff1f; 譬如说&#xff0c;穿着讲究&#xff0c;就是对自己的温柔。 正文&#xff1a; 1. 理解文本和二进制打开方式的区别…...

web网页是什么/广东seo推广贵不贵

介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还需要掌握identity server4的基本用法,关于identity server4因为涉及到两个协议Oath2.0和openid conn…...