找回密码
 立即注册

QQ登录

只需一步,快速开始

写BUG的程序员

注册会员

19

主题

52

帖子

185

积分

注册会员

积分
185
写BUG的程序员
注册会员   /  发表于:2024-3-15 15:12  /   查看:884  /  回复:15
本帖最后由 Joestar.Xu 于 2024-3-20 12:08 编辑

调研编号: SJS-23443

我们报表的渲染流程:

1、先通过fromJSON,渲染报表模板;
     spread.fromJSON(template, {
        doNotRecalculateAfterLoad: true,
        ignoreFormula: false,
     })
2、然后挂起计算和事件
    spread.suspendCalcService(false)
    spread.suspendEvent()
3、 获取我们自己的业务数据
4、 找到数据对应的表格,如果找不到则新建,找的到,根据业务数据去扩展表格
     业务数据表列表sourceTableList循环执行下面操作:

     根据业务数据列表中的sheetName找到对应的sheet
     const sheet = spread.getSheetFromName(sheetName)

     let table = sheet.tables.find(rowRangestart, colRangestart)
     if(!table) {
          sheet.tables.add({tableName, rowStart, colStart, rowLength, colLength})
     } else {
          if (dataCol > tableCol) { // 业务表的列大于模板表的列,插入列
                table.insertColumns()
          } else {// 删除相应的列
               table.deleteColumns()
          }
     }
    table.allowAutoExpand(false)
    table.autoGenerateColumns(false)

    sheet.suspendPaint()
    table.bindColumns(tableColumns)
    table.bind(tableColumns, 'data', { cols: data.cols, data: data.data })
    sheet.resumePaint()

5、列表都绑定完成后,开启计算,刷新透视表等操作,整个表格渲染完成
      spread.resumeEvent()
      spread.resumeCalcService(true)

      spread.sheets.forEach((sheet) => {
        sheet.pivotTables.all().forEach((pivot) => {
          pivot.updateSource()
        })
      })
      spread.refresh()

以上渲染操作,如果公式较多,或数据量较大的时候,在执行到地5步的时候,就会卡死,浏览器崩溃。即使不崩溃在执行第5步的时候内存会飙升,且计算完后内存也不会下降。
有个公式量大的报表实测: 在执行第5步前,内存使用量270多M,执行第5步的过程中内存飙升到2800多M。计算完成后,内存慢慢降至2300M左右趋于稳定。


请问一下,以上流程有什么可以优化的地方,如何解决内存飙升的问题, 如何解决计算完成后可以优化内存占用量

15 个回复

倒序浏览
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-15 17:52:51
沙发
您好,性能问题需要您提供一下可以复现出这个问题的文件,我们这边复现后调研一下。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
写BUG的程序员
注册会员   /  发表于:2024-3-15 18:06:46
板凳
Joestar.Xu 发表于 2024-3-15 17:52
您好,性能问题需要您提供一下可以复现出这个问题的文件,我们这边复现后调研一下。

这个渲染流程有什么问题吗。我发现用这个流程渲染,有些公式会报溢出、有些开启计算时会卡主。

所以您帮忙看下这个渲染流程有没有什么问题
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-18 11:13:16
地板
您好,从代码流程上来说没有什么特别大的问题,猜测是因为您的模板中的公式量很大,导致计算时耗费的时间很长。

建议您提供一个完整的可以复现您问题的Demo,我们这边根据实际情况再看看是否还有优化的空间。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
写BUG的程序员
注册会员   /  发表于:2024-3-19 17:54:05
5#
Joestar.Xu 发表于 2024-3-18 11:13
您好,从代码流程上来说没有什么特别大的问题,猜测是因为您的模板中的公式量很大,导致计算时耗费的时间很 ...

demo如附件

数据绑定计算后,内存居高不下demo.zip

8.35 MB, 阅读权限: 150, 下载次数: 2

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-20 09:59:27
6#
您好,您描述的情况我了解了,这边调研一下,后续有进展我会在本贴中回复您。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
前端小白
注册会员   /  发表于:2024-3-21 16:14:36
7#
https://gcdn.grapecity.com.cn/showtopic-157259-1-3.html
image.png237348326.png

dynamicReferences 一关,单车变摩托
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-21 16:31:13
8#
楼主可参考楼上热心用户的回复测试看看。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
写BUG的程序员
注册会员   /  发表于:2024-3-21 20:36:20
9#
Joestar.Xu 发表于 2024-3-21 16:31
楼主可参考楼上热心用户的回复测试看看。

这个API设成false会有什么影响么,比如后面公式计算速度、数据变化后公式会不会同步计算等。会不会有影响
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-22 10:58:57
10#
一般情况下来说不会,建议您在有很多公式的情况下,如 IF / CHOOSE / SUNIF / SUMIFS / AVERAGEIF / AVERAGEIFS / MAXIFS / MINIFS / COUNTIFS / VLOOKUP / HLOOKUP,将 dynamicReferences 置为 FALSE。
SpreadJS 17.0.8 | GcExcel 7.1.0 已发布~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部