小菜鸟

java菜鸟号正在起航

POI 操作 Excel 实现下拉框:隐藏 Sheet 方案详解

在批量导入数据的场景中,为 Excel 单元格添加下拉框可减少手动输入错误(如格式不符、选项错误)。Apache POI 提供了数据有效性校验功能,通过隐藏 Sheet 存储下拉选项的方式,可支持大量选项且避免下拉框配置冗余。本文将详细讲解实现步骤、核心代码及扩展技巧。

实现原理

为 Excel 单元格添加下拉框的核心是通过 数据有效性校验(Data Validation) 实现,具体方案:

  1. 创建隐藏 Sheet:用于存储下拉框的所有可选值(如 “供应商列表”“状态选项”);
  2. 设置数据有效性:在目标 Sheet 的指定单元格区域,引用隐藏 Sheet 中的选项作为下拉来源;
  3. 隐藏辅助 Sheet:避免用户误编辑下拉选项,仅保留目标 Sheet 可见。

环境准备

依赖配置

需引入 POI 核心库和 OOXML 库(支持 .xlsx 格式):

<dependencies>  
    <!-- 处理 .xls 格式(Excel 2003 及以下) -->  
    <dependency>  
        <groupId>org.apache.poi</groupId>  
        <artifactId>poi</artifactId>  
        <version>4.1.2</version>  
    </dependency>  
    <!-- 处理 .xlsx 格式(Excel 2007 及以上) -->  
    <dependency>  
        <groupId>org.apache.poi</groupId>  
        <artifactId>poi-ooxml</artifactId>  
        <version>4.1.2</version>  
    </dependency>  
</dependencies>

完整实现代码

以下示例以 .xlsx 格式为例,在 “用户信息表” 的 “部门” 列添加下拉框,选项存储在隐藏的 “部门列表” Sheet 中。

核心代码

阅读全文 »

Eureka 客户端核心机制:服务获取与服务续约的实现解析

Eureka 客户端(Eureka Client)通过两个核心定时任务与 Eureka Server 交互:服务获取(拉取服务注册表)和服务续约(发送心跳维持存活状态)。这两个任务在DiscoveryClient类中初始化,是保证服务发现准确性和服务状态有效性的关键。

定时任务初始化:initScheduledTasks 方法

initScheduledTasks是 Eureka 客户端初始化时的核心方法,用于启动服务获取和服务续约的定时任务。其核心逻辑是:根据配置判断是否需要拉取注册表和注册服务,若需要则创建对应的定时任务。

private void initScheduledTasks() {
    // 1. 服务获取定时任务(拉取服务注册表)
    if (clientConfig.shouldFetchRegistry()) {
        // 拉取间隔(默认30秒,可通过eureka.client.registry-fetch-interval-seconds配置)
        int registryFetchIntervalSeconds = clientConfig.getRegistryFetchIntervalSeconds();
        // 指数退避边界(任务失败时重试间隔的最大倍数)
        int expBackOffBound = clientConfig.getCacheRefreshExecutorExponentialBackOffBound();
        
        // 启动定时任务:每registryFetchIntervalSeconds秒执行一次CacheRefreshThread
        scheduler.schedule(
            new TimedSupervisorTask(
                "cacheRefresh",  // 任务名称
                scheduler,
                cacheRefreshExecutor,  // 执行线程池
                registryFetchIntervalSeconds,
                TimeUnit.SECONDS,
                expBackOffBound,
                new CacheRefreshThread()  // 服务获取线程
            ),
            registryFetchIntervalSeconds, TimeUnit.SECONDS);
    }

    // 2. 服务续约定时任务(发送心跳)
    if (clientConfig.shouldRegisterWithEureka()) {
        // 续约间隔(默认30秒,由eureka.instance.lease-renewal-interval-in-seconds配置)
        int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();
        int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();
        
        // 启动定时任务:每renewalIntervalInSecs秒执行一次HeartbeatThread
        scheduler.schedule(
            new TimedSupervisorTask(
                "heartbeat",  // 任务名称
                scheduler,
                heartbeatExecutor,  // 执行线程池
                renewalIntervalInSecs,
                TimeUnit.SECONDS,
                expBackOffBound,
                new HeartbeatThread()  // 服务续约线程
            ),
            renewalIntervalInSecs, TimeUnit.SECONDS);
        
        // 省略实例信息同步相关逻辑...
    }
}

核心设计

阅读全文 »

乌东问题

乌克兰和俄罗斯的问题时间比较久,主要是乌东问题(乌东部顿涅茨克和卢甘斯克武装)

乌东部地区是属于亲俄的地区

从2014年到2015年,顿巴斯的亲俄武装与乌克兰政府军展开了激烈战斗,直到第二份《明斯克协议》签订后,顿巴斯的大规模战斗才停止,但小规模冲突持续至今

《明斯克协议》是以协议签署地白俄罗斯首都明斯克命名,协议共有两个版本,第一个版本签订于2014年9月,协议签订后不久,乌东部武装就与乌政府再度全面开火;第二个版本签订于2015年2月,也称为《明斯克协议II》

乌东地区属于是俄罗斯和北约的一个缓冲地带,俄罗斯绝对不允许该地区落入北约的手中。拜登上台后,一是由于美国内大放水,为了使得国际资金可以回流到美国(这里主要是针对欧洲),二是为了使得欧洲小弟们继续听话(俄罗斯的北溪二号会影响到美国对于欧洲的资源输出),老美开始主导乌克兰和俄罗斯之间的冲突,也就导致了2021年后的冲突逐渐升级

新加坡

新加坡发展特别快,一是政策好(我国的改革开放的部分政策就是借鉴的新加坡),二是位置好(坐拥马六甲海峡南端出口)

1965年新加坡独立,自然资源凋敝,少数工业生产也只足够供应国内消费,甚至基本没有外来的直接投资,又由于种族问题被马来西亚联邦除名。

20世纪七十年代,为了弥补资金的空缺与原料的紧张,考虑世界经济趋势,新加坡选择大力吸引外来投资。“国父”、首任总理李光耀决定在政治上用强硬的“威权主义”,在经济上采取“国家资本主义模式”,来实现工业化发展。首先便建立了强大的统治政权,打压异党,来维护社会与经济生活的基本安定,实现对小规模市场的扶持、规范与宏观调控。调动国民劳动积极性,发展“国宅计划”,国家为人民盖房,使人民有国家归属感,有国家发展与共的责任意识。实行彻底的反腐反贪污体制,建立清廉的行政体系,提高行政效率,并营造稳定的政治、社会环境,吸引外来投资。

几内亚

中国在几内亚有一个西芒杜铁矿的开采权,而这个铁矿使得中国可以减少对澳大利亚铁矿的进口

0%