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

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

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

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

Excel 中常见的数据验证类型

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

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

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

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

环境设置

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

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

java 复制代码
<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>

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

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

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

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

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

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

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

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

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

第二步:设置数据验证

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

设置整数验证

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

java 复制代码
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);

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

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

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

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

设置日期验证

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

java 复制代码
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 个字符:

java 复制代码
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 创建一个部门下拉列表:

java 复制代码
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 之间的时间:

java 复制代码
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);

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

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

第三步:调整工作表布局

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

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

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

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

第四步:保存 Excel 文件

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

java 复制代码
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 小时前
@SpringBootTest
java
刘天远1 小时前
Agent最小权限实现:策略表、临时令牌与撤权回归
java·jvm·人工智能·sqlite
QQ_21696290961 小时前
基于SpringBoot+Vue的小生活平台的设计与实现
java·数据库·vue.js·spring boot·spring·微信小程序·生活
前端兰博2 小时前
06-并发
java
程序员-珍2 小时前
Android studio 突然打不开
android·java
Metaphor6922 小时前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
重生之小比特2 小时前
【Java SE】字符串 - String类
java·开发语言·intellij-idea
mldong8 小时前
给若依加审批流,不用 Flowable
java·spring boot·架构
Wang's Blog10 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring