Java 设置 Excel 数据验证:整数、日期、文本长度、下拉列表和时间

Excel 中的数据验证可以限制单元格允许输入的内容,例如只允许输入指定范围内的数字、限定日期区间,或者通过下拉列表让用户从预设值中选择。

对于需要多人填写的表格、数据收集模板或业务报表,这类限制可以减少拼写错误、格式不统一和无效数据。虽然 Excel 可以手动设置验证规则,但如果需要批量生成表格,或者在多个工作簿中应用相同规则,通过 Java 自动处理会更加方便。

本文介绍如何使用 Java 为 Excel 设置常见的数据验证,包括整数、日期、文本长度、下拉列表和时间验证。

Excel 中常见的数据验证类型

不同字段适合使用不同的验证方式:

验证类型 适用场景
整数 数量、人数、编号等只允许整数的字段
小数 金额、比例、测量值等允许小数的字段
列表 状态、部门、类别等固定选项
日期 截止日期、提交日期、计划日期
时间 上班时间、预约时间、时间段
文本长度 编码、简称、固定长度字段

除了指定允许的数据类型,还可以设置比较条件。例如,可以要求数字介于两个值之间、日期不得晚于某一天,或者文本长度不能超过指定字符数。

下面通过一个工作簿分别设置几种常见的数据验证规则。

环境设置

要运行下面的代码示例,需要先在 Java 项目中添加 Excel 处理所需的依赖。

如果使用 Maven,可以在 ​​pom.xml​​ 中加入:

xml 复制代码
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls</artifactId>
        <version>16.8.4</version>
    </dependency>
</dependencies>

然后在代码中导入所需的类:

arduino 复制代码
import com.spire.xls.*;

第一步:创建工作簿并获取工作表

首先创建一个新的工作簿,并获取其中的第一个工作表:

ini 复制代码
Workbook workbook = new Workbook();

Worksheet sheet = workbook.getWorksheets().get(0);

接下来添加几行说明文字,用于区分不同的数据验证区域:

arduino 复制代码
sheet.getCellRange("B2").setText("整数验证:");
sheet.getCellRange("B4").setText("日期验证:");
sheet.getCellRange("B6").setText("文本长度验证:");
sheet.getCellRange("B8").setText("列表验证:");
sheet.getCellRange("B10").setText("时间验证:");

后面的验证规则分别应用到对应的 C 列单元格中。

第二步:设置数据验证

获取工作表后,就可以根据不同字段的输入要求设置相应的数据验证规则。下面分别演示整数、日期、文本长度、列表和时间这几种常见验证类型。

设置整数验证

假设 C2 用于填写数量,并且只允许输入 1 到 100 之间的整数:

scss 复制代码
CellRange rangeNumber = sheet.getCellRange("C2");

// 设置允许的数据类型为整数
rangeNumber.getDataValidation()
        .setAllowType(CellDataType.Integer);

// 设置比较条件为"介于"
rangeNumber.getDataValidation()
        .setCompareOperator(
                ValidationComparisonOperator.Between
        );

// 设置最小值和最大值
rangeNumber.getDataValidation().setFormula1("1");
rangeNumber.getDataValidation().setFormula2("100");

// 设置输入提示
rangeNumber.getDataValidation()
        .setInputMessage("请输入 1 到 100 之间的整数");

// 高亮显示需要填写的单元格
rangeNumber.getCellStyle()
        .setKnownColor(ExcelColors.Gray25Percent);

这里主要由三个条件共同控制输入内容:

vbnet 复制代码
CellDataType.Integer
ValidationComparisonOperator.Between
"1" 和 "100"

因此,如果用户输入小数、负数或者超过 100 的数字,就不符合当前的验证条件。

整数验证比较适合库存数量、人数、件数等字段。

设置日期验证

如果 C4 用于填写日期,并且只允许输入 2026 年内的日期,可以设置日期验证:

scss 复制代码
CellRange rangeDate = sheet.getCellRange("C4");

// 设置允许的数据类型为日期
rangeDate.getDataValidation()
        .setAllowType(CellDataType.Date);

// 设置日期必须位于指定范围内
rangeDate.getDataValidation()
        .setCompareOperator(
                ValidationComparisonOperator.Between
        );

// 设置开始日期和结束日期
rangeDate.getDataValidation()
        .setFormula1("1/1/2026");

rangeDate.getDataValidation()
        .setFormula2("12/31/2026");

// 设置输入提示
rangeDate.getDataValidation()
        .setInputMessage(
                "请输入 2026 年 1 月 1 日至 12 月 31 日之间的日期"
        );

rangeDate.getCellStyle()
        .setKnownColor(ExcelColors.Gray25Percent);

日期验证不一定要限制在一个完整区间。

例如,如果只要求提交日期不得早于某一天,可以将比较条件改为"大于或等于",并只设置一个日期条件。

设置文本长度验证

对于编码、简称、分类标识等字段,有时不仅要限制数据类型,还需要限制输入字符数。

例如,让 C6 最多只能输入 10 个字符:

scss 复制代码
CellRange rangeTextLength =
        sheet.getCellRange("C6");

// 设置验证类型为文本长度
rangeTextLength.getDataValidation()
        .setAllowType(CellDataType.TextLength);

// 设置比较条件为"小于或等于"
rangeTextLength.getDataValidation()
        .setCompareOperator(
                ValidationComparisonOperator.LessOrEqual
        );

