基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录

目标

例子

1.搜索下拉框页

2.数据源页

3.效果

代码以及注意事项

1.代码

2.注意事项

1.基于Excel的话,相当于加入了一个【数据验证】

2.代码中的一些方法说明


目标

期望在Excel利用代码创建具备自动搜索功能的下拉框

例子

1.搜索下拉框页

2.数据源页

3.效果

代码以及注意事项

1.代码

package yourpackage;import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidation;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidations;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class YourClass {public static void main(String[] args) throws IOException {String pathExcel = "D:\\XXXX\\test.xlsx";File file = new File(pathExcel);FileInputStream fis = new FileInputStream(file);XSSFWorkbook book = new XSSFWorkbook(fis);XSSFSheet sheetTaget = book.getSheet("目标");XSSFSheet sheetEnum = book.getSheet("待搜索数据源");//参数说明://1.目标页; 2.目标页第一行表头的列名【自动搜索的数据】;3.数据页的最后一行;4.数据页的数据所在的列序号 5.数据页的sheet名resetDropDownPullerMenuListNoRemoveValidationUpdateFormula(sheetTaget,"自动搜索的数据",sheetEnum.getLastRowNum(),"A",sheetEnum.getSheetName());//写文件FileOutputStream fos = new FileOutputStream(file);book.write(fos);fos.close();fis.close();}public static void resetDropDownPullerMenuListNoRemoveValidationUpdateFormula(XSSFSheet sheet,String colunmName, int endNum,String indexEnum,String enumSheetName) {HashMap<String, Integer> headMap = getHeadMap(sheet);Integer indexTarget = headMap.get(colunmName)+1;Map<Integer, String> numToABCMap =  parseColumWithReturn();String targetIdexABC = numToABCMap.get(indexTarget);String sheetName = sheet.getSheetName();//找到原来数据验证项目:indexDelete并删除,否则会堆叠,报错CTDataValidations dataValidationsCurrent = sheet.getCTWorksheet().getDataValidations();int indexDelete = -1;if(null!=dataValidationsCurrent){List<CTDataValidation> dataValidationList = dataValidationsCurrent.getDataValidationList();for(int i=0;i<dataValidationList.size();i++){CTDataValidation ctDataValidation = dataValidationList.get(i);String region = ctDataValidation.getSqref().toString();//targer colunmif(region.startsWith(targetIdexABC)){indexDelete = i;break;}
//				//change the rest order
//				int oldIndex = CommonUtils.mapStringToNumber(String.valueOf(region.charAt(0)))+1;
//				if(oldIndex>=indexTarget){
//					String Indexnew = numToABCMap.get(oldIndex + 1);
//					String newRegion = region.replace(String.valueOf(region.charAt(0)),Indexnew);
//					ctDataValidation.setSqref(Collections.singletonList(newRegion));
//				}}}if(-1!=indexDelete){dataValidationsCurrent.removeDataValidation(indexDelete);}//		sheet.getCTWorksheet().unsetDataValidations();//获取当前页并设置验证【下拉框】,CT=current tablesheet.getCTWorksheet().setDataValidations(dataValidationsCurrent);//add new validationsheet.disableLocking();XSSFDataValidationHelper helper = (XSSFDataValidationHelper) sheet.getDataValidationHelper();Integer indexPhysical = headMap.get(colunmName);String indexABC = numToABCMap.get(indexPhysical+1);String enumCheetolumIndex = indexEnum;//设置搜索公式,该步骤等价于在【数据验证】中,选择序列,然后输入公式String offsetFormula = "OFFSET("+enumSheetName+"!$"+enumCheetolumIndex+"$1,MATCH(\"*\"&"+indexABC+"2&\"*\","+enumSheetName+"!$"+enumCheetolumIndex+":$"+enumCheetolumIndex+",0)-1,0,COUNTIFS("+enumSheetName+"!$"+enumCheetolumIndex+":$"+enumCheetolumIndex+",\"*\"&"+indexABC+"2&\"*\")+1,1)";XSSFDataValidationConstraint constraint = (XSSFDataValidationConstraint) helper.createFormulaListConstraint(offsetFormula);CellRangeAddressList address = new CellRangeAddressList(1, endNum+1,headMap.get(colunmName),headMap.get(colunmName));XSSFDataValidation validationNew = (XSSFDataValidation) helper.createValidation(constraint, address);validationNew.setSuppressDropDownArrow(true);validationNew.setShowErrorBox(false);sheet.addValidationData(validationNew);}public static HashMap<String, Integer> getHeadMap(XSSFSheet sheet) {HashMap<String,Integer> headMap=new HashMap<String, Integer>();XSSFRow row = sheet.getRow(0);for (int i = 0; i < row.getLastCellNum(); i++) {String value = parseCell(row.getCell(i));if (value.equals("")) {continue;}headMap.put(value, i);}return headMap;}//防止CELL为空public static String parseCell(XSSFCell cell) {if (cell!=null) {CellType cellType = cell.getCellType();String cellValue="";String tmp ="";switch (cellType) {case STRING:cellValue= cell.getStringCellValue();break;case BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());break;case BLANK:cellValue="";break;case NUMERIC:cellValue = cell.toString();if(cellValue.contains("E") && cellValue.contains(".")){
//                        String[] split = cellValue.split("\\.");
//                        cellValue = split[0];double number = Double.parseDouble(cellValue);// 创建 DecimalFormat 对象,设置格式模式为不使用科学计数法DecimalFormat df = new DecimalFormat("0.##########");// 格式化数字String result = df.format(number);cellValue = result;}else{if(cellValue.endsWith(".0")){cellValue = cellValue.replace(".0", "");}}break;case ERROR:break;case FORMULA:tmp=cell.toString();if (tmp.contains(",")) {cellValue = tmp.substring(tmp.indexOf(",")+2,tmp.length()-2);}else {cellValue = tmp;}break;}return cellValue;}else {return "";}}public static Map<Integer, String> parseColumWithReturn() {Map<Integer,String> outmap = new HashMap<Integer,String>();String base="ABCDEFGHIJKLMNOPQRSTUVWXYZ";char[] charArray = base.toCharArray();for (int i = 0; i < 50; i++) {if (i<26) {outmap.put(i+1, String.valueOf(charArray[i]));}else {outmap.put(i+1, "A"+String.valueOf(charArray[i-26]));}}return outmap;}}

2.注意事项

1.基于Excel的话,相当于加入了一个【数据验证】
=OFFSET(待搜索数据源!$A$1,MATCH("*"&A2&"*",待搜索数据源!$A:$A,0)-1,0,COUNTIFS(待搜索数据源!$A:$A,"*"&A2&"*")+1,1)

2.代码中的一些方法说明

(1)主要功能函数

resetDropDownPullerMenuListNoRemoveValidationUpdateFormula(XSSFSheet sheet,String colunmName, int endNum,String indexEnum,String enumSheetName)

参数说明:

①.目标页;

②.目标页第一行表头的列名【自动搜索的数据】;

③.数据页的最后一行;

④.数据页的数据所在的列序号

⑤.数据页的sheet名

(2)辅助函数

①getHeadMap(XSSFSheet sheet) 获取表头序列,返回一个Map<String,Integer>

②parseCell(XSSFCell cell) 将任何类型的Cell对象转换成字符串类型

③parseColumWithReturn() 返回一个Map,做数字和字母的映射。比如Excel中,1对应A,2对应B,3对应C

(3)该代码还有一些关于数据验证删除的功能,能删除旧的数据有效性。参考阅读方法:

resetDropDownPullerMenuListNoRemoveValidationUpdateFormula中关于indexDelete并删除的内容

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

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

相关文章

UWB人员定位:精准、高效、安全的智能管理解决方案

在现代企业管理、工业生产、安全监测等领域&#xff0c;UWB&#xff08;超宽带&#xff09;人员定位系统正逐步成为高精度定位技术的首选。相较于传统的GPS、Wi-Fi、蓝牙等定位方式&#xff0c;UWB具备厘米级高精度、低延迟、高安全性、抗干扰强等突出优势&#xff0c;能够实现…

如何在Apple不再支持的MacOS上安装Homebrew

手头有一台2012年产的Macbook Pro&#xff0c;系统版本停留在了10.15.7&#xff08;2020年9月24日发布的&#xff09;。MacOS 11及后续的版本都无法安装到这台老旧的电脑上。想通过pkg安装Homebrew&#xff0c;发现Homebrew releases里最新的pkg安装包不支持MacOS 10.15.7&…

某个设备的RJ45网口接头为何不可连接任何POE设备

某个设备的RJ45网口接头不可连接任何POE设备 1.POE设备是什么&#xff1f; POE设备是指支持通过以太网线传输电力和数据的设备&#xff0c;即“Power over Ethernet”&#xff08;PoE&#xff09;技术的设备。这种技术允许网络设备在传输数据的同时&#xff0c;通过标准的RJ4…

【线性代数的理解】 为什么说线性代数研究的是空间变换?旋转矩阵坐标转换矩阵

注&#xff1a; 在线性代数中 &#xff0c;常常不把点看成是点&#xff0c;而是看成是一个由原点出发的向量。所以&#xff0c;点的坐标相当于是向量的坐标。正方形&#xff08;图中灰色图形&#xff09;可以看成是由一大堆向量组成的图形&#xff0c;对这一堆向量进行A变换&a…

Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替

如题&#xff0c;笔者在Cursor中使用pycharm写python程序&#xff0c;试用期到了Tab自动补全功能就不能用了&#xff0c;安装Codeuim插件可以代替这个功能。步骤如下&#xff1a; 1. 在应用商店中搜索扩展Codeuim&#xff0c;下载安装 2. 安装完成后左下角会弹出提示框&#x…

操作系统知识点12

1.在操作系统的结构设计中&#xff0c;采用层次结构的操作系统其最大优点是把整体问题局部化 2.非特权指令是指操作系统和用户均可以使用的指令 3.向处理器发出的中断信号称为中断请求 4.轮转法RR是单纯基于时间片考虑的 5.当进程处于就绪状态时&#xff0c;表示进程已获得…

STM32学习——RTC实时时钟(BKP与RTC外设)

RTC实时时钟 RTC实时时钟 想记录或读取日期和事件&#xff0c;就可以通过操作RTC实现 RTC与BKP和PWR经常同时出现 一般情况下&#xff0c;VBTA是电池供电口&#xff0c;需要接备用电池 在BKP备份寄存器写入两个数据&#xff0c;然后再读出之后显示&#xff0c;BKP的数据&a…

C# Unity 唐老狮 No.2 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…

软件工程应试复习(考试折磨版)

针对学校软件工程考试&#xff0c;参考教材《软件工程导论&#xff08;第6版&#xff09;》1-8章 学习的艺术&#xff1a;不断地尝试&#xff0c;我一定会找到高效用的方法&#xff0c;让学习变成一门艺术&#xff0c;从应试备考中解救出我的时间同胞们。 好嘞&#xff01;既然…

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

### 经典游戏兼容补丁 cnc-ddraw 7.1 汉化版使用指南 &#xff08;适用于《红色警戒》《命令与征服》等老游戏在Win10/Win11系统运行&#xff09; 参考原文&#xff1a;针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 #### 一、补丁核心功能 **解决痛点** …

Denoising Diffusion Implicit Models (DDIM)

因为扩散模型的正向过程可以实现跳步&#xff0c;其马尔科夫性并不重要&#xff0c;因此DDIM尝试在反向过程中也舍弃马尔科夫性的约束。在引入一个可控参数 σ t \sigma_t σt​后&#xff0c;反向过程的迭代被整理为预测 x 0 x_0 x0​后重新进行正向扩散的过程&#xff0c;扩散…

LearnOpenGL之Shader编程用算法绘画

———————————————————— 前序 ——————————————————— AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;GitHub - wangyongyao1989/AndroidLearnOpenGL: OpenGL基础及运用 系列文章&#xff…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_buf_t

ngx_buf_t 定义在 src/core/ngx_buf.h typedef struct ngx_buf_s ngx_buf_t;struct ngx_buf_s {u_char *pos;u_char *last;off_t file_pos;off_t file_last;u_char *start; /* start of buffer */u_char …

第5章_管理策略

管理策略 如前所述&#xff0c;策略定义了在授予对对象的访问权限之前必须满足的条件。 单击 Policy &#xff08;策略&#xff09; 选项卡可查看与资源服务器关联的所有策略。 在此选项卡上&#xff0c;您可以查看以前创建的策略列表&#xff0c;以及创建和编辑策略。 要创…

Chromium_src源码

Chromium_src源码 码云上有一个OpenHarmony-TPC/chromium_src项目&#xff0c;目前已经停止维护了&#xff0c;迁移到GitCode上了&#xff0c;源代码项目地址为&#xff1a;openharmony-tpc/chromium_chrome 特此记录一下老的项目的相关软件架构 Chromium 简介 软件架构 软…

Android ObjectBox数据库使用与集成指南

ObjectBox其核心特点ObjectBox与 SQLite 和 Realm 的对比Android集成ObjectBox创建ObjectBox实体对象创建ObjectBox操作管理类OBManager在Application初始化ObjectBox插入或更新数据查询数据统计数据分页数据查询删除数据总结今天分享一套Android另一个数据库ObjectBox。Object…

JAVA调用Deepseek的api,完成基本对话

一、准备工作 注册账号 访问 DeepSeek 官网&#xff08;如 https://www.deepseek.com/&#xff09;或对应平台。完成注册并登录&#xff0c;部分服务可能需要企业认证或申请权限。 获取 API 密钥&#xff08;如使用 API&#xff09; 进入控制台或开发者页面&#xff0c;创建…

013作用域

一、基本概念 C语言中&#xff0c;标识符都有一定的可见范围&#xff0c;这些可见范围保证了标识符只能在一个有限的区域内使用&#xff0c;这个可见范围&#xff0c;被称为作用域&#xff08;scope&#xff09;。 软件开发中&#xff0c;尽量缩小标识符的作用域是一项基本原…

AH表情捕捉设备:虚拟人动态表情捕捉

在虚拟人应用里&#xff0c;除了关注虚拟人能否展现流畅的肢体动作&#xff0c;其表情是否自然流畅同样关键。虚拟人作为新兴技术产物&#xff0c;广泛应用于娱乐直播、影视动画等领域。自然的表情能让虚拟人更具亲和力与真实感&#xff0c;大幅提升用户体验。 而广州虚拟动力…

pikachu

暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程&#xff08;非常详细&#xff09;零基础入门到精通&#xff0c;看一篇就够了&#xff01;让你挖洞事半功倍&#xff01;_burpsuite使用教程-CSDN博客 登录页面&#xff0c;随意输入抓包&#xff0c;发送到攻击…