本帖最后由 Richard.Huang 于 2024-3-11 18:14 编辑
背景:
我们的SpreadJS是支持自定义的数据验证的,很多用户对自定义数据验证中的正则表达式场景有着普遍的需求,但是SpreadJS的逻辑是无法知晓用户自定义的内容是什么,因此无法对实现了正则表达式的数据验证进行持久化,一旦用户导出了文件,再重新导入后,那么原本设置了正则表达式数据验证的单元格上的数据验证就丢失了,而如果每次导入文件都要重新为单元格添加数据验证,这显然不符合我们的场景需求。
实现方式:
而这其中不包括自定义的数据验证,因为自定义数据验证并不支持typeName字段。因此我们只能抛弃添加typeName字段的方式来实现正则表达式数据验证的序列化和反序列化。但是我们知道数据验证是支持公式的。而自定义公式是支持自定义特性序列化的,因此,我们可以借助自定义公式来实现自定义数据验证的序列化和反序列化:
1. 自定义函数
- var mynamespace = {};
- (function () {
- // Define custom function (with namespace)
- function MyFunction() {
- this.name = "MyFunction";
- this.maxArgs = 1;
- this.minArgs = 1;
- this.typeName = "mynamespace.MyFunction";// 用于序列化和反序列化
- }
- MyFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
- MyFunction.prototype.evaluate = function (arg, type) {
- if (arguments.length === 2) {
- // 移除字符串开始和结束的正则定界符以及字符串起止的引号字符
- let regexString = type.slice(1, -1);
- // 字符串转正则表达式
- let regex = new RegExp(regexString);
- return regex.test(arg)
- }
- return "#VALUE!";
- };
- mynamespace.MyFunction = MyFunction;
- })();
复制代码 2. 设置公式数据验证
- var currentCell = sheet.getCell(i, j);
- // TODO 这一块可以再进行封装,封装成一个方法,方便调用
- var rangeStr = GC.Spread.Sheets.CalcEngine.rangeToFormula(currentCell);// 获取当前单元格的字符串坐标
- var nCondition = new GC.Spread.Sheets.ConditionalFormatting.Condition(GC.Spread.Sheets.ConditionalFormatting.ConditionType.formulaCondition);
- nCondition.customValueType(GC.Spread.Sheets.ConditionalFormatting.CustomValueType.formula)
- nCondition.formula("MyFunction(" + rangeStr + ", "/^\\d+$/")");
- var validator = new GC.Spread.Sheets.DataValidation.DefaultDataValidator(nCondition);
- validator.type(GC.Spread.Sheets.DataValidation.CriteriaType.custom);
- currentCell.validator(validator);// 为当前单元格设置数据验证
复制代码 完整代码
|