请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Derrick.Jiao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-9-26 14:24  /   查看:3045  /  回复:6
前情提要:很多小伙伴在自定义单元格的时候将其导出为ssjson,然后导入到外部的Spread或者别的表单中。这时候会发现,导入的自定义单元格怎么没了?不是通过已经导入到ssjson里面了吗?如下图,自定义的下标无法在新的页面显示。
image.png283422240.png


其实,自定义单元格存储为ssjson然后导出到外部页面也是需要在外部的页面定义自定义单元格,因为自定义单元格生效是由于你执行了自定义的代码,但是导出的ssjson文件没有这个代码逻辑。要想使其生效,必须在外部的Spread或者导入的表单中也需要去定义该类型的自定义单元格。

因此我们想在新的页面或者外部页面显示该自定义单元格时,就需要在外部页面也定义该单元格类型。除了需要重新自定义单元格外,那么新的页面在什么时候该去识别这个自定义单元格呢?这时候需要通过原页面的typeName字段匹配。这个typeName相当于一个记号,告诉新的页面这是一个自定义单元格。在新的页面上,匹配上了,ssjson标记的自定义单元格也会显示。如下代码正是为原始页面中的自定义单元格添加上这么一个标记。
  1.    function HTMLCellType(items, size, isHorizontal) {
  2.            spreadNS.CellTypes.Text.apply(this, arguments);
  3.            this.typeName = "HTMLCellType"; //typeName属性标记
  4.            this.allowOverflow = false;
  5.            this._size = size;
  6.     }
复制代码

在原始的页面添加上标记后,如果自定义类型定义在一个闭包中, 换句话说, 你不希望将自定义类型定义在 window 对象上, 你需要在新的页面上重写 getTypeFromString 函数来手动解析类型的字符串。
  1.         var oldFun = GC.Spread.Sheets.getTypeFromString;
  2.     // Private types can not be accessed from window, so override getTypeFromString method.
  3.                         GC.Spread.Sheets.getTypeFromString = function(typeString) {
  4.                                 switch (typeString) {
  5.                                         case "HTMLCellType":
  6.                                                 return HTMLCellType;
  7.                                         default:
  8.                                                 return oldFun.apply(this, arguments);
  9.                                 }
  10.                         };
复制代码


最后在新的页面再加上自定义单元格的代码便大功告成,导入新的页面便会展示自定义的下标(如下图)。

image.png896311035.png

另外还可以参考自定义特性序列化的简介,这里也会做一个介绍
https://demo.grapecity.com.cn/sp ... erialization/purejs

下载附件可查看完整的demo

customCell.zip

2.03 MB, 下载次数: 67

6 个回复

倒序浏览
闲人
注册会员   /  发表于:2021-4-8 17:53:28
沙发
这里是指把自定义函数代码粘贴到对应单元格的公式输入里吗?
image.png750385131.png
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-4-8 17:55:54
板凳
闲人 发表于 2021-4-8 17:53
这里是指把自定义函数代码粘贴到对应单元格的公式输入里吗?

是指把自定义函数的定义在另一个Spread对象也写一遍,导入后才能正常显示
回复 使用道具 举报
闲人
注册会员   /  发表于:2021-4-8 18:01:56
地板
DerrickJiao 发表于 2021-4-8 17:55
是指把自定义函数的定义在另一个Spread对象也写一遍,导入后才能正常显示

给个简单的demo
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-4-8 18:10:16
7#

上面附件就是一个普通的demo,在upsign1.html点击导出ssjson,如果直接导入到普通的表单里是不会显示对应的自定义单元格的,只有导入附件的另一个demo网页才能生效。 image.png766609191.png
回复 使用道具 举报
闲人
注册会员   /  发表于:2021-4-9 10:24:22
8#
image.png333846740.png
这种严格来说只能算在设计表格时和开发人员约定的一个标记,根据标记找到对应位置处理,并不算是公式。如果我插入一个if条件语句如下图,我难道还去匹配单元格值字符串值是否包含IF(C4>18,成年,未成年),再把这个判断逻辑重写一遍?
image.png479410094.png
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-4-9 10:33:37
9#
闲人 发表于 2021-4-9 10:24
这种严格来说只能算在设计表格时和开发人员约定的一个标记,根据标记找到对应位置处理,并不算是公式。如 ...

这种普通的公式不用啊,您要想将自定义的单元格或者公式在另一个Spread对象显示就必须将对应的定义代码在新的Spread对象写一遍。因为toJSON的时候只会带上标记,而不是公式的定义。

标记带过去,新的Spread对象有这个定义才能显示,没有这个定义就无法显示。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部