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

使用easyexcel实现单元格样式设置和下拉框设置

1.单元格样式设置

1.1实体类

public class DemoData {@ExcelProperty("PK")private String name;@ExcelProperty("年龄")private int age;// 必须提供无参构造方法public DemoData() {}public DemoData(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
// 省略 getter/setter
}

1.2启动类

public class ExcelExporter {public static void main(String[] args) {String fileName = "D:\\idea代码\\demo1\\src\\main\\resources\\example3.xlsx";List<com.example.demo1.com.liyingjie.mapper.ExcelExporter.DemoData> dataList = new ArrayList<>();dataList.add(new com.example.demo1.com.liyingjie.mapper.ExcelExporter.DemoData("姓名", 20));dataList.add(new com.example.demo1.com.liyingjie.mapper.ExcelExporter.DemoData("姓名", 30));EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new HeaderBackgroundColorHandler()).sheet("Sheet1").doWrite(dataList);}
}

1.3自定义拦截器

public class HeaderBackgroundColorHandler implements CellWriteHandler {private  Set<String> targetHeaders;  // 目标表头集合private  String targetHeader1="PK";private  String targetHeader2="主";@Overridepublic void afterCellDispose(CellWriteHandlerContext context) {boolean isHead = context.getHead() != null && context.getHead();// 处理表头行if (isHead) {String headerValue = context.getFirstCellData().getStringValue();if (headerValue.trim().contains(targetHeader1) || headerValue.trim().contains(targetHeader2)) {// 获取或创建样式WriteCellStyle writeCellStyle = context.getFirstCellData().getOrCreateStyle();// 设置背景色writeCellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);// 设置字体样式WriteFont writeFont = new WriteFont();writeFont.setBold(true);  // 加粗writeFont.setColor(IndexedColors.BLACK.getIndex());  // 字体颜色writeCellStyle.setWriteFont(writeFont);}}}}

2 下拉框设置

2.1实体类

public class Employee {@ExcelProperty("姓名")private String name;// 姓名@ExcelProperty("部门")private String department; // 部门@ExcelProperty("职位")private String position; // 职位// 无参构造函数public Employee() {}// 全参构造函数public Employee(String name, String department, String position) {this.name = name;this.department = department;this.position = position;}// Getter和Setter方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}// toString方法@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", department='" + department + '\'' +", position='" + position + '\'' +'}';}
}
public class Department {@ExcelProperty(value = "部门")private String departmentName; // 部门名称@ExcelProperty(value = "职位")private String position; // 职位// 无参构造函数public Department() {}// 全参构造函数public Department(String departmentName, String position) {this.departmentName = departmentName;this.position = position;}// Getter和Setter方法public String getDepartmentName() {return departmentName;}public void setDepartmentName(String departmentName) {this.departmentName = departmentName;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}// toString方法@Overridepublic String toString() {return "Department{" +"departmentName='" + departmentName + '\'' +", position='" + position + '\'' +'}';}
}

2.2自定义拦截器

public class DynamicDropDownHandler implements SheetWriteHandler {// 字典数据格式: Map<表头名称, Map<Key, Value>> private final Map<String, Map<Integer, String>> dictDataMap;// 新增:传入的表头数据private final List<List<String>> listHead;public DynamicDropDownHandler(Map<String, Map<Integer, String>> dictDataMap, List<List<String>> listHead) {this.dictDataMap = dictDataMap;this.listHead = listHead;}@Overridepublic void afterSheetCreate(SheetWriteHandlerContext context) {Sheet sheet = context.getWriteSheetHolder().getSheet();DataValidationHelper helper = sheet.getDataValidationHelper();// 1. 直接使用传入的表头数据,跳过映射逻辑Map<String, Integer> headerMap = new HashMap<>();for (int i = 0; i < listHead.size(); i++) {List<String> headers = listHead.get(i);if (!headers.isEmpty()) {headerMap.put(headers.get(0), i); // 取每个 List<String> 的第一个元素作为表头名称}}// 2. 遍历字典数据,设置下拉框for (Map.Entry<String, Map<Integer, String>> entry : dictDataMap.entrySet()) {String headerName = entry.getKey();Map<?, ?> optionsMap = entry.getValue();// 如果当前 Sheet 存在该表头,则设置下拉框if (headerMap.containsKey(headerName)) {// 提取下拉选项(假设使用 Map 的 Value 作为选项)List<String> options = new ArrayList<>();for (Object value : optionsMap.values()) {options.add(value.toString());}// 设置下拉框setDropDownForColumn(sheet, helper, headerMap.get(headerName), options);} else {System.out.println("未找到匹配的表头: " + headerName);}}}/*** 为指定列设置下拉框*/private void setDropDownForColumn(Sheet sheet,DataValidationHelper helper,int columnIndex,List<String> options) {if (options.isEmpty()) return;// 设置应用范围(从第二行开始,默认设置100行)int lastRow = 100; // 默认设置100行CellRangeAddressList range = new CellRangeAddressList(1, lastRow, columnIndex, columnIndex);// 创建数据验证约束DataValidationConstraint constraint = helper.createExplicitListConstraint(options.toArray(new String[0]));// 创建并应用验证DataValidation validation = helper.createValidation(constraint, range);validation.setSuppressDropDownArrow(true);sheet.addValidationData(validation);}
}

2.3启动类

public class Main {public static void main(String[] args) {// 定义字典数据格式: Map<表头名称, Map<Key, Value>>Map<String, Map<Integer, String>> dictData = new LinkedHashMap<>();// 部门下拉选项(Key 可忽略)Map<Integer, String> departmentOptions = new HashMap<>();departmentOptions.put(1, "技术部");departmentOptions.put(2, "市场部");departmentOptions.put(3, "财务部");dictData.put("部门", departmentOptions);// 职位下拉选项Map<Integer, String> positionOptions = new HashMap<>();positionOptions.put(1, "开发工程师");positionOptions.put(2, "销售经理");positionOptions.put(3, "会计");dictData.put("职位", positionOptions);Employee employee1 = new Employee("张三", "技术部", "开发工程师");Employee employee2 = new Employee("李四", "市场部", "销售经理");ArrayList<Employee> list = new ArrayList<>();list.add(employee1);list.add(employee2);ArrayList<Department> list1 = new ArrayList<>();Department department = new Department("技术部", "技术经理");Department department1=  new Department("技术部", "技术经理");list1.add(department);list1.add(department1);List<List<String>> listHead = new ArrayList<>();listHead.add(new ArrayList<String>() {{add("姓名");
}});
listHead.add(new ArrayList<String>() {{add("部门");
}});
listHead.add(new ArrayList<String>() {{add("职位");
}});// 写入 ExcelString fileName = "D:\\idea代码\\demo1\\src\\main\\resources\\output24.xlsx";ExcelWriter build = EasyExcel.write(fileName).build();// 注册处理器WriteSheet dic = EasyExcel.writerSheet("字典项页").head(Department.class).build();build.write(list1, dic);WriteSheet data = EasyExcel.writerSheet("数据页").head(listHead).registerWriteHandler(new DynamicDropDownHandler(dictData,listHead)).build();// 写入数据build.write(list, data);build.finish();}
}

