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