数据验证是控制 Excel 单元格输入内容的有效手段,它能在数据录入阶段拦截错误输入,确保数据的规范性和准确性。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成数据验证的设置、读取和删除操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
设置数据验证
在日常表单和报表中,我们常常需要限制单元格的输入内容,例如只允许输入一定范围内的数字或日期、限定文本长度等。Spire.XLS for JavaScript 通过单元格的 DataValidation 属性设置验证规则,支持小数(Decimal)、整数(WholeNumber)、日期(Date)、时间(Time)、文本长度(TextLength)、列表(List)等多种验证类型。
function App() {
const sheetToSVG = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
// 创建新工作簿
const workbook = new xlsModule.Workbook();
// 获取第一个工作表
const sheet = workbook.Worksheets.get(0);
// 设置小数验证:B12 单元格只能输入 3 到 6 之间的数字
sheet.Range.get("B11").Text = "Input Number(3-6):";
let rangeNumber = sheet.Range.get("B12");
rangeNumber.DataValidation.CompareOperator = xlsModule.ValidationComparisonOperator.Between;
rangeNumber.DataValidation.Formula1 = "3";
rangeNumber.DataValidation.Formula2 = "6";
rangeNumber.DataValidation.AllowType = xlsModule.CellDataType.Decimal;
rangeNumber.DataValidation.ErrorMessage = "Please input correct number!";
rangeNumber.DataValidation.ShowError = true;
rangeNumber.Style.KnownColor = xlsModule.ExcelColors.Gray25Percent;
// 设置日期验证:B15 单元格只能输入 2024 年内的日期
sheet.Range.get("B14").Text = "Input Date: 1/1/2024";
let rangeDate = sheet.Range.get("B15");
rangeDate.DataValidation.AllowType = xlsModule.CellDataType.Date;
rangeDate.DataValidation.CompareOperator = xlsModule.ValidationComparisonOperator.Between;
rangeDate.DataValidation.Formula1 = "1/1/2024";
rangeDate.DataValidation.Formula2 = "12/31/2024";
rangeDate.DataValidation.ErrorMessage = "Please input correct date!";
rangeDate.DataValidation.ShowError = true;
//支持设置AlertStyleType.Warning;AlertStyleType.Info;AlertStyleType.Stop
rangeDate.DataValidation.AlertStyle = xlsModule.AlertStyleType.Warning;
rangeDate.Style.KnownColor = xlsModule.ExcelColors.Gray25Percent;
// 设置文本长度验证:B18 单元格的文本长度不能超过 5 个字符
sheet.Range.get("B17").Text = "Input Text:";
let rangeTextLength = sheet.Range.get("B18");
rangeTextLength.DataValidation.AllowType = xlsModule.CellDataType.TextLength;
rangeTextLength.DataValidation.CompareOperator = xlsModule.ValidationComparisonOperator.LessOrEqual;
rangeTextLength.DataValidation.Formula1 = "5";
rangeTextLength.DataValidation.ErrorMessage = "Enter a Valid String!";
rangeTextLength.DataValidation.ShowError = true;
rangeTextLength.DataValidation.AlertStyle = xlsModule.AlertStyleType.Stop;
rangeTextLength.Style.KnownColor = xlsModule.ExcelColors.Gray25Percent;
// 自动调整第 2 列的列宽
sheet.AutoFitColumn(2);
const outputFileName = "DataValidation_out.xlsx";
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Add Data Validation</h1>
<button onClick={sheetToSVG}>
Start
</button>
</div>
);
}
export default App;
设置数据验证

获取数据验证设置
在处理已有数据验证的 Excel 文档时,有时需要读取验证规则以了解单元格的输入约束。通过单元格的 DataValidation 属性可以获取验证对象,再读取 AllowType(验证类型)、CompareOperator(比较运算符)、Formula1(最小值/下限)、Formula2(最大值/上限)、IgnoreBlank(是否忽略空值)等设置。
function App() {
const sheetToSVG = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体和 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'GetSettingsOfDataValidation.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}/static/data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 获取第一个工作表
const worksheet = workbook.Worksheets.get(0);
// 单元格 B4 设置了小数验证
const cell = worksheet.Range.get("B4");
// 获取该单元格的数据验证对象
const validation = cell.DataValidation;
// 获取验证设置
let allowType = validation.AllowType.toString();
let data = validation.CompareOperator.toString();
let minimum = validation.Formula1.toString();
let maximum = validation.Formula2.toString();
let ignoreBlank = validation.IgnoreBlank.toString();
// 拼接结果为字符串
let result = `Settings of Validation: \r\nAllow Type: ${allowType}\r\nData: ${data}\r\nMinimum: ${minimum}\r\nMaximum: ${maximum}\r\nIgnoreBlank: ${ignoreBlank}`;
const outputFileName = 'GetSettingsOfDataValidation-out.txt';
// 将结果写入 txt 文件
window.dotnetRuntime.Module.FS.writeFile(outputFileName, result);
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Get Data Validation Settings</h1>
<button onClick={sheetToSVG}>
Start
</button>
</div>
);
}
export default App;

删除数据验证
当验证规则不再需要时,可以通过工作表 DVTable 的 Remove 方法按单元格区域批量删除数据验证。删除时需要传入一个由矩形(Rectangle)组成的数组,用于定位工作表中要删除验证的区域。
function App() {
const sheetToSVG = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体和 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'RemoveDataValidation.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}/static/data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 创建矩形数组,用于定位工作表中要删除验证的区域
let rectangles = [];
// 向数组添加矩形,该矩形指定从 A1 到 B3 的单元格区域
rectangles.push(xlsModule.Rectangle.FromLTRB(0, 0, 1, 2));
// 删除矩形所表示区域内的数据验证
workbook.Worksheets.get(0).DVTable.Remove(rectangles);
const outputFileName = 'RemoveDataValidation-out.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Remove Data Validation</h1>
<button onClick={sheetToSVG}>
Start
</button>
</div>
);
}
export default App;
删除数据验证

常见问题
设置的数据验证未生效
原因:目标单元格已存在其他验证规则,或设置的验证类型、比较运算符与需求不符。
解决:确认验证规则应用于正确的单元格区域,并检查 AllowType、CompareOperator、Formula1、Formula2 等属性的取值是否符合预期。
获取数据验证设置时结果为空
原因:目标单元格未设置数据验证,或读取的单元格范围与验证所在位置不一致。
解决:确认单元格已设置数据验证,并检查 Range.get 方法引用的单元格地址是否正确。
删除数据验证后仍存在验证规则
原因:DVTable.Remove 方法传入的矩形范围未覆盖实际的验证区域。
解决:根据验证覆盖的单元格区域调整 Rectangle.FromLTRB 方法中的坐标,确保矩形范围包含全部需要删除验证的单元格。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







