找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-9-16 14:08  /   查看:2250  /  回复:4
本帖最后由 Richard.Ma 于 2023-5-8 15:48 编辑

背景:
前几天有小伙伴咨询SpreadJS支持EVALUATE函数吗?查询资料得知,EVALUATE函数属于Excel宏表函数,
而SpreadJS目前不支持宏的,所以原生上未支持EVALUATE函数。
但查询中发现,EVALUATE函数的作用是,将公式字符串计算为结果,
那么用SpreadJS的自定义函数能否实现此功能呢?让我们一起来试试吧

思路:
定义一个自定义函数,将公式字符串作为参数传入,
在evaluate 内部,使用evaluateFormula方法进行计算,获取计算结果,将计算结果返回。

核心代码:
  1.         /*------自定义函数------*/

  2.         //1. 从 GC.Spread.CalcEngine.Functions.Function 派生并重写一些关键方法
  3.         function FactorialFunction() {
  4.             this.name = 'EVALUATE';//函数名
  5.             this.maxArgs = 1;//最大参数个数
  6.             this.minArgs = 1;//最小参数个数
  7.         };
  8.         FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  9.         FactorialFunction.prototype.acceptsReference = function() {
  10.             return true;//函数的参数接受引用单元格区域
  11.         }
  12.         FactorialFunction.prototype.isContextSensitive = function() {
  13.             return true;//为true 时,函数的计算依赖于上下文
  14.         }
  15.         FactorialFunction.prototype.evaluate = function (arg) {
  16.             //使用EvaluateFormula()方法来计算公式,而无需在表单的单元格中设置公式
  17.             var result = 1;
  18.             if (arguments.length === 2 ) {
  19.                 var formulaString = arguments[1];
  20.                 var result = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, formulaString, 0, 0);
  21.                 return result;
  22.             }
  23.             return "#VALUE!";
  24.         }
  25.         var factorial = new FactorialFunction();
  26.         sheet.setValue(0,0,1);
  27.         sheet.setValue(1,0,2);

  28.         document.getElementById('addCustomFunction').addEventListener('click', function() {
  29.             sheet.addCustomFunction(factorial);//将自定义函数添加到 表单里。如果不设置,会报错 #NAME
  30.             sheet.setFormula(3,0,'=EVALUATE("SUM(A1:A2)")');
  31.         })
复制代码



看下效果吧。
image.png554820251.png

完整代码可查看下方附件。
自定义函数_EVALUATE函数.html (3.97 KB, 下载次数: 24)

评分

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

查看全部评分

4 个回复

倒序浏览
crawler
高级会员   /  发表于:2021-10-13 17:48:32
沙发
这是我想要的
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-10-13 17:57:06
板凳
回复 使用道具 举报
athenadeveloper
注册会员   /  发表于:2022-10-13 16:53:45
地板
请问,以上这个方案是否适用于异步函数。即将异步函数传入,执行得到结果。谢谢
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-13 17:11:57
5#
athenadeveloper 发表于 2022-10-13 16:53
请问,以上这个方案是否适用于异步函数。即将异步函数传入,执行得到结果。谢谢

上述方案的核心是evaluateFormula方法,对于异步函数则是evaluateFormula计算的时机。
学习指南异步函数demo为例,测试可以获取到异步函数返回计算结果。
image.png302214354.png

image.png89760741.png

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