找回密码
 立即注册

QQ登录

只需一步,快速开始

innerwang

中级会员

90

主题

364

帖子

920

积分

中级会员

积分
920
innerwang
中级会员   /  发表于:2024-5-23 19:34  /   查看:1769  /  回复:5
本帖最后由 innerwang 于 2024-5-23 19:36 编辑

场景如下:

用 SpreadJS 编辑一个模板,模板中包含一个表格,这个表格实际只会有2行,一行是表头,另一行是各个模板字段, 如图
image.png772409972.png

实际展示时,会将拿到的数据(二维数组)来扩充上述第二行的模板字段
image.png241789550.png

扩充数据的代码实现如下:

  1. const firstDataRowHeight = sheet.getRowHeight(row + 1)
  2.     const needSyncRowHeight = firstDataRowHeight !== sheet.defaults.rowHeight
  3. const setValues = (values, startRow) => {
  4.     sheet.suspendPaint()
  5.    sheet.suspendEvent()
  6.    values.forEach((v, rowIdx) => {
  7.          sheet.copyTo(row + 1, col, startRow + rowIdx, col, 1, colCount, window.GC.Spread.Sheets.CopyToOptions.all)
  8.          sheet.setArray(startRow + rowIdx, col, [ v ])
  9.          if (needSyncRowHeight) {
  10.                sheet.setRowHeight(startRow + rowIdx, firstDataRowHeight)
  11.          }
  12.       })
  13.     sheet.resumeEvent()
  14.     sheet.resumePaint()
  15.     }
复制代码


目前填充 500行,58列的性能在 500ms左右 ,对应配置为 Mac M1, 内存 16GB,遇到比较差的硬件配置电脑时,就会卡顿十分明显,能帮看看如何提高性能吗?

备注:尝试了 suspendCalcService()  suspendDirty() 没什么改善




5 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-5-24 09:34:21
沙发
本帖最后由 Ellia.Duan 于 2024-5-24 09:35 编辑

您好,根据您提供的代码,做了一个测试demo ,已上传,
测试了下,对500行数据,58列数据设置在table上,用时1S 。

image.png344934691.png

您可以在此demo基础上,再完善下您的代码,使其可以复现。

setArray性能提升.html

4.27 KB, 下载次数: 405

回复 使用道具 举报
innerwang
中级会员   /  发表于:2024-5-27 10:27:27
板凳
Ellia.Duan 发表于 2024-5-24 09:34
您好,根据您提供的代码,做了一个测试demo ,已上传,
测试了下,对500行数据,58列数据设置在table上, ...

你好,使用您提供的 demo, 我这边运行时间不到 400ms

image.png329163817.png

您也提到您的电脑需要1s, 也刚好证明了同样的代码在不同的电脑上执行,性能差异巨大,就基于现在的demo ,想问是否有优化的空间呢?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-5-27 17:43:21
地板
不好意思,回复晚了,我将深入调研下此问题,有进展会联系您。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-5-23 19:34:16
5#
您好,重新看了下代码,您或许可以考虑优化下CopyToOptions选项。
因为您在for循环中,会进行setArray()也就是说,会进行数据填充 ,所以没有必要进行
  1. sheet.copyTo(row + 1, col, startRow + rowIdx, col, 1, colCount, GC.Spread.Sheets.CopyToOptions.all)
复制代码


由于不太清楚您的实际业务需求,我这里将其设置为style后,性能提升了很多
  1.     sheet.copyTo(row + 1, col, startRow + rowIdx, col, 1, colCount, GC.Spread.Sheets.CopyToOptions.style)
复制代码
image.png706818847.png

以及如果有大量的高度需要重新调整,可以直接修改默认值高度。
最后,setDataSource()性能要好于setArray() 可以考虑数据绑定。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-2 11:48:06
6#
您好,由于本帖较长时间没有回复,本帖先做结贴处理了,后续如您有其他问题,欢迎您开新帖提问。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部