找回密码
 立即注册

QQ登录

只需一步,快速开始

Fiooona
论坛元老   /  发表于:2020-5-24 16:09  /   查看:5134  /  回复:2
本帖最后由 Fiooona 于 2020-9-21 15:15 编辑

当你做好一个表格,发给其他人去填写,最麻烦的是每个人填写的内容格式各种各样,这时难道只能一个个的再去修改?在Excel 中有数据验证的功能,同样,SpreadJS这一款表格控件,高度还原Excel功能,在V11版本后也可以设置数据验证。想要限制用户的输入内容、格式,阻止或者提示用户输入错误的信息,可以给单元格上设置验证器。
SpreadJS提供了内置的六款验证器,本文一一实现了这六款验证器的基本用法,及一些相关自定义的实现。
image.png332577819.png
基于列表的验证器:这种验证器是提供了一个单选下拉的一个列表,限制用户仅可以从已知的列表中去选择,除列表外的数据被填充进单元格会被认为是非法数据。学习指南中实现的例子就是使用了列表验证器,可以参考。
基于日期的验证器:这种验证器用与验证单元格的日期是否在限定的范围中,示例中实现的效果是只能选择日期12/31/2012 到12/31/2013 直接的日期,核心代码:
  1.   var dv5 = GC.Spread.Sheets.DataValidation.createDateValidator(GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.between, new Date(2012, 11, 31), new Date(2013, 11, 31));
  2.            
复制代码
基于文本长度的验证器:顾名思义,这种验证器实现的是验证文本长度,例如要实现限制输入长度4-20:
  1. var dv4 = GC.Spread.Sheets.DataValidation.createTextLengthValidator(GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.greaterThan, "4", "20");
  2.            
复制代码
基于数字的验证器:这个验证器用于验证数字的大小、范围、是否在某一范围内。例如实现输入数字为5-20之间:
  1. var dv = GC.Spread.Sheets.DataValidation.createNumberValidator(GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.between, "5", "20", true);
复制代码
基于公式的验证器:次类验证器中可以验证单元格的值是否符合某一公式,例如实现输入的内容大于C2单元格的内容:
  1.   var dv7 = GC.Spread.Sheets.DataValidation.createFormulaValidator("D19>C2");
复制代码
基于公式列表的验证器:列表的内容可以是公式选择一片区域的内容,这个验证器是一种列表验证器,列表的内容可以是公式引用的内容,示例中D18单元格输入的内容只能是$C$1C$3单元格中的内容:
  1.     var dv6 = GC.Spread.Sheets.DataValidation.createFormulaListValidator("$C$1/:$C$3");
复制代码
以上是六种SpreadJS自带的验证器,每一个单元格中仅可设置一种验证器,如果想要在一个单元格中限定多个条件的验证该如何实现呢?例如想要实现数字格式,并且限定有小数的话仅能输入四位小数。
可以用自定义公式数据验证来实现:创建一个正则匹配的自定义函数,可以匹配数字并且如果有小数仅能有四位以内的小数:
  1. var dv8 = GC.Spread.Sheets.DataValidation.createFormulaValidator('REGEX("^([1-9]\\d{0,15}|0)(\\.\\d{1,4})?[        DISCUZ_CODE_5        ]quot;)');
  2.   function RegExFunction() {
  3.             this.name = "REGEX";
  4.             this.maxArgs = 2;
  5.             this.minArgs = 2;
  6.             this.typeName = "RegExFunction";
  7.         }
  8.         RegExFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  9.         RegExFunction.prototype.isContextSensitive = function () {
  10.             return true;
  11.         }
  12.         RegExFunction.prototype.evaluate = function () {
  13.             debugger
  14.             var context = arguments[0], value = context.source.getValue(context.row, context.column);
  15.             var reg = new RegExp(arguments[1]);
  16.             if (value) {
  17.                 return reg.test(value.toString());
  18.             }
  19.             return false;
  20.         }
复制代码
常见问题:
相关文章:自定义数据验证:

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!

2 个回复

倒序浏览
祥弟
注册会员   /  发表于:2022-9-30 14:30:52
沙发
文本长度的那个不行啊怎么?
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-30 18:06:33
板凳
这边测试文本长度代码是有效的,请问您指的无效具体是什么呢?
您可以在求助中心板块发个帖子,并附上可复现demo,这边来实际测试下。


image.png686123351.png

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部