最近在处理论坛上的问题时,有用户提出这样的需求:
用户希望通过权限的划分,让有权限的用户进入表格之后可以正常的编辑公式,修改公式等操作。
没有权限的用户进入表格后,所有的公式只显示值。同样也不提供编辑公式的功能,修改公式的单元格相当于修改单元格Value的操作。
接下来重点来了,没有权限的用户进入表格后公式本身还是要正常运作的,当公式引用的单元格被修改后,公式本身的计算结果也要发生变化。
看到这个需求,当时第一个反应是前面两条都很好实现,真正有难度的是第三条,既要保证用户没有修改的公式能够继续运作,还要保证没有权限的用户看不到公式,也不能设置公式的操作。如果在SpreadJS中实现上述操作,是可以通过自定义单元格来实现的,我们可以设置一个具有上述属性的特殊类型单元格。
首先,创建该单元格的方法
- function EditFormulaCellType(display) {
- this.display = display;
- this.formula;
- };
复制代码 这里设置了两个属性。display代表是否显示公式的标志位。formula是用来记录存放公式的
之后我们让该单元格的prototype去继承text类型
- EditFormulaCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
复制代码 然后,我们需要重写其中的setEditorValue方法
- EditFormulaCellType.prototype.setEditorValue = function (editorContext, value ,context) {
- if(this.display){
- GC.Spread.Sheets.CellTypes.Text.prototype.setEditorValue.apply(this,[editorContext, value ,context]);
- this._formula = null;
- }else{
- editorContext.innerHTML = context.sheet.getValue(context.row,context.col);
- }
- };
复制代码
思路就是通过display进行判断,如果不显示公式,通过上下文获取该单元格的value之后直接将其写入editor中。
这样,我们的自定义单元格类型就完成了。接下来,在判断用户权限的时候我们还需要做一件事情。当用户不具备修改公式的权限时,设置
- spread.options.allowUserEditFormula = false;
复制代码 这样用户输入等号正常设置公式的操作将不会生效,会当做字符串来处理,反之则设置true正常处理。
具体实现效果我们可以参考附件的demo
|
|