找回密码
 立即注册

QQ登录

只需一步,快速开始

果爸

注册会员

11

主题

35

帖子

120

积分

注册会员

积分
120
果爸
注册会员   /  发表于:2024-1-19 07:54  /   查看:3394  /  回复:12
20金币
本帖最后由 果爸 于 2024-1-19 07:56 编辑

定义了一个自定义函数,返回的是一个数组,批量给其他单元格赋值,目前存在的问题是批量赋值的其他单元格,也会被其他的单元格公式引用,但是其他的单元格公式却不计算,代码如下:

image.png24924925.png

最佳答案

查看完整内容

你好,我看了上面的图片里的代码,好像是在异步自定义方法里面使用setArray来覆盖掉公式。常规方法是使用setAsyncResult,如下面代码示例

12 个回复

倒序浏览
最佳答案
最佳答案
WilliamChang
葡萄城公司职员   /  发表于:2024-1-19 07:54:33
来自 7#
你好,我看了上面的图片里的代码,好像是在异步自定义方法里面使用setArray来覆盖掉公式。常规方法是使用setAsyncResult,如下面代码示例

  1.         spread.options.allowDynamicArray = true;
  2.         var sheet = spread.getSheet(0);

  3.         function FactorialArrayFunction() {
  4.             this.name = "FACTORIAL.ARRAY";
  5.             this.maxArgs = 1;
  6.             this.minArgs = 1;
  7.         }
  8.         FactorialArrayFunction.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction();
  9.         FactorialArrayFunction.prototype.defaultValue = function () { return -1; };
  10.         FactorialArrayFunction.prototype.evaluateAsync  = function (context, arg) {
  11.             var t = 1;
  12.             var result = [[]];
  13.                 for (var i = 1; i <= arg; i++) {
  14.                     t = i * t;
  15.                     result[0].push(t);
  16.                 }
  17.                 setTimeout(()=>{
  18.                     context.setAsyncResult(new GC.Spread.CalcEngine.CalcArray(result));
  19.                 }, 2000);
  20.         };
  21.         var factorialArray = new FactorialArrayFunction();

  22.         
  23.             sheet.setValue(6, 1, 'Formula');
  24.             sheet.setValue(6, 2, '=FACTORIAL.ARRAY(5)');
  25.             sheet.setValue(7, 1, 'Result');
  26.             sheet.addCustomFunction(factorialArray);
  27.             sheet.setFormula(7, 2, "=FACTORIAL.ARRAY(5)");
  28.             sheet.setFormula(8, 2, "=D8+F8");
复制代码


回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-1-19 09:26:12
2#
您好,根据您的描述来看,您是期望在手动计算模式下,对局部的公式进行重新计算是吗?
请问您目前使用的SpreadJS版本是多少呢,如果是V16.2.0及以上,那么您可以参考以下方法只计算A1单元格的公式:
spread.calculate(GC.Spread.Sheets.CalculationType.all, "Sheet1!A1")

API参考:https://demo.grapecity.com.cn/sp ... .Workbook#calculate

如果上述方法无法满足您的需求或者您的版本低于V16.2.0,建议您提供一份可供我们复现的demo,方便我们更好地为您推荐适合的解决方法
回复 使用道具 举报
果爸
注册会员   /  发表于:2024-1-19 09:45:50
3#
目前的版本14,目前的场景是,报表有好几个sheet页,有很多公式,有从后台请求的,也有表页之间加减计算的,当然也有个别公式从后台返回来是组数的,每次用户打开报表的时候,系统会自动计算所有的公式,但是因为这个所谓的数组公式的问题导致先于数组公式计算的单元格就有数据,后于数组公式计算的就不生效了
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-1-19 11:38:27
4#
果爸 发表于 2024-1-19 09:45
目前的版本14,目前的场景是,报表有好几个sheet页,有很多公式,有从后台请求的,也有表页之间加减计算的 ...

V14版本较老了,没有手动计算和自动计算模式的设置,对于您的需求,您可以尝试使用以下API重新计算您要的区域看能否解决您的问题:
sheet.recalcRange("Sheet1!A1")// 重新计算A1单元格的公式
回复 使用道具 举报
果爸
注册会员   /  发表于:2024-1-19 12:04:28
5#
主要是需要重新计算的公式单元太多,无法定位哪些公式单元需要重新计算,因为有些已经计算过了,有些没有计算,而且并不知道哪些没有计算,公式单元有上千个呢。
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-1-19 13:51:24
6#
果爸 发表于 2024-1-19 12:04
主要是需要重新计算的公式单元太多,无法定位哪些公式单元需要重新计算,因为有些已经计算过了,有些没有计 ...

了解了,能否提供一个可以供我们测试的demo呢,因为不太确定什么原因会导致您的问题,如果有一个可以供我们测试的demo,我们能够更好地去调研改问题所在
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-1-19 17:46:04
8#
WilliamChang 发表于 2024-1-19 17:29
你好,我看了上面的图片里的代码,好像是在异步自定义方法里面使用setArray来覆盖掉公式。常规方法是使用se ...

回复 使用道具 举报
果爸
注册会员   /  发表于:2024-1-19 23:34:25
9#
image.png279192504.png

自定义公式填充其他单元格的值 (1).rar

1.13 KB, 下载次数: 196

回复 使用道具 举报
果爸
注册会员   /  发表于:2024-1-20 11:23:25
10#
本帖最后由 果爸 于 2024-1-20 11:26 编辑
WilliamChang 发表于 2024-1-19 17:29
你好,我看了上面的图片里的代码,好像是在异步自定义方法里面使用setArray来覆盖掉公式。常规方法是使用se ...

这个方式我大概测了一下好像可以,

顺便咨询一下,当报表的公式很多的情况下,比如上千的公式(后台请求,只有极个别函数返回数组),异步函数和同步函数那个效率高呢,还是说基本一样
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部