找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang

超级版主

30

主题

1579

帖子

2157

积分

超级版主

Rank: 8Rank: 8

积分
2157
Wilson.Zhang
超级版主   /  发表于:2024-9-27 18:43  /   查看:30  /  回复:0
在借力Decimal自定义公式函数时,SpreadJS的计算引擎和Decimal极力配合着实现复杂的计算功能,计算结果正确无误。通过SpreadJS的序列化文件格式ssjson和sjs传播文件时,需要针对自定义函数和Decimal分别处理序列化以融合SpreadJS的序列化功能。

理解了SpreadJS序列化的基本设计,遵循设计理念即可实现自定义函数的序列化。SpreadJS序列化/反序列化自定义函数的核心依据是typeName属性值,具体地,在序列化过程中,toJSON()方法需要建立类型名和window对象的映射关系,因此,需要为在自定义函数设置typeName属性。同样地,反序列化通过getTypeFromString()获取类型名,并根据类型名创建类型的实例对象,进一步通过类型对象的toJSON()方法实现所有类型对象的反序列化。可以参考官网教程了解详情:
https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/workbook/custom-item-serialization/purejs

image.png596211242.png

图1. 导入无typeName的自定义函数

自定义函数中使用的Decimal是对象,序列化时无法自动完成Decimal对象的序列化,SpreadJS将对自己无能为力的事情向用户老实交代,提供错误信息,如图2所示。可是,用户也无法介入SpreadJS的序列化机制单独控制Decimal对象的序列化。那么,转向源头解决根源问题,即在计算结束后将结果Decimal对象转为数值或字符串等天然可序列化的数据类型。

image.png430677489.png

图2. 自定义函数中Decimal序列化异常

综上所述,提供如下方案:
1. 自定义函数中设置typeName属性。
2. 重写getTypeFromString以引入自定义函数的序列化。
3. 自定义函数中将结果Decimal对象转换为序列化内容,即字符串或数值。

按照上述方案,结果如图3所示。附上demo,以供参考。

自定义公式 Decimal.gif551678161.png

图3. 自定义公式+Decimal序列化

自定义公式+Decimal(Designer版本).html

6.54 KB, 下载次数: 1

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部