本帖最后由 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左右趋于稳定。
请问一下,以上流程有什么可以优化的地方,如何解决内存飙升的问题, 如何解决计算完成后可以优化内存占用量
|
|