使用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();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36040.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++图论(二)之图的存储图解

在 C 中实现图的存储时&#xff0c;常用的方法包括 邻接矩阵&#xff08;Adjacency Matrix&#xff09;、邻接表&#xff08;Adjacency List&#xff09; 和 边列表&#xff08;Edge List&#xff09;。以下是具体实现方法、优缺点分析及代码示例&#xff1a; 1. 邻接矩阵&…

ABAP PDF预览

画个屏幕 PDF JPG TXT都可以参考预览&#xff0c;把二进制流传递给标准函数就行 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *&am…

Compose 的产生和原理

引言 compose 出现的目的&#xff1a; 重新定义android 上ui 的编写方式。为了提高android 原生ui开发效率。让android 的UI开发方式跟上时代。 正文 compose 是什么&#xff1f; 就是一套ui框架 和flutter 一样是一套ui框架 Flutter&#xff1a;跨平台开发趋势与企业应用的…

单口路由器多拨号ADSL实现方法

条件是多拨号场景&#xff0c;公司路由器接口不够用

H3C SecPath SysScan-AK 系列漏洞扫描系统

H3C SecPath SysScan-AK 系列是一款专业的漏洞扫描系统&#xff0c;旨在帮助组织和企业快速、准确地发现网络和系统中存在的安全漏洞。该系统具有以下特点&#xff1a; 1. 多样化的扫描能力&#xff1a;支持对各类网络设备、服务器、应用程序等进行漏洞扫描&#xff0c;能够全面…

[蓝桥杯 2023 省 B] 飞机降落

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…

Kafka详解——介绍与部署

1. 什么是 Kafka&#xff1f; Kafka 是一个分布式的消息队列系统&#xff0c;最初由 LinkedIn 开发&#xff0c;后来成为 Apache 开源项目。它的主要用途包括实时数据处理、日志收集、数据流管道构建等。Kafka 具备高吞吐量、可扩展性、持久性和容错性&#xff0c;广泛应用于大…

win10搭建opengl环境搭建并测试--输出立方体球体和碗型并在球体上贴图

参照本文档可以完成环境搭建和测试&#xff0c;如果想要快速完成环境的搭建可以获取本人的工程&#xff0c;包括所用到的工具链和测试工程源码获取&#xff08;非免费介意务下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1H2ejbT7kLM9ore5MqyomgA 提取码: 8s1b …

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

DAY13.1 Java核心基础 TCP协议 TCP 协议是面向连接的运算层协议&#xff0c;比较复杂&#xff0c;应用程序在使用TCP协议之前必须建立连接&#xff0c;才能传输数据&#xff0c;数据传输完毕之后需要释放连接 就好比现实生活中的打电话&#xff0c;首先确保电话打通了才能进…

如何在 GoLand 中设置默认项目文件夹

在使用 GoLand 进行开发时&#xff0c;设置一个默认的项目文件夹可以大大提高工作效率。默认项目文件夹会在你打开或新建项目时自动预选&#xff0c;避免每次都需要手动导航到目标目录。本文将详细介绍如何在 GoLand 中设置默认项目文件夹。 步骤一&#xff1a;打开系统设置 …

SvelteKit 最新中文文档教程(5)—— 页面选项

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

Mac下Ollama安装全攻略:开启本地大模型之旅

文章目录 Mac下Ollama安装全攻略&#xff1a;开启本地大模型之旅一、Ollama 是什么功能特点优势应用场景 二、安装前准备&#xff08;一&#xff09;系统要求&#xff08;二&#xff09;硬件要求 三、下载安装包&#xff08;一&#xff09;官网下载&#xff08;二&#xff09;其…

华为营销流程落地方案:MTC=MTL+LTC

目录 简介 MTC流程 作者简介 简介 只讲最本质的底层逻辑&#xff0c;交付可落地的方案。 作为一个主打实践的产品老炮&#xff0c;接下来我将结合自己的经验&#xff0c; 以华为系的这套流程为基准&#xff0c; 将涉及业务层次的流程全部重构一套本地化、落地化的方案。 …

vscode使用ssh同时连接主机CentOS:user和ubuntu20.04:docker

主机为CentOS docker为Ubuntu20.04 两者可以使用一个vscode远程链接 1.使用已拉取好的Ubuntu镜像建立docker容器 2.进入容器内,下载一些关于ssh的安装包 apt-get install vim apt-get install openssh-client apt-get install openssh-server apt-get install ssh passwd …

NFS网络文件共享服务

文章目录 1. NFS工作原理1.1 挂载结构介绍1.2 NFS的工作原理 2. NFS服务安装2.1 NFS软件列表2.2 启动NFS相关服务2.3 NFS服务常见进程2.4 实战配置NFS服务器端 3. NFS服务配置3.1 在NFS Server端执行的操作3.1.1 查看部署环境3.1.2 启动rpcbind及NFS服务&#xff0c;然后加入开…

《多语言实时交流辅助系统前端的设计与实现》开题报告

个人主页&#xff1a;大数据蟒行探索者 目录 一、选题目的与意义 1.选题目的 2选题意义 2.1技术挑战与创新 2.2市场需求 2.3促进文化交流 2.4教育应用 2.5社会影响 二、研究现状与文献综述 1.研究现状 2.文献综述 2.1 前端技术的发展与应用 2.2 自然语言处理技术…

SpringCloud网关:Gateway路由配置与过滤器链

文章目录 引言一、Gateway基本架构二、路由配置方式2.1 配置文件方式2.2 Java代码方式 三、内置断言工厂四、内置过滤器工厂4.1 请求路径相关过滤器4.2 请求和响应头过滤器4.3 功能性过滤器 五、自定义过滤器5.1 自定义GatewayFilter5.2 自定义过滤器工厂 六、全局过滤器总结 引…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

Excel(函数进阶篇):Vlookup函数进阶、TAKE嵌套SORE函数、SUBTOTAL函数、INDIRECT函数

目录 Vlookup函数返回多列结果Vlookup函数多条件匹配Vlookup函数部分匹配TAKE函数嵌套SORT函数&#xff0c;提取排序数据SUBTOTAL函数&#xff1a;制作动态报表SUBTOTAL函数&#xff1a;创建连续编号INDIRECT函数Vlookup跨多表抓取数据INDIRECT函数常见跨表的错误Vloopup函数联…

大模型 VS 传统算法:人工智能时代的“新老对话“

大模型 VS 传统算法&#xff1a;人工智能时代的"新老对话" 在AlphaGo击败李世石、ChatGPT掀起全民AI热潮的今天&#xff0c;人们往往将"大模型"与"算法"混为一谈。但当我们深入技术内核时会发现&#xff0c;这二者恰似人工智能发展的两个平行宇…