相关文章:

使用easyexcel实现单元格样式设置和下拉框设置

1.单元格样式设置 1.1实体类 public class DemoData {ExcelProperty("PK")private String name;ExcelProperty("年龄")private int age;// 必须提供无参构造方法public DemoData() {}public DemoData(String name, int age) {this.name name;this.age …...

TCP 三次握手四次挥手过程详解

注&#xff1a;本文为 “TCP 的三次握手与四次挥手” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;未整理去重。 英文引文第二篇&#xff0c;实为国内《稀土掘金技术社区》文章&#xff0c;没检索到原文&#xff0c;此处 “出口转内销” 。 如有内…...

射频相关概念

射频&#xff08;Radio Frequency, RF) 是电磁波谱中频率范围在 3 kHz 到 300GHz的电磁波&#xff0c;广泛应用于通信、雷达、广播、医疗等领域。其基本原理涉及电磁波的产生、传播、调制与解调&#xff0c;以及射频系统的设计。以下是射频技术的核心要点&#xff1a; 1. 电磁…...

几款可用于绘制工艺原理图的开源框架

一、LogicFlow 由滴滴团队开发的开源流程图框架&#xff0c;支持高度定制的工艺原理图绘制。 • 核心特性&#xff1a; • 提供拖拽式界面和丰富的节点类型&#xff08;矩形、圆形、多边形等&#xff09;&#xff0c;支持自定义节点形状、样式和交互逻辑。 • 支持插件扩展&am…...

27.卷2的答案

CSP-J离我们不远了&#xff0c;加加油啦&#xff01; 1.堆排序最坏时间复杂度是&#xff1f; 解析&#xff1a;平时多多练习可知&#xff0c;最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位&#xff0c;并将第二位四舍五入&#xff1f; 解析&#xff1a;经过试…...

程序编译生成的文件

目录 .i 文件 .s 文件 .o文件 总结 在 C 编程中&#xff0c;.i、.s和 .o 文件是编译过程中生成的不同阶段的文件&#xff0c;它们代表不同的含义&#xff1a; .i 文件 全称 &#xff1a;预处理后的文件&#xff08;Intermediate File&#xff09;。 含义&#xff1a;.i文件…...

C++类的基础题(4)

练习1&#xff1a;&#xff08;简单&#xff09; 基于如下程序&#xff0c;按要求修改和完善。 #include <iostream> using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {numn;scores;} void displ…...

浏览器中输入某个地址后发生了什么

首先浏览器会进行DNS解析&#xff0c;将网址中的域名&#xff08;比如&#xff1a;jcm.com&#xff09;解析为IP地址。理解&#xff1a;DNS为电话本&#xff0c;域名为名字&#xff0c;IP地址为电话号码&#xff1b;其次浏览器需要和网站服务器建立连接&#xff0c;也就是通过三…...

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…...

WPS 搭配 Zotero 插件使用

安装Zotero后&#xff0c;Word自动引入了插件&#xff0c;但WPS却没有&#xff0c;做为WPS的重度用户&#xff0c;这是不行的。 解决方案&#xff1a; 1.找到 Zotero.dotm 一般在安装目录下&#xff0c; 2.然后复制到WPS的startup下 我的目录是&#xff1a;C:\Users\lianq…...

汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响

引言 失去发动机的掩蔽效应后&#xff0c;新能源电车的NVH问题&#xff0c;成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别&#xff0c;根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源&#xff1f;今天分享的这个案例&#xff0c;内…...

万字长文详解嵌入式电机软件开发

第一章&#xff1a;嵌入式电机概述 1.1 电机类型&#xff1a;选对 “主角” 有多重要&#xff1f; 在嵌入式电机控制系统里&#xff0c;电机就如同故事中的主角&#xff0c;选对了方能使整个剧情顺利推进。不同应用场景对精度、速度、功率以及成本的需求各异&#xff0c;因而了…...

电机控制常见面试问题(十二)

文章目录 一.电机锁相环1.理解锁相环2.电机控制中的锁相环应用3.数字锁相环&#xff08;DPLL&#xff09; vs 模拟锁相环&#xff08;APLL&#xff09;4.锁相环设计的关键技术挑战5.总结 二、磁链观测1.什么是磁链&#xff1f;2.为什么要观测磁链&#xff1f;3.怎么观测磁链&am…...

卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现

摘要&#xff1a;卡尔曼滤波&#xff08;Kalman Filter&#xff09;是传感器数据融合领域的经典算法&#xff0c;在姿态解算、导航定位等嵌入式场景中广泛应用。本文将从公式推导、代码实现、参数调试三个维度深入解析卡尔曼滤波&#xff0c;并给出基于STM32硬件的完整工程案例…...

添加 ChatGPT/Grok/Gemini 到浏览器搜索引擎

添加 ChatGPT/Grok/Gemini 到浏览器搜索引擎 添加 ChatGPT/Grok/Gemini 到浏览器搜索引擎如何添加步骤 1: 打开浏览器设置步骤 2: 添加新搜索引擎步骤 3: 保存设置 注意事项 添加 ChatGPT/Grok/Gemini 到浏览器搜索引擎 在使用 ChatGPT/Grok/Gemini 进行对话时&#xff0c;每次…...

【SpringMVC】常用注解:@RequestBody

1.作用 用于获取请求实体内容&#xff0c;直接使用得到的是keyvalue&keyvalue的数据。获取请求实体内容不适用get请求。 2.属性 required 描述是否有请求体&#xff0c;默认值为true。当取值为true时&#xff0c;get 请求方式会报错。如果取值为false&#xff0c;get请…...

数学建模之数学模型-3:动态规划

文章目录 动态规划基本概念阶段状态决策策略状态转移方程指标函数最优指标函数 动态规划的求解前向算法后向算法二者比较 应用案例 一种中文分词的动态规划模型摘要引言动态规划的分词模型问题的数学描述消除状态的后效性选择优化条件 算法描述和计算实例算法的效率分析和评价结…...

Amazon Quantum Ledger Database (QLDB):革新数据可信记录的终极解决方案

在数字化浪潮中&#xff0c;企业数据的安全性与可信性成为核心挑战。无论是金融交易的透明审计、供应链的全程追踪&#xff0c;还是医疗记录的真实性验证&#xff0c;如何确保数据不可篡改且可追溯&#xff0c;已成为企业亟待解决的难题。Amazon Quantum Ledger Database (QLDB…...

Navicat SqlServer 设置自增主键

Navicat是一款优秀的数据库管理工具&#xff0c;可以连接很多类型的数据库。使用它可以极大的提高工作效率。 Navicat 不能设置SqlServer自增字段&#xff0c;只能通过sql语句来实现 建表时设置 create table <表名> ( <字段1-主键> int identity (1,1) primar…...

开源后台管理系统推荐

前言 在当今数字化时代&#xff0c;企业和组织对于管理和运营资源的需求日益增加。开源后台管理系统应运而生&#xff0c;为用户提供了一个灵活、可定制化的管理平台。本文将介绍开源后台管理系统的概念和优势&#xff0c;探讨常见的开源后台管理系统&#xff0c;以及如何选择…...

韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码

研究过程 起源与提出&#xff1a;1687 年牛顿提出 “三体问题”&#xff0c;旨在研究三个可视为质点的天体在相互之间万有引力作用下的运动规律&#xff0c;但因运动方程过于复杂&#xff0c;难以得到完全解。欧拉的贡献1&#xff1a;1767 年&#xff0c;瑞士数学家莱昂哈德・…...

iOS OC匹配多个文字修改颜色和字号

1、传入字符串数组&#xff0c;通过NSMutableAttributedString修改匹配文字 可以根据需要搞成匹配单个字符串 - (NSAttributedString *)applyFontSizeToText:(NSString *)text matchStrings:(NSArray<NSString *> *)matchStrings {NSMutableAttributedString *attribut…...

编程助手学Python--Deepseek对OpenAI的Python库调用GPT-4模型生成对话回复理解

编程助手学Python--Deepseek对OpenAI的Python库调用GPT-4模型生成对话回复理解 1. 导入库2. 设置环境变量3. 打印环境变量4. 配置 OpenAI API5. 打印 API 配置6. 定义对话消息7. 调用 OpenAI API8. 打印 API 响应9. 提取并打印生成的回复10. 代码总结11. 注意事项12. 完整代码示…...

计算机的物理组成——微机的物理结构

对于用户和维修人员来说&#xff0c;最重要的是微机实际物理结构&#xff0c;即组成微机的各个部件&#xff0c;通俗来说&#xff0c;他由主机、键盘、鼠标、显示器等部分组成。&#xff08;在 计算机基础知识——微机系统 中已经介绍了微机的主机部分&#xff09; PC 系列微机…...

STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步

主题内容教学目的/扩展视频RS232串口电路原理&#xff0c;跳线设置&#xff0c;驱动程序。与超级终端通信。了解电路原理和RS232协议。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、RS232通信系统架构二、RS232核心原理与硬件设计2.1 电气特性对比2.2 典型电路…...

C# net deepseek RAG AI开发 全流程 介绍

deepseek本地部署教程及net开发对接 步骤详解&#xff1a;安装教程及net开发对接全流程介绍 DeepSeekRAG 中的 RAG&#xff0c;全称是 Retrieval-Augmented Generation&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合外部知识库检索与大模型生成能力的技术架构。其…...

建筑管理(2): 施工承包模式,工程监理,质量监督

文章目录 一. 施工承包模式1. 施工总承包模式1.1 施工总承包的特点1.2 施工总承包模式中的承包方 2. 平行承包模式3. 联合体与合作体承包模式 二. 工程监理1. 强制实行监理的工程范围1.1 国家重点建设工程1.2 大中型公用事业工程(重点)1.3 成片开发建设的住宅小区工程1.4 必须实…...

最节省服务器,手搓电子证书查询系统

用户预算150元&#xff0c;想要一个最简单证书查询系统。前台能查询证书、后台管理员能登录能修改密码&#xff0c;证书能够手动输入修改删除、批量导入导出删除数据、查询搜索。能够兼容苹果、安卓、PC三端浏览器&#xff0c;最后帮忙部署到云服务器上。 用户预算不多&#xf…...

Go string 字符串底层逻辑

在 Go 语言中&#xff0c;string 类型的底层结构是一个结构体&#xff0c;包含两个字段&#xff1a;一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义&#xff1a;type stringStruct struct {str unsafe.Pointerlen int } str&#xff1a;这是一个指…...

STM32F407 IIC通信

1、IIC 介绍 IIC(Inter-Integrated Circuit)总线是一种由数据线 SDA 和时钟线 SCL 构成的两线式串行总线,可发送和接收数据,常用于 MPU/MCU 与外部设备连接通信、数据传输。每个连接到总线的设备都有一个独立的地址,主机可以通过该地址来访问不同设备。因为 IIC 协议比较简单…...