找回密码
 立即注册

QQ登录

只需一步,快速开始

三三
金牌服务用户   /  发表于:2022-9-7 10:10  /   查看:1086  /  回复:3
本帖最后由 三三 于 2022-9-7 18:39 编辑

业务场景是这样的,校验所有单元格内容,如果内容含特殊字符,将该单元格边框样式设置为红色,用户删除特殊字符后,边框恢复之前样式,怎么恢复之前样式?有可能单元格每一列单元格初始背景色和单元格边框样式不一致,如何回复到之前样式

3 个回复

倒序浏览
沉沉悬赏达人认证
金牌服务用户   /  发表于:2022-9-7 14:46:39
沙发
本帖最后由 沉沉 于 2022-9-7 14:50 编辑

首先校验所有单元格,如果包含特殊字符,变为红色边框,如果修改后没有特殊字符,则恢复默认样式。这里可以用正则表达式进行数据验证可以先参考这篇文章
https://gcdn.grapecity.com.cn/showtopic-54393-1-1.html

在此基础上,修改正则表达式为:
  1.    sheet.setArray(10,0,[['ab!c'],['*'],['123@'],['~!@#'],[678],['!'],['我']])
  2.       spread.options.highlightInvalidData = true;
  3.       var nCondition = new MyCondition("[`~!@#$%^&*()_+<>?:"{},.\\/;\'[\\]]");
  4.       var dv9 = new GC.Spread.Sheets.DataValidation.DefaultDataValidator(nCondition);
  5.       dv9.type(GC.Spread.Sheets.DataValidation.CriteriaType.custom);
  6.       dv9.highlightStyle({
  7.         type: GC.Spread.Sheets.DataValidation.HighlightType.icon,
  8.         color: "red",
  9.         position:
  10.         GC.Spread.Sheets.DataValidation.HighlightPosition.between,
  11.       });
  12.       for (let i = 10; i <= 16; i++) {
  13.         sheet.setDataValidator(i, 0, dv9);
  14.       }
  15. function MyCondition (reg){
  16.   this.reg = reg;
  17.   GC.Spread.Sheets.ConditionalFormatting.Condition.apply(this, arguments);
  18. }
  19. MyCondition.prototype = new GC.Spread.Sheets.ConditionalFormatting.Condition();
  20. MyCondition.prototype.evaluate = function (evaluator, baseRow, baseColumn, actualObj) {
  21.   var reg = new RegExp(this.reg);
  22.   if (!reg.test(actualObj)) {
  23.     // console.log('包含特殊字符',actualObj)
  24.     return true;
  25.   }else{
  26.     // console.log('不包含特殊字符',actualObj)
  27.     return false;
  28.   }
  29. };
复制代码


最后实现效果为:
image.png755309753.png image.png920239257.png


对于您说的这句话“有可能单元格每一列单元格初始背景色和单元格边框样式不一致,如何回复到之前样式”
不太明白您的需求。


回复 使用道具 举报
三三
金牌服务用户   /  发表于:2022-9-7 15:04:21
板凳
沉沉 发表于 2022-9-7 14:46
首先校验所有单元格,如果包含特殊字符,变为红色边框,如果修改后没有特殊字符,则恢复默认样式。这里可以 ...

自定义的数据验证会和Excel自带的数据验证冲突吗?例如Excel中某一列设置长度不能超过4,然后再按照如上处理,长度校验会不会丢失?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-9-7 17:56:58
地板
本帖最后由 Ellia.Duan 于 2022-9-7 18:02 编辑

经调研,不能为同一个单元格设置两种及以上的数据验证方式。如果您这边为数据设置了长度限制,那么是否包含特殊字符,只能通过遍历单元格,然后获取单元格内容,对其手动验证。
您在问题中提到了如何重置样式?
当用户在单元格中删除特殊字符后,触发事件,此时可以重置样式。
  1. //清除某个区域的样式
  2. sheet.clear(0,0,1,2,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.style);
  3. //获取某个单元格后清除样式
  4. sheet.getCell(4,0).clear(GC.Spread.Sheets.StorageType.style);

  5. sheet.setStyle(4,0,null)
  6. sheet.getRange(0,0,1,2).setStyle(new GC.Spread.Sheets.Style())
复制代码
可以通过clear方法清除样式,也可以直接设置null。



或者在之前的自定义数据验证中,你同时验证正则表达式和字符串长度,删除之前设置的字符串长度验证,代码如下所示:
  1. MyCondition.prototype.evaluate = function (evaluator, baseRow, baseColumn, actualObj) {
  2.   var reg = new RegExp(this.reg);
  3.   if(actualObj.length<=4){
  4.     if (!reg.test(actualObj) ) {
  5.       // console.log('包含特殊字符',actualObj)
  6.       return true;
  7.     }else{
  8.       // console.log('不包含特殊字符',actualObj)
  9.       return false;
  10.     }
  11.   }else{
  12.     return false;
  13.   }

  14. };
复制代码
其展示效果如下:
image.png645759582.png
但是此用法有一个缺陷是:
两种验证共用一种样式。这个需要您权衡下使用哪种方式。

评分

参与人数 1满意度 +5 收起 理由
三三 + 5

查看全部评分

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