SpreadJS的一些常见问题原创
金蝶云社区-cosmicstudio
cosmicstudio
3人赞赏了该文章 3,005次浏览 未经作者许可,禁止转载编辑于2022年01月02日 09:44:13

SpreadJS的一些常见问题


一 . 错误公式导致spread崩溃

异常公式因未知原因保存到了ssjson里 , 导致spread崩溃 ; 例如 :

=ACCT(\"\",\"\",\"[1402,1407]|0011|@\",\"Y\",0,0,\"\")*()

正常这个公式是写不到单元格里的 , 写完就会被清空 ,不知什么原因被保存到了

ssjson里 , 这个只发现了一次 , 无法重现


二 . 外部复制的数据粘贴后无法撤销

实际情况是

1.内部复制的数据首次粘贴无法撤销

2.外部复制的数据粘贴多少遍都无法撤销

3.但是在复制外部数据之前 如果在spread内部复制并粘贴了数据 那么再次复制粘

贴外部数据 就可以撤销

原因是:

1.在保护状态与非保护状态切换的期间内 粘贴的数据是无法撤销的

2.锁定单元格要先把表单设置成保护状态

3.[2]的原因是粘贴外部数据之前会先把表单设置成非保护状态 粘贴完数据后会立

即把表单设置成保护状态[2]

4.粘贴内部数据会把表单设置成保护状态

5.[3]的原因是 粘贴完内部数据后 再去复制粘贴外部数据走的是粘贴内部数据的逻

辑 所以它可以撤销

修改代码可以做到:

1. 如果当前表单不是保护状态 那么复制粘贴外部数据可以撤销

做不到: 当前页面有锁定的单元格复制外部的数据还是不能撤销

导致这个问题的根本原因是:

Excel与WPS 在表单处于保护状态的时候是无法粘贴数据的,我们的可以,Spread如

果粘贴区域有锁定的单元格,是无法粘贴的,

我们的会跳过锁定的单元格粘贴未锁定的,是这两个差异导致了数据粘贴异常 ,

三 . spread点击锁定单元格报错 / 如何使用平台的spread控件


后端模型没有实现对应的功能 , 平台的spread”没有“后端 , 使用spread控件需要

从零开始完全二开

四. 计算不准确/数值显示不全


与Excel保持一致,超过16位的数值(加上小数 例如: 1234567890.123456) ,计算和

显示都不准确 ,会自动省略或错误的显示一些尾数

数值类型的单元格 ,超过16位的数值不能正常显示(加小数的16位,不是支持16位小

数或16位整数,是小数位数加上整数位数加起来不能超过16位)

对于超过16位数值的展示,要将数值转成文本类型,才能显示全,不然spread会自动省

略超出16位的那部分位尾数

五. 外部数据粘贴到spread里有空格


这个不是spread的问题,是一些软件的特定单元格格式看起来是空的,但复制出来并

粘贴到外部就会多出一些空格的数据,注意是粘贴到外部,内部粘贴是不会的;

六.单元格格式不兼容Excel


这个是spread的一个bug , 单元格格式导出后变成了其他的了, 如数值类型的单元

格可能会变成会计格式类型的

七.复制spread的数据粘贴到WPS里数据错乱


spread不兼容WPS , 表现为合并的单元格被分开了,第一行的数据出现在了第二行,

单元格的背景色消失了;

八.打印会多出空白页


1. 这里指的是不必要的空白页 , 例如第一行有个数据 , 第1000行有个数据 , 中全是空

白单元格 , 那打印出来的空白页就是必要的 , 如果只有第一行有数据其他位置没有

数据 , 那打印多出的空白页就是没有必要的 , 这里的数据指的是 , 样式+内容 , 有些

单元格看起来是空白的 , 实际是有样式的 ;

2. 只有横线打印才会多出不必要的空白页(纵向打印多出的空白页一定是必要的) , 横

向打印多出空白页是spread的bug , 需要用户手动去浏览器的打印设置里将“打印

边距”改为除默认选项以外的其他选项 ; 或者使用打印设置里的”去除打印空白

页“ , 该功能会影响布局,具体表现为右侧有一小块空白区域 , 无法被内容填充 , 对

内容质量要求较高的话不要使用该功能 ; 除了这两种方法以外没有其他解决办法

九. 打印大数据表 , 浏览器内存溢出了


十几万单元格的数据spread还是可以打印出来的 , 再大点的数据就不行了 , 把几十

个表的数据放到一个表里的,再去打印,这样

是不行的,就不能用前端的打印了,要用后端的打印,具体实现或者是如何使用后端的

打印功能, 可以问下合并报表部门

十. 360浏览器点击打印 , 浏览器崩溃了


部分360的浏览器是不能打印的 , 不管打印什么都会崩溃 , 这里指的不只是苍穹的

打印 , 是所有的打印 , 可以ctrl+p打印网页试一下

十一.富文本样式与单元格样式不统一


富文本样式和单元格样式属于两个不同的style , 没有富文本时就和平时的使用一样

, 有富文本时 , 富文本会覆盖非编辑态的单元格样式,

进入编辑态时 , 使用的则是工具栏中设置的样式

十二. spread导出后字体大小变了


字体大小是没变的 , 至少看起来是一样的大小 , spread描述字体用的是px(像素) ,

Excel用的是字号 , 目前反馈用户(1)家

中文字号英文字号(磅) 毫米像素

1英寸72pt 25.30mm 95.6px

大特号63pt 22.14mm 83.7px

特号54pt 18.97mm 71.7px

初号42pt 14.82mm 56px

小初36pt 12.70mm 48px

一号26pt 9.17mm 34.7px

小一24pt 8.47mm 32px

二号22pt 7.76mm 29.3px

小二18pt 6.35mm 24px

三号16pt 5.64mm 21.3px

小三15pt 5.29mm 20px

四号14pt 4.94mm 18.7px

小四12pt 4.23mm 16px

五号10.5pt 3.70mm 14px

小五9pt 3.18mm 12px

六号7.5pt 2.56mm 10px

小六6.5pt 2.29mm 8.7px

七号5.5pt 1.94mm 7.3px

十三.右键显示/隐藏,不能用,变成灰色了


属于产品设计 , 与excel保持一致 ; 只要曾经锁定过单元格 , 显示隐藏就不能用 , 注

意只要是锁定过就不行 , 即使解锁了也不行 , 解除保护状态可以继续使用这个功能

, 仅开放了接口 , 需要业务主动掉用该接口 (接口: setWorksheetOptions) , 接

口文档 , 注意解除保护状态会使锁定失效 ;

还有一种解决办法是用自定义右键功能 , 请参考前后端接口文档

十五. 数据量比较大的表 , 如何减少前端的渲染时间


1. 更新公式的指令放到最后 、

2. 不要批量的更新公式或者批量更新公式的引用

3. 减少大范围公式的使用

4. 优化公式的逻辑 , 避免一些无用计算

5. 公式之间不要循环嵌套

6. 公式有几万的话 , 放到几个表里 , 16g内存 windows10系统的电脑 谷歌浏览器下,

处理两万个公式时间在5s左右(计算+渲染)

7. 插行操作放在前面 , 越到后面使用 , 插行开销越大 ; 参考链接 :

https://gcdn.grapecity.com.cn/forum.php?

mod=viewthread&tid=96387&page=1#pid407189

8. 单元格够用就好 , 不要留出太多空白的单元格 , 行数*列数 = 超多空白单元格 = 重

绘开销大 = 响应时间长 = 卡

9. 较少耗时指令的使用 , setSpreadJson updataValue insertRow insertCol

getFormula getRangeValues unlockCell lockCell

十六. 数据粘贴有问题 , 复制也有问题 目前反馈客户(3)家


spread官方回复我们说这是产品限制 , 右键复制的内容只能右键粘贴而且不能垮表

使用, ctrl+c复制的内容只能ctrl+v , 是的没错 , 是一对一的 , 不能混着用 ,或许后

续spread会解决这一问题

十七.如何描述出现的问题


1.截图/录制视频 , 将问题的操作步骤重现出来

2.按f12打开浏览器控制台 , 找到Elements选项 , 滚动鼠标找到时间戳(<!--

****baseline: **** -->) , 发给开发

十八.性能边界


1. Spread官方并没有给出性能的边界,我们建议渲染空单元格最大不要超过50万,无公

式的有值单元格不要超过20万个,有公式单元格不要超过1万个

2. 百万级别的数据spread渲染不出来

3. 比较耗时的指令有 setSpreadJson updataValue insertRow insertCol

getFormula getRangeValues unlockCell lockCell

4. 尽量的将相同的指令进行合并;

5. 插入行后会对之后的所有行进行重绘、公式重算,在存在大量样式或者公式的情况

下,会增加几百到几千倍的插行时间;

十九.改了表名后 , 公式有问题


这是后端改了spreadJson导致的 , 发现只要表的名字过长 , 公式就会有问题 , 原因

未知 (官方也没告诉我们原因) , 猜测是spreadJson转为真实的spread对象时 , 解

析出了问题 , 建议不要直接修改spreadjson , 要通过指令的形式去改 , spreadJS是

一款纯前端的表格控件 , 所有的操作都要通过指令的形式去修改 , 通过直接修改

spreadJson导致的问题难以定位 , 出了问题只能改为通过指令的形式去修改

spreadJson

二十.设置自动换行后 文字前面的空格丢失了


这是属于产品的设计 , 目前是根据英文版的换行策略,英文版的Excel与中文的

Excel在换行策略上有所不同。

二十一.公式粘贴不全


粘贴长公式需要将 ”允许粘贴外部样式“ 关闭 , 开放了指令 :

setWorkbookOptions

二十二.从外部拷贝粘贴的性能指标


浏览器版本:Chrome 版本 73.0.3683.75(正式版本) (64 位)

SpreadJS版本: 12.0

粘贴性能分析 : https://pan.yunzhijia.com/edit#/365074250488348673/

粘贴数据 : https://pan.yunzhijia.com/edit#/365074249221668865/

二十三.清除公式失败 , 前端不断向后端发送请求


清空公式要用setFormula , 用null清除不要用"" , updataValue 不能清空公式只能

清空值 , updataValue更新有公式的单元格 , 会触发cellchange事件 , 该事件被触

发时 , 会向后端发送当前单元格的公式数据(即使公式没被改变)

二十四.在Excel中设置单元格格式导致样式丢失


升级spread版本到14.1.3及以上

二十五.如何查看spread 版本


1. 谷歌浏览器 , 在地址栏后面加上&kdweb_debug=true 回车 随便找个报表进去

(有spread控件的地方就行)

2. f12打开控制台

3. ctrl+p打开文件搜索 , 输入gc.spread.sheets.react.min

4. 找到 “Spread.Sheets Wrapper Components for React 14.0.3”

5. 可以看到spread的版本为14.0.3

二十六.SpreadJS控件许可无效,请联系系统管理员申请新的许可文件


1. 未授权的spreadJs , 若访问的浏览器地址非localhost或127.0.0.1则无法使用

2. 需要先申请对应版本的spreadjs许可 , 不同版本的spread有着不同的许可

3. 如何查看spread版本请看二十五条

4. 将版本号发给总部老师 , 获取License

5. 新建文件spreadlicense.json,内容为{ "kingdee": 申请到的License"}

6.将spreadlicense.json放到静态资源文件webapp下的license里

二十七.如何导出spreadJson


报表根据spreadJson加载数据 , spreadJson存储着整个报表的所有数据

1. 在地址栏后面加上&kdweb_debug=true开启调试模式 , 然后回车。

2. 找到要导出spreadJson数据的表 , 按f12打开控制台

3. 在console栏中输入 let sa = window.getSpreadInfo();

JSON.stringify(sa.sd.toJSON())

4.点击copy , 或者选中复制 , 将复制到的数据粘贴到记事本里

二十八.如何模拟后端指令


1. 在地址栏后面加上&kdweb_debug=true开启调试模式 , 然后回车

2. 找到要操作的表 , 按f12打开控制台

3. 输入 let sa = window.getSpreadInfo()

4. sa.action.FUN(DATA,sa.t) 例如 : 更新值的指令 sa.action.updataValue({si:0,

cells: [{r:0, c:0, v:2}]},sa.t) 指令文档

二十九.为什么在Excel里复制粘贴可以,但是粘贴到spread里就丢了一些东西呢 / 为什么从spread里粘贴到excel会丢一些东西呢

1. 在excel和spread的内部有一个记录复制数据的属性,在使用粘贴时,他会从这个属性

里取出他所需要的值,其中包括值、各种样式、单元格的锁定情况、单元格的类型、

和其他单元格的关系、换行、等等 ,当跨客户端复制粘贴时这个内部属性就不起作

用了,就需要有个东西既能被excel访问,又能被spread访问 , 操作系统提供了系统剪

切板来存储这些数据 , 当ctrl+c时,系统会把数据写进剪切板里 , 但写入的数据有限,

系统剪切板只能存储值与样式(背景颜色、边框颜色、字体相关属性) 其他如单元格

锁定的情况、换行、单元格类型等不会写到剪切板里 , 那么粘贴时就肯定读取不到

这些数据

2. 在应用内部粘贴与跨应用粘贴是不同的 , 通过Windows键+ V 可以查看剪切板里

的数据 跨应用复制粘贴时 剪切板里有什么就只能粘贴什么 , 这也就是内部复制

1.12粘贴也是1.12 而粘贴到外部就变成1的原因 , 这也是复制一个会计格式类型的

数据 粘贴到外部去就变成一个“—”的原因 ,这也是复制excel表面上看起来什么

也没有的单元格粘贴到spread中多出了空格的原因(剪切板里是真的有空格)

三十.全选复制很卡(数据不多时)


数据很多时复制粘贴当然会卡, 但数据少的时候怎么还那么卡 ? spread复制数据的机

制与Excel一致 , 完全没有数据的单元格 , 复制或打印时这些单元格是会被忽略的 , 卡

是因为数据多 , 数据少全选也卡 , 这说明那些看起来空的单元格实际上不是空的 , 他

是有样式的 , 什么样式? 空的样式 , 空的样式也是样式 ; 获取这个单元格的样式时他是

这样的{borderBottom:null;borderLeft:null;borderRight:null;borderTop: null},完

全为空的单元格获取的值应该是null , 这就是导致全选很卡的原因 。

例如 : 新建一个表,插5000行 ,在第5000行设置一下边框颜色 ,然后再恢复 ,

全选复制,就会非常卡(这个时候客户就会问我们前端能不能优化,为啥复制空单元

格也卡,excel复制空单元格都不卡的),粘贴到excel就有5000行 ,如果不设置边

框颜色 , 那复制就仅会复制到有数据的几行单元格 ,粘贴到excel里,也只有几行,

单元格只要设置过样式,就被污染了, 除非调用清除全部样式的指令,否则这个单元

格就会被spread认为是有数据的单元格。

优化方案

删掉没有数据的单元格 , 40行有数据就只保留40行(报表目前是2000行,还有些业

务是5000行,去掉有数据的40行,剩下的1960行全是空单元格)

清空单元格时调用指令clearCellsStyle清除样式 并调用updataValue( [{r:1, c:1,

v:null:}])清空值

三十一.公式中的常见报错#value,#N/A,#REF都是什么意思?


SpreadJS兼容450种以上的Excel中的公式,公式出错的提示也与Excel一样,一些对

SpreadJS中常见的报错进行总结,同样适用于Excel。1.#Value当使用错误的参数或

运算对象类型时,或者当公式自动更正功能不能更正公式时,将产生错误值

#VALUE!。这其中主要包括3点原因。

1)在需要数字或逻辑值时输入了文本,Excel不能将文本转换为正确的数据类型。

解决方法:确认公式或函数所需的运算符或参数正确,并且公式引用的单元格中包含

有效的数值。例如:如果单元格A1包含一个数字,单元格A2包含文本,则公式

="A1+A2"将返回错误值#VALUE!。可以用SUM工作表函数将这两个值相加(SUM

函数忽略文本):=SUM(A1:A2)。

