找回密码
 立即注册

QQ登录

只需一步,快速开始

田十八

注册会员

4

主题

12

帖子

46

积分

注册会员

积分
46
最新发帖
田十八
注册会员   /  发表于:2023-8-4 16:55  /   查看:2746  /  回复:10
1金币
本帖最后由 田十八 于 2023-8-4 18:00 编辑

【背景】
WorkBook对象中有100个WorkSheet,且WorkSheet相互间使用公式相互关联,我每次前端渲染只想展示其中一个WorkSheet,

【现状】
1、将WorkBook对象移除所有WorkSheet,创建WorkBookEmpty对象
2、遍历当前WorkSheet所有单元格公式,获取当前WorkSheet引用的父级WorkSheet名称
3、将当前WorkSheet和父级WorkSheet添加到WorkBookEmpty对象中
4、返回WorkBookEmpty.tojson给前端对象

【问题】
目前频繁操作对象且遍历当前WorkSheet对象性能非常低下

【希望得到的支持】
1、根据需求背景,目前实现方案是否合理?是否有更好解决思路
2、获取当前Sheet关联的父级Sheet是否有公用方法,不必循环每个单元格实现

希望得到回复,感谢支持!

最佳答案

查看完整内容

GCExcel中有一个接口可以根据单元格的类型来获取到单元格的位置。 可以参考以下链接中的内容: https://demo.grapecity.com.cn/documents-api-excel-java/demos/specialcellsfindmiscellaneous https://www.grapecity.com.cn/gc-excel-java/api-docs/v6.1/com/grapecity/documents/excel/SpecialCellType.html?api-url=%2Fgc-excel-java%2Fapi-docs%2Fv6.1%2Fcom%2Fgrapecity%2Fdocuments%2Fexcel%2FSpecialCellType.html%2 ...

10 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-4 16:55:45
来自 4#
GCExcel中有一个接口可以根据单元格的类型来获取到单元格的位置。

可以参考以下链接中的内容:
https://demo.grapecity.com.cn/do ... lsfindmiscellaneous

https://www.grapecity.com.cn/gc- ... ype.html%23Formulas

IRange lastCell = searchScope.specialCells(SpecialCellType.Formulas);
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-8-4 17:47:26
2#
您好,
问题1: 目前没有更好的解决思路了
问题2:没有公用方法可以获取到当前sheet所依赖的其他sheet对象,需要遍历判断。
如果您遇到了遍历性能问题,可以提供一个具体的可复习此问题的demo,我们基于您的实际demo情况调研下是否有优化的空间。
回复 使用道具 举报
田十八
注册会员   /  发表于:2023-8-4 17:55:30
3#
那有没有一个方法是可以获取当前sheet所有写了公式的单元格对象?来缩小遍历范围?
回复 使用道具 举报
田十八
注册会员   /  发表于:2023-8-9 18:04:31
5#
本帖最后由 田十八 于 2023-8-9 18:05 编辑
Joestar.Xu 发表于 2023-8-7 09:32
GCExcel中有一个接口可以根据单元格的类型来获取到单元格的位置。

可以参考以下链接中的内容:

OK 感谢答复,已经做过验证,10万单元格遍历并不影响性能,而是解析单元格公式出现性能问题

解析时,使用的方法是利用单元格的父级Sheet来获取名称,但该方法耗时20毫秒,如果10万个单元格,执行则造成性能问题。
                          
  1. var refSheet = cell.GetPrecedents(); //此步骤需要20毫秒

  2. for (int k = 0; k < refSheet.Count; k++)
  3. {
  4.    var refSheetName = refSheet[k].ToString().Substring(1, refSheet[k].ToString().IndexOf("'!") - 1);
  5. }
复制代码


目前思路是使用正则解析公式,性能有所提升,不知道有没有其他方案
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-10 09:59:13
6#
根据您的代码来看已经是目前最好的解决方案,我们这边没有其他更好的方案了。
回复 使用道具 举报
Lewis
初级会员   /  发表于:2024-7-6 12:05:08
7#
方便知道为什么前端每次只展示一个sheet吗?如果是出于性能考虑,SpreadJS有增量加载功能,不会因为sheet太多卡住 https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/workbook/incremental-loading/purejs
回复 使用道具 举报
Lewis
初级会员   /  发表于:2024-7-6 12:09:45
8#
另一个方向,如果只是单纯为了展示某一个sheet的数据,可以将要展示的sheet的公式按照上面的做法找出来,然后设置值,清除掉公式,得到一个不包含父级sheet公式引用的sheet, 这样你展示的话,只需要一个sheet就够了
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-8 09:02:08
9#
Lewis 发表于 2024-7-6 12:09
另一个方向,如果只是单纯为了展示某一个sheet的数据,可以将要展示的sheet的公式按照上面的做法找出来,然 ...

回复 使用道具 举报
田十八
注册会员   /  发表于:2024-7-26 10:07:35
10#
Lewis 发表于 2024-7-6 12:05
方便知道为什么前端每次只展示一个sheet吗?如果是出于性能考虑,SpreadJS有增量加载功能,不会因为sheet太 ...

非常感谢回复!
1、只展示一个sheet页主要是基于权限考虑,某岗位可能只能编制其中一个sheet页,所以她只能看到自己部分的,但是她的输入Sheet页也需要参与完整计算。
2、增量加载我们也预研过,我们的完整套表基本都超过了10M,SperadJS对于客户端内存要求较高,如果每次返回全量套表增量加载,虽然能解决第一次加载时间问题,但无法解决客户端内存问题。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部