找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证

超级版主

200

主题

9899

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
15531

讲师达人悬赏达人微信认证勋章SpreadJS 认证SpreadJS 高级认证元老葡萄

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-30 14:47  /   查看:1885  /  回复:0
最近在处理论坛上的问题时,有用户提出这样的需求:
用户希望通过权限的划分,让有权限的用户进入表格之后可以正常的编辑公式,修改公式等操作。
没有权限的用户进入表格后,所有的公式只显示值。同样也不提供编辑公式的功能,修改公式的单元格相当于修改单元格Value的操作。
接下来重点来了,没有权限的用户进入表格后公式本身还是要正常运作的,当公式引用的单元格被修改后,公式本身的计算结果也要发生变化。
看到这个需求,当时第一个反应是前面两条都很好实现,真正有难度的是第三条,既要保证用户没有修改的公式能够继续运作,还要保证没有权限的用户看不到公式,也不能设置公式的操作。如果在SpreadJS中实现上述操作,是可以通过自定义单元格来实现的,我们可以设置一个具有上述属性的特殊类型单元格。
首先,创建该单元格的方法
  1. function EditFormulaCellType(display) {
  2.   this.display = display;
  3.   this.formula;
  4.                         };
复制代码
这里设置了两个属性。display代表是否显示公式的标志位。formula是用来记录存放公式的
之后我们让该单元格的prototype去继承text类型
  1. EditFormulaCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
复制代码
然后,我们需要重写其中的setEditorValue方法
  1. EditFormulaCellType.prototype.setEditorValue = function (editorContext, value ,context) {
  2.   if(this.display){
  3.     GC.Spread.Sheets.CellTypes.Text.prototype.setEditorValue.apply(this,[editorContext, value ,context]);
  4.     this._formula = null;
  5.   }else{
  6.     editorContext.innerHTML = context.sheet.getValue(context.row,context.col);
  7.   }
  8.                         };
复制代码

思路就是通过display进行判断,如果不显示公式,通过上下文获取该单元格的value之后直接将其写入editor中。
这样,我们的自定义单元格类型就完成了。接下来,在判断用户权限的时候我们还需要做一件事情。当用户不具备修改公式的权限时,设置
  1. spread.options.allowUserEditFormula = false;
复制代码
这样用户输入等号正常设置公式的操作将不会生效,会当做字符串来处理,反之则设置true正常处理。

具体实现效果我们可以参考附件的demo



demo.zip

1.51 MB, 下载次数: 15

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部