// 最大允许 10 个字符
rangeTextLength.getDataValidation()
        .setFormula1("10");

// 设置输入提示
rangeTextLength.getDataValidation()
        .setInputMessage(
                "请输入不超过 10 个字符的内容"
        );

rangeTextLength.getCellStyle()
        .setKnownColor(ExcelColors.Gray25Percent);

这里的 ​​Formula1​​ 表示允许的最大文本长度。

如果业务字段要求固定长度,也可以更换比较条件,例如要求内容长度必须等于指定值。

设置列表验证

对于部门、状态、类别等字段,让用户从固定选项中选择通常比手动输入更合适。

下面为 C8 创建一个部门下拉列表:

arduino 复制代码
CellRange rangeList =
        sheet.getCellRange("C8");

// 设置下拉列表中的选项
rangeList.getDataValidation().setValues(
        new String[]{
                "研发部",
                "测试部",
                "市场部",
                "财务部"
        }
);

// 显示下拉箭头
rangeList.getDataValidation()
        .isSuppressDropDownArrow(false);

// 设置输入提示
rangeList.getDataValidation()
        .setInputMessage("请从列表中选择部门");

rangeList.getCellStyle()
        .setKnownColor(ExcelColors.Gray25Percent);

生成文件后,用户点击 C8 时,就可以直接从下拉列表中选择部门。

这种方式适用于选项比较少且基本固定的字段。

如果选项数量较多,或者需要经常维护,也可以把选项放在工作表中的某个区域,再让数据验证引用该区域作为数据源,而不是直接将所有值写在代码中。

设置时间验证

时间验证适合排班、预约、签到等场景。

例如,只允许在 C10 中输入 9:00 到 18:00 之间的时间:

scss 复制代码
CellRange rangeTime =
        sheet.getCellRange("C10");

// 设置允许的数据类型为时间
rangeTime.getDataValidation()
        .setAllowType(CellDataType.Time);

// 设置时间范围
rangeTime.getDataValidation()
        .setCompareOperator(
                ValidationComparisonOperator.Between
        );

rangeTime.getDataValidation()
        .setFormula1("9:00");

rangeTime.getDataValidation()
        .setFormula2("18:00");

// 设置输入提示
rangeTime.getDataValidation()
        .setInputMessage(
                "请输入 9:00 到 18:00 之间的时间"
        );

rangeTime.getCellStyle()
        .setKnownColor(ExcelColors.Gray25Percent);

这里和数字、日期验证的逻辑基本相同:

先指定允许的数据类型,再通过比较条件和上下限确定最终允许输入的范围。

第三步:调整工作表布局

为了让标签和输入区域显示得更加完整,可以简单调整列宽:

scss 复制代码
// 根据内容自动调整 B 列宽度
sheet.autoFitColumn(2);

// 设置 C 列宽度
sheet.setColumnWidth(3, 20);

这里的格式调整不会影响验证规则,只是为了让最终生成的表格更容易填写。

第四步:保存 Excel 文件

所有验证规则设置完成后,将工作簿保存为 Excel 文件:

ini 复制代码
workbook.saveToFile(
        "DataValidation.xlsx",
        ExcelVersion.Version2016
);

workbook.dispose();

打开生成的文件后,可以分别测试对应单元格:

  • C2 只接受 1 到 100 之间的整数
  • C4 只接受 2026 年内的日期
  • C6 最多输入 10 个字符
  • C8 可以从部门列表中选择
  • C10 只接受 9:00 到 18:00 之间的时间

如何选择合适的数据验证方式

实际使用时,可以根据字段本身的特点选择验证规则。

如果字段只有有限的几个合法值,例如部门、状态、类别,优先使用下拉列表,可以减少拼写不同或表达不统一的问题。

对于数量、金额、日期和时间等字段,则更适合指定数据类型以及允许的上下限。

文本长度验证通常用于有明确长度要求的字段,例如内部编码、简称或固定格式的标识。

对于需要批量生成的 Excel 模板,可以直接把这些规则写入生成逻辑中。这样即使模板被重复创建,输入限制也能保持一致。

小结

Excel 数据验证的核心并不复杂:先确定单元格允许输入的数据类型,再根据实际需求设置比较方式和允许范围。

通过 Java,可以为不同单元格或区域统一设置整数、日期、文本长度、列表和时间等验证规则。在生成数据填报模板、业务表单或需要多人维护的工作簿时,提前加入这些限制可以减少后续的数据清理工作,也能让填写要求更加明确。

相关推荐
白远山1 小时前
智慧场馆解决方案软件开发实战:从架构设计到落地部署指南
java·开发语言·架构·需求分析
SL_staff1 小时前
面向业务人员的IoT概念翻译实践:JVS-IOT低代码配置原理与开发者视角解析
java·spring boot·物联网
m0_587383002 小时前
折扣卡CPS软件开发实战:从系统架构设计到上线指南
java·小程序·架构·需求分析
Zane19942 小时前
用了Optional,为什么NPE还是防不住?
java·后端
大模型码小白2 小时前
告别造假数据,直接连数据库查真实时序数据喂给 TimechoAI 大模型
java·数据库·人工智能·microsoft·架构
企业数字化笔记2 小时前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel
golang学习记2 小时前
IDEA 2026.3 EAP新特性:自动识别Spring Boot的新 profile 了
java·spring boot·intellij-idea
SamDeepThinking2 小时前
Java 17内存屏障:为什么需要,怎么用
java·后端·面试
青山木2 小时前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划