找回密码
 立即注册

QQ登录

只需一步,快速开始

Universail
金牌服务用户   /  发表于:2024-6-17 14:09  /   查看:1984  /  回复:22


对于自定义公式,在产品研发过程中,代码会反复修改,或者产品上线后,代码修复,都会造成历史保存的数据中包括的公式定义,和最新的公式定义不一致。

如下是载入已保存数据的代码,主要逻辑是,如果数据库已经保存了数据,就从数据库加载数据(workBook.fromJSON),否则,就添加自定义公式定义

public async setState() {
  const workBook = this.designer!.getWorkbook() as GC.Spread.Sheets.Workbook;
  if (this.agileReport.master.spread_state) {
    this.setTypeFromString();
    workBook.suspendPaint();
    workBook.suspendCalcService();
    await workBook.fromJSON(JSON.parse(this.agileReport.master.spread_state));
    this.addCustomFunction(workBook);
    workBook.resumeCalcService();
    workBook.resumePaint();
  } else {
    this.addCustomFunction(workBook);
  }
}
这里存在一个问题:如果对用一个公式(例如MyFormula),如果改动过,已经保存的数据再次加载进来后,其中的公式就不能正常运算了。
我想知道的是,这种需要不断迭代自定义公式的场景下,应该怎么开发自定义公式?




22 个回复

倒序浏览
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-17 18:12:53
沙发
您好,没太明白您说的,“已经保存的数据再次加载进来后,其中的公式就不能正常运算了”,是说之前已经存在了一个自定义公式,将这个JSON存储在服务器,然后修改了自定义公式的逻辑,再将JSON读取进来后,自定义公式没有正常计算吗?
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2024-6-17 18:17:20
板凳
Joestar.Xu 发表于 2024-6-17 18:12
您好,没太明白您说的,“已经保存的数据再次加载进来后,其中的公式就不能正常运算了”,是说之前已经存在 ...

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-18 10:48:01
地板
本帖最后由 Joestar.Xu 于 2024-6-18 10:50 编辑

您好,我这边测试了一下,没有复现出您说的无法计算的问题:

image.png998821716.png

image.png888153686.png

image.png649324645.png

image.png801444091.png

image.png416628722.png

测试Demo请见附件。

v17.zip

2.8 KB, 下载次数: 227

回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2024-6-18 11:03:19
5#
Joestar.Xu 发表于 2024-6-18 10:48
您好,我这边测试了一下,没有复现出您说的无法计算的问题:

我把toJSON()得到的结果,传给后端保存到数据库,下次使用的时候,后端读取数据库中的内容,发送给前端,前端使用JSON.parse处理后,把处理结果给fromJSON。整体上看起来跟你测试的原理是一样的,但是我这边确实出现了重新加载后,公式就不计算的情况。

我看你里面使用了defineGlobalCustomFunctioin,我没有使用这个
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2024-6-18 11:45:13
6#
本帖最后由 Universail 于 2024-6-18 11:47 编辑

另外,我们是vue3框架开发的代码,是需要打包后部署的,跟本地测试还是不完全一样的。
我们导出为excel格式,这时候修改了自定义公式相关代码,重新打包部署服务器,这时候,再将excel导入回去,公式就失效了。

PS: 删除公式前的等号,再重新补上等号,公式又恢复正常了
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-18 17:46:07
7#
您好,我这边看不到您那边的代码,不清楚您具体是如何实现的,您可以先尝试将defineGlobalCustomFunctioin代码加上,然后看看问题是否还存在。

若仍存在,需要您提供一份可以复现此问题的Demo,我们结合实际的代码帮您调研看看是什么原因导致的。
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2024-6-18 18:14:47
8#
本帖最后由 Universail 于 2024-6-19 08:11 编辑
Joestar.Xu 发表于 2024-6-18 17:46
您好,我这边看不到您那边的代码,不清楚您具体是如何实现的,您可以先尝试将defineGlobalCustomFunctioin ...

涉及打包环境,数据库存储,这个很难搞复现代码的
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2024-6-19 08:39:41
9#
Universail 发表于 2024-6-18 18:14
涉及打包环境,数据库存储,这个很难搞复现代码的

公式是不能做依赖注入吧?
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2024-6-19 14:57:48
10#
同步公式,去掉了依赖注入,保存为sjs存入数据库后,重新从数据库读取载入,现在倒是没问题了;
异步公式,保存为sjs存入数据库后,重新从数据库读取载入,发现运行了计算,但是结果返回后,使用context.setAsyncResult(值)后,单元格并没有显示值,还是显示的默认值
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部