本帖最后由 Richard.Ma 于 2023-5-8 15:48 编辑
背景:
前几天有小伙伴咨询SpreadJS支持EVALUATE函数吗?查询资料得知,EVALUATE函数属于Excel宏表函数,
而SpreadJS目前不支持宏的,所以原生上未支持EVALUATE函数。
但查询中发现,EVALUATE函数的作用是,将公式字符串计算为结果,
那么用SpreadJS的自定义函数能否实现此功能呢?让我们一起来试试吧
思路:
定义一个自定义函数,将公式字符串作为参数传入,
在evaluate 内部,使用evaluateFormula方法进行计算,获取计算结果,将计算结果返回。
核心代码:
- /*------自定义函数------*/
- //1. 从 GC.Spread.CalcEngine.Functions.Function 派生并重写一些关键方法
- function FactorialFunction() {
- this.name = 'EVALUATE';//函数名
- this.maxArgs = 1;//最大参数个数
- this.minArgs = 1;//最小参数个数
- };
- FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
- FactorialFunction.prototype.acceptsReference = function() {
- return true;//函数的参数接受引用单元格区域
- }
- FactorialFunction.prototype.isContextSensitive = function() {
- return true;//为true 时,函数的计算依赖于上下文
- }
- FactorialFunction.prototype.evaluate = function (arg) {
- //使用EvaluateFormula()方法来计算公式,而无需在表单的单元格中设置公式
- var result = 1;
- if (arguments.length === 2 ) {
- var formulaString = arguments[1];
- var result = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, formulaString, 0, 0);
- return result;
- }
- return "#VALUE!";
- }
- var factorial = new FactorialFunction();
- sheet.setValue(0,0,1);
- sheet.setValue(1,0,2);
- document.getElementById('addCustomFunction').addEventListener('click', function() {
- sheet.addCustomFunction(factorial);//将自定义函数添加到 表单里。如果不设置,会报错 #NAME
- sheet.setFormula(3,0,'=EVALUATE("SUM(A1:A2)")');
- })
复制代码
看下效果吧。
完整代码可查看下方附件。
自定义函数_EVALUATE函数.html
(3.97 KB, 下载次数: 232)
|