找回密码
 立即注册

QQ登录

只需一步,快速开始

陈皮

中级会员

43

主题

243

帖子

772

积分

中级会员

积分
772

悬赏达人

陈皮
中级会员   /  发表于:2023-8-3 18:36  /   查看:1101  /  回复:7
1金币

需求场景:
当新建sheet时,从上个sheet复制printInfo到新sheet,新的sheet修改打印样式时不影响原有printInfo

问题:
使用cloneDeep拷贝printInfo对象耗时过长,稍微大点的就1s多,数据量再大的得10s+,有什么办法优化吗?

代码如下:


  //绑定新建sheet/删除sheet(sheet改变事件)
  spread.bind(GC.Spread.Sheets.Events.SheetChanged, function (sender, args) {
    const time1 = Date.now()
    //操作类型
    const propertyName = args.propertyName
    //-------------新建sheet事件
    //离开旧sheet时保存该sheet打印配置
    if (propertyName == 'isSelected' && args.oldValue) {
      prePrintInfo = spread.getSheet(args.sheetIndex).printInfo()
    }
    if (propertyName == 'isSelected' && args.newValue) {
      changeNewSheetIndex = args.sheetIndex
    }
    if (propertyName == 'insertSheet') {
      let sheet = spread.getSheet(args.sheetIndex)
      sheet.setRowCount(500)
      //新建sheet
      if (args.sheetIndex === changeNewSheetIndex) {
        spread.suspendPaint()
        sheet.printInfo(_.cloneDeep(prePrintInfo));
        // sheet.printInfo((prePrintInfo));
        changeNewSheetIndex = -1
        spread.resumePaint()
      }
    }
    console.log("SheetChanged", args, Date.now() - time1);
  });


相关帖子地址:
【v16】如何使sheet的printInfo各自独立 - SpreadJS & GcExcel专区 - 求助中心 - 葡萄城产品技术社区 (grapecity.com.cn)
demo,测试文件见附件

打印信息拷贝测试.rar

55.75 KB, 下载次数: 63

20230803_打印信息cloneDeep.rar

225.71 KB, 下载次数: 76

最佳答案

查看完整内容

这边调研了一下,实际上printInfo里面包含的不仅仅只有打印的信息,还有很多其他的信息。 如下图所示: 对整个printInfo对象使用深拷贝时,极有可能会遇到性能上的问题,对于这种情况,建议您有限地使用深拷贝。 举一个简单的例子,现在的printInfo中会包含当前sheet中的一些信息,这些信息不是printInfo中必要的信息,那么深拷贝这些信息就完全没有意义。 printInfo中有意义的信息如下图所示: 这些中的某 ...

7 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-3 18:36:15
来自 2#
这边调研了一下,实际上printInfo里面包含的不仅仅只有打印的信息,还有很多其他的信息。

如下图所示:

image.png620048827.png

对整个printInfo对象使用深拷贝时,极有可能会遇到性能上的问题,对于这种情况,建议您有限地使用深拷贝。

举一个简单的例子,现在的printInfo中会包含当前sheet中的一些信息,这些信息不是printInfo中必要的信息,那么深拷贝这些信息就完全没有意义。

printInfo中有意义的信息如下图所示:

image.png508142089.png

这些中的某些属性是用对象存储的,有些是简单的值,所以分为两种情况,对于对象存储的属性信息,可以采用深拷贝,对于简单的值,直接赋值即可,这样一来可以极大减轻性能上的压力。

对整个printInfo使用深拷贝过于简单粗暴,势必也会带来性能上的问题,因此建议您按照我上文所述,因地制宜地使用深拷贝,来实现您的需求。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
陈皮
中级会员   /  发表于:2023-8-4 10:20:48
3#
Joestar.Xu 发表于 2023-8-4 10:02
这边调研了一下,实际上printInfo里面包含的不仅仅只有打印的信息,还有很多其他的信息。

如下图所示:
...

能麻烦写个demo供参考吗
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-4 11:57:36
4#
我做了一个简单的Demo,模拟了一下克隆printInfo的操作,其中orientation为值类型,margin为引用类型。

其他的属性都可以分为这两种类型来进行处理。

通过点击Modify的两个按钮可以实现克隆和输出printInfo信息的操作。

temp.zip

1.67 KB, 下载次数: 61

SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
陈皮
中级会员   /  发表于:2023-8-7 14:15:38
5#
Joestar.Xu 发表于 2023-8-4 11:57
我做了一个简单的Demo,模拟了一下克隆printInfo的操作,其中orientation为值类型,margin为引用类型。

...

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-7 15:49:15
6#
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
nobt
论坛元老   /  发表于:2023-8-7 17:35:56
7#
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-7 18:06:05
8#
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部