找回密码
 立即注册

QQ登录

只需一步,快速开始

ypge

注册会员

13

主题

64

帖子

195

积分

注册会员

积分
195
ypge
注册会员   /  发表于:2024-9-20 10:46  /   查看:699  /  回复: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




最佳答案

查看完整内容

您好!SpreadJS自定义公式中支持使用Decimal,如果想要导出包含Decimal值的数据,需要将其转换为可以正确序列化的格式,比如字符串或数字。】 此外,SpreadJS也支持序列化自定义公式,鉴于SpreadJS序列化的方式,需要对自定义公式显式设置typeName,序列化时将通过typeName与window对象关联;同时需要重写getTypeFromString函数,该函数用于在发序列化时获取typeName并据此构造实例对象。 我们根据您提供的代码整理了demo并 ...

18 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2024-9-20 10:46:58
来自 3#
您好!SpreadJS自定义公式中支持使用Decimal,如果想要导出包含Decimal值的数据,需要将其转换为可以正确序列化的格式,比如字符串或数字。】

此外,SpreadJS也支持序列化自定义公式,鉴于SpreadJS序列化的方式,需要对自定义公式显式设置typeName,序列化时将通过typeName与window对象关联;同时需要重写getTypeFromString函数,该函数用于在发序列化时获取typeName并据此构造实例对象。

我们根据您提供的代码整理了demo并附上,供您参考。
关于自定义特性序列化,可以参考官网教程了解详情:
https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/workbook/custom-item-serialization/purejs

自定义函数引用Decimal.html

6.58 KB, 下载次数: 19

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-20 11:51:34
2#
您好!我们调研下先,之后会及时向您同步结论。请您耐心等候。
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-20 16:46:50
4#
本帖最后由 ypge 于 2024-9-20 17:16 编辑
Wilson.Zhang 发表于 2024-9-20 12:22
您好!SpreadJS自定义公式中支持使用Decimal,如果想要导出包含Decimal值的数据,需要将其转换为可以正确序 ...

保存模板后,下次加载模板(fromJson)后sheet添加公式,有公式的单元格没刷新要怎么处理?这种自定义方法能不能加在workbook上?
image.png229432677.png
image.png285960082.png
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-20 17:46:11
5#
ypge 发表于 2024-9-20 16:46
保存模板后,下次加载模板(fromJson)后sheet添加公式,有公式的单元格没刷新要怎么处理?这种自定义方 ...

如下动图所示,通过Worksheet:fromJSON()导入文件后,设置公式可以正常计算结果。

自定义公式导入后生效.gif

如果我们的操作有所偏差,需要您详细介绍下情况。
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-20 17:59:57
6#
Wilson.Zhang 发表于 2024-9-20 17:46
如下动图所示,通过Worksheet:fromJSON()导入文件后,设置公式可以正常计算结果。

看起来跟我操作的没差别。。。
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-20 18:07:22
7#
Wilson.Zhang 发表于 2024-9-20 17:46
如下动图所示,通过Worksheet:fromJSON()导入文件后,设置公式可以正常计算结果。

只不过我的是workbook的toJson,fromJson;不知道跟这个有关没有
回复 使用道具 举报
ypge
注册会员   /  发表于:2024-9-20 18:11:04
8#
Wilson.Zhang 发表于 2024-9-20 17:46
如下动图所示,通过Worksheet:fromJSON()导入文件后,设置公式可以正常计算结果。

你试下这个:

image.png52478636.png
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-23 08:39:00
9#

您好!跟您使用相同的接口Workbook:toJSON()复现了问题,需要调研一下。同时,测试发现,通过Workbook:save()将其保存为.sjs文件再导入一切正常。您可以以.sjs文件为序列化数据,您自行斟酌决定。我们调研后会及时向您同步结论。
回复 使用道具 举报
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下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部