找回密码
 立即注册

QQ登录

只需一步,快速开始

ypge

注册会员

13

主题

64

帖子

195

积分

注册会员

积分
195
ypge
注册会员   /  发表于:2024-9-20 10:46  /   查看:700  /  回复:18
2金币
本帖最后由 Wilson.Zhang 于 2024-9-26 11:11 编辑

产品:SpreadJS
版本:17.1.5
调研编号:SJS-26550
Last Review:2024-09-26
当前进展:非问题,需要将自定义函数定义挂载在window全局。

image.png605395812.png
如图,使用自定义函数,自定义函数引用decimal(这只是简单精度计算的例子,实际使用会更复杂)

import { Decimal } from "decimal.js";


/**
* 数组求和
* @param arr {Array}
*/
function Compute_SUM(arr) {
  let sum = new Decimal(0);
  arr.forEach((v) => {
    sum = sum.add(v);
  });
  if (isValidNumber(sum.toString())) {
    return sum;
  } else {
    return null;
  }
}/**


* 判断args是否为有效的数值(非NaN非无穷)
* @param  {...any} args
* @returns
*/
function isValidNumber(...args) {
  return args.every(
    (v) =>
      isFinite(v) &&
      ((typeof v === "string" && v.trim().length) ||
        typeof v === "number" ||
        v instanceof Decimal)
  );
}


function FactorialFunction() {
                    this.name = "Compute_SUM";
                    this.maxArgs = 1000;
                    this.minArgs = 1;
                }
                FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
                FactorialFunction.prototype.evaluate = function (...arg) {
                    var result = 1;
                     var res= Compute_SUM(arg)
                      if(!res){
                          return "#VALUE!";
                      }
                      return res;
                };
                this.factorial = new FactorialFunction();
                this.spread.getActiveSheet().addCustomFunction(this.factorial)




}

image.png756759948.png




18 个回复

正序浏览
Wilson.Zhang
超级版主   /  发表于:2024-9-26 11:10:31
19#

好的。
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-26 09:34:57
18#
好的,我试试
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-25 18:05:06
17#
ypge 发表于 2024-9-25 16:18
怎么挂载在window上?

如楼上所示。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-9-25 17:53:23
16#
window.Compute_SUM= Compute_SUM
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-25 16:18:38
15#
Wilson.Zhang 发表于 2024-9-25 12:28
您好!序列化自定义公式确实需要typeName,但仅有typeName还不够,typeName的作用是在发序列化时据此创建对 ...

怎么挂载在window上?
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-25 12:28:58
14#
您好!序列化自定义公式确实需要typeName,但仅有typeName还不够,typeName的作用是在发序列化时据此创建对应类型的对象。然而,也需要将自定义公式的定义挂载在window全局,这样才能在导出后带上自定义公式的所有定义信息,在不同环境中打开SpreadJS或Designer,导入后的文件中方能有可用的自定义公式。

对于在9楼提到的“保存为.sjs文件再导入一切正常”是一个误会,因为在导入.sjs文件时未开启“导入后自动计算”,该选项默认关闭,导入.sjs文件后不执行计算便无法觉察找不到自定义公式的定义信息,才没有出现#Name。如若导入.sjs文件后执行计算,便会出现#Name。

因此,在原有代码的基础上,将自定义公式的定义挂载在window上令其全局可用即可。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-23 12:21:24
13#
ypge 发表于 2024-9-23 11:33
现在我是workbook导入没计算,显示#NAME?

了解了,已经在调研了,调研编号为SJS-26550。我们会及时向您同步进展,请您耐心等候!
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-23 11:33:17
12#
本帖最后由 ypge 于 2024-9-23 11:44 编辑
Wilson.Zhang 发表于 2024-9-23 11:01
您的意思是现在可以正常导入导出了吗?或者在您的环境中这个问题的现状是怎样的呢?

现在我是workbook导入没计算,显示#NAME?这个自定义函数能不能加在workbook上呢,每加一个sheet要去加下函数不太友好
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-23 11:01:13
11#
ypge 发表于 2024-9-23 09:07
好的。
保存那个报错是因为我引入的js文件(自定义函数在这个js里面),js里面引入decimal.js;我直接在v ...

您的意思是现在可以正常导入导出了吗?或者在您的环境中这个问题的现状是怎样的呢?
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-23 09:07:48
10#
Wilson.Zhang 发表于 2024-9-23 08:39
您好!跟您使用相同的接口Workbook:toJSON()复现了问题,需要调研一下。同时,测试发现,通过Workbook:sa ...

好的。
保存那个报错是因为我引入的js文件(自定义函数在这个js里面),js里面引入decimal.js;我直接在vue里面引用decimal是可以保存
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部