2)将单元格引用、公式或函数作为数组常量输入。

解决方法:确认数组常量不是单元格引用、公式或函数。

3)赋予需要单一数值的运算符或函数一个数值区域

解决方法:将数值区域改为单一数值。修改数值区域,使其包含公式所在的数据行或

列。

2.#Div/0

当公式被零除时,将会产生错误值#DIV/O!。

3.#N/A

当在函数或公式中没有可用数值时,将产生错误值#N/A。

4.#REF

删除了由其他公式引用的单元格,或将移动单元格粘贴到由其他公式引用的单元格

中。当单元格引用无效时将产生错误值#REF!

如果遇到在SpreadJS中某公式的计算结果与Excel中的计算结果不一致,可以先检查

公式引用的单元格是数值格式或者是字符串格式,因为在SpreadJS 中字符串格

式“1”也可以参与公式计算,而Excel中则不行,这是导致其计算不一致的大部分原

因。

三十二.日期输入值与获取到的值不一致


获取到的日期有三种格式:

1. 在单元格输入2020/01/01 通过getValue接口获取到的数据是 Wed Jan 01 2020

00:00:00 GMT+0800 (中国标准时间)

2. 将这个数据传给后端 变成了 2019-12-31T16:00:00.000Z (GMT 被转成了 UTC)

3. 通过toJSON()接口拿到的数据是 /OADate(43831)/

这里是SpreadJS本身的设计,后面也不会修复这个问题,spread控件识别这个三种日期

格式,前端不会对日期进行转换,如果要将日期拿到其他控件上使用,需要业务自行转换

三种日期都可以转换成北京时间 , 具体转换方法可以百度

格林尼治标准时间(GMT,旧译“格林威治平均时间”或“格林威治标准时间”)是

指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那

里的经线。

协调世界时(UTC) 英文:Coordinated Universal Time ,别称:世界统一时间,世

界标准时间

国际协调时间, 协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简

称UTC。它从英文“Coordinated Universal Time”/法文“Temps Universel

Cordonné”而来。

OADate 表示 UTC 时间1899 年 12 月 30 日午夜到那个时间之间的天数


赞 3