使用EasyExcel导出带下拉框选项excel模板

使用EasyExcel导出excel模版,表头字段动态生成下拉框选择,并且阻止输入不符合下拉框选项的值,会在表格进行提示。

为了避免excel下拉框选项过多,导致下拉框内容不显示,新建一个sheet页,将下拉框内容存储在新建的sheet页中,通过引用公式将下拉内容关联到表头字段上。

1、引入EasyExcel

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version>
</dependency>

2、导出excel模板

public void export(HttpServletResponse response) throws IOException {String fileName = "test";response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileNameEncode = URLEncoder.encode(fileName, "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileNameEncode + ExcelTypeEnum.XLS.getValue());// 模拟下拉框内容Map<Integer, List<String>> selectMap = new HashMap<>();List<String> sexList = new ArrayList<>();sexList.add("男");sexList.add("女");selectMap.put(1, sexList);List<String> typeList = new ArrayList<>();typeList.add("架构部");typeList.add("基础部");typeList.add("技术部");selectMap.put(2, typeList);//模拟表头List<List<String>> list = new ArrayList<>();List<String> field1 = new ArrayList<>();List<String> field2 = new ArrayList<>();List<String> field3 = new ArrayList<>();field1.add("编号");field2.add("性别");field3.add("部门");list.add(field1);list.add(field2);list.add(field3);EasyExcelFactory.write(response.getOutputStream()).registerWriteHandler(new SelectSheetWriteHandler(selectMap)).excelType(ExcelTypeEnum.XLS).head(list).sheet("用户sheet").doWrite(new ArrayList<>());}

3、下拉框选项代码

public class SelectSheetWriteHandler implements SheetWriteHandler {private Map<Integer, List<String>> selectMap;private char[] alphabet = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};public SelectSheetWriteHandler(Map<Integer, List<String>> selectMap) {this.selectMap = selectMap;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {if (selectMap == null || selectMap.size() == 0) {return;}// 需要设置下拉框的sheet页Sheet curSheet = writeSheetHolder.getSheet();DataValidationHelper helper = curSheet.getDataValidationHelper();String dictSheetName = "字典sheet";Workbook workbook = writeWorkbookHolder.getWorkbook();// 数据字典的sheet页Sheet dictSheet = workbook.createSheet(dictSheetName);for (Map.Entry<Integer, List<String>> entry : selectMap.entrySet()) {// 设置下拉单元格的首行、末行、首列、末列CellRangeAddressList rangeAddressList = new CellRangeAddressList(1, 65533, entry.getKey(), entry.getKey());int rowLen = entry.getValue().size();// 设置字典sheet页的值 每一列一个字典项for (int i = 0; i < rowLen; i++) {Row row = dictSheet.getRow(i);if (row == null) {row = dictSheet.createRow(i);}row.createCell(entry.getKey()).setCellValue(entry.getValue().get(i));}String excelColumn = getExcelColumn(entry.getKey());// 下拉框数据来源 eg:字典sheet!$B1:$B2String refers = dictSheetName + "!$" + excelColumn + "$1:$" + excelColumn + "$" + rowLen;// 创建可被其他单元格引用的名称Name name = workbook.createName();// 设置名称的名字name.setNameName("dict" + entry.getKey());// 设置公式name.setRefersToFormula(refers);// 设置引用约束DataValidationConstraint constraint = helper.createFormulaListConstraint("dict" + entry.getKey());// 设置约束DataValidation validation = helper.createValidation(constraint, rangeAddressList);if (validation instanceof HSSFDataValidation) {validation.setSuppressDropDownArrow(false);} else {validation.setSuppressDropDownArrow(true);validation.setShowErrorBox(true);}// 阻止输入非下拉框的值validation.setErrorStyle(DataValidation.ErrorStyle.STOP);validation.createErrorBox("提示", "此值与单元格定义格式不一致!");// 添加下拉框约束writeSheetHolder.getSheet().addValidationData(validation);}}/*** 将数字列转化成为字母列** @param num* @return*/private String getExcelColumn(int num) {String column = "";int len = alphabet.length - 1;int first = num / len;int second = num % len;if (num <= len) {column = alphabet[num] + "";} else {column = alphabet[first - 1] + "";if (second == 0) {column = column + alphabet[len] + "";} else {column = column + alphabet[second - 1] + "";}}return column;}
}

4、效果

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

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

相关文章

自动化 UI 测试智能体在 Trae 平台的部署体验

我用Trae 做了一个有意思的Agent 「自动化 UI 测试」。 点击 Trae - AI 原生 IDE 立即复刻&#xff0c;一起来玩吧&#xff01; 前言 用户界面&#xff08;UI&#xff09;作为用户与软件交互的窗口&#xff0c;其质量直接影响用户体验和产品口碑。传统的手动 UI 测试不仅效率…

身份证识别接口功能与应用场景-Android证件识别api集成

数字化信息高速发展的时代&#xff0c;信息的高效处理与精准识别已成为众多行业发展的关键驱动力。针对联网平台身份核验过程中&#xff0c;证件信息手动录入效率低、出错率高、用户体验差等问题推出了身份证识别接口&#xff0c;旨在为各行各业提供高效与便捷的身份核验解决方…

POJ2718-Smallest Difference(穷竭搜索:全排列)

题目描述 给定一些不同的十进制数字&#xff0c;您可以通过选择这些数字的一个非空子集并以某种顺序编写它们来形成一个整数。剩余的数字可以以某种顺序写下来形成第二个整数。除非结果整数为 0&#xff0c;否则整数可能不以数字 0 开头。 例如&#xff0c;如果给定数字 0, 1…

银行账户管理系统-交互系统

这篇博文是对上一篇(银行账户管理系统)的提升,上一篇是基础的学习,这一篇是在上一篇的基础上做的交互系统。Tkinter基础函数知识点点击下面超链接就可以跳转到对应的界面。希望可以帮助到你。这是则篇的框架银行账户管理系统代码解释-CSDN博客介绍。 写文章-CSDN创作中心h…

基于大数据的社会治理与决策支持方案PPT(66页)

大数据引领社会治理新变革 大数据技术的兴起&#xff0c;为社会治理带来了前所未有的变革。它改变了我们认识社会的方式&#xff0c;使得社会治理更加精准、高效。通过大数据融合分析&#xff0c;实现了对社会动态的全面监控和深度挖掘。 构建城市块数据中心 以“社会治理”…

Containerd容器技术

目录 一&#xff0c;containerd概述 1&#xff0c;containerd 概述 2&#xff0c;containerd 的主要功能 1. 容器生命周期管理 2. 与底层基础设施交互 3. 与上层系统集成 3&#xff0c;containerd 的核心特点 1. 轻量级与低资源消耗 2. 标准化与开放性 3. 高性能与稳定…

awk命令详解

Shell AWK 命令详解 一、AWK 简介与基本语法 AWK 是一种强大的文本处理工具,名称来源于其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。它逐行扫描文件,寻找匹配特定模式的行并执行相应操作。 基本语法结构: awk [选项] 模式 {动作} 文件名…

面试150跳跃游戏

思路 贪心算法&#xff0c;使用变量cover表示当前所能覆盖的最大距离&#xff0c;如果cover大于等于n-1表示能覆盖到&#xff0c;反之则不能 class Solution:def canJump(self, nums: List[int]) -> bool:if not nums:return Falsenlen(nums)cover0for i in range(n):if i…

磁悬浮轴承温度漂移克星:三招实现精准控制

在磁悬浮轴承&#xff08;Active Magnetic Bearing, AMB&#xff09;的高性能应用中&#xff0c;位置传感器的精度就是系统的生命线。然而&#xff0c;传感器输出随温度变化产生的漂移&#xff08;温漂&#xff09;&#xff0c;如同一个潜伏的破坏者&#xff0c;悄然引入测量误…

vue2 使用el-form中el-form-item单独绑定rules不生效问题

我居然在同一个问题在了两次跟头&#xff01;&#xff01;&#xff01;必须记录这个小细节&#xff01;&#xff01;&#xff01; 背景&#xff1a;一个后台的表单校验&#xff0c;表单中需要单独绑定rules&#xff0c;跳转方式后面两个选项都使用的同一个el-form-item&#xf…

利用 AWS MCP 解决区域差异问题:构建统一混合云管理平台

痛点直击&#xff1a; 企业在全球化或混合云部署中&#xff0c;常因不同区域&#xff08;如 AWS 国际区 vs 中国区&#xff09;或本地 IDC 与云环境之间的服务差异、配置标准不一、合规要求不同&#xff0c;导致管理复杂、运维低效、部署不一致。AWS Migration and Configurati…

C#.Net筑基-优雅LINQ的查询艺术

Linq&#xff08;Language Integrated Query&#xff0c;集成查询语言&#xff09;&#xff0c;顾名思义就是用来查询数据的一种语言&#xff08;可以看作是一组功能、框架特性的集合&#xff09;。在.NETFramework3.5&#xff08;大概2007年&#xff09;引入C#&#xff0c;用统…

HTML炫酷烟花

系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心&#xff08;双心版&#xff09;10…

【看到哪里写到哪里】算闰年的(year 3) == 0

【&#xff1f;&#xff1f;BUG&#xff1f;&#xff1f;】在MYSQL源码里面有一段&#xff0c;算每年的天数。其中用到了两个很有意思的 1&#xff09;(year & 3) 0 2&#xff09;(year % 400 0 && year)&#xff0c;为什么要 &&year呢&#xff1f; &g…

Redis的渐进式hash和缓存时间戳深入学习

前言 关于redis&#xff0c;可由应用维度、系统维度来进行了解。 如下所示&#xff1a; redis在缓存应用发挥着重要作用&#xff0c;不知道你有没思考过Redis为什么这么快&#xff1f; 1、纯内存访问 为什么内存访问比磁盘访问更快&#xff0c;可参考&#xff1a; 操作系统的…

视频续播功能实现 - 断点续看从前端到 Spring Boot 后端

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

【工具】Linux 中 find 命令使用教程

find 命令是 Linux 系统中最强大、最灵活的文件搜索工具&#xff0c;其能力远超简单的文件名匹配。掌握 find 能让你在复杂的文件系统中精准定位目标&#xff0c;实现高效的文件管理。 一、命令结构与核心概念 find [起始路径] [选项] [表达式]起始路径&#xff1a;搜索的根目…

0629-

0629 0629操作3. 权限 0629 操作 进入数据库 mysql -uroot -proot123 .use idatabase; select * from customer; 2.select distinct name&#xff0c;idnum from customer; 3.UPDATE customer SET idnum left(MD5(idnum),16); 4. UPDATE customer SET phone CONCAT( LEFT(p…

JVM调优实战 Day 6:JVM性能监控工具实战

【JVM调优实战 Day 6】JVM性能监控工具实战 文章简述 在Java应用的性能优化过程中&#xff0c;JVM性能监控工具是不可或缺的“眼睛”。它们能够帮助开发者实时掌握系统运行状态&#xff0c;识别性能瓶颈&#xff0c;并为后续调优提供数据支撑。本文作为“JVM调优实战”系列的第…

【嘉立创EDA】PCB 如何按板框轮廓进行铺铜

文章路标👉 :one: 文章解决问题:two: 主题内容:three: 参考方法be end..1️⃣ 文章解决问题 操作环境:嘉立创EDA专业版 V2.2.40 本文使用嘉立创EDA,描述如何在PCB设计时,直接使用板框轮廓进行铺铜。本文将此过程记录,以供有需要的读者参考。 2️⃣ 主题内容 在PCB设计…