找回密码
 立即注册

QQ登录

只需一步,快速开始

BND
金牌服务用户   /  发表于:2024-4-20 20:38  /   查看:558  /  回复:12
本帖最后由 BND 于 2024-4-20 20:40 编辑

GcExcel操作IRange.setFormula及IRange.setValue方法,在表格较大时耗时过长,


具体请下载提供的示例代码,执行Test.java文件
image.png991480102.png
这里的一个单元格耗时普遍超过200ms,数据量很大的时候非常慢

dyTest.zip

122.56 KB, 下载次数: 20

示例代码

12 个回复

倒序浏览
BND
金牌服务用户   /  发表于:2024-4-20 20:46:46
沙发
本地机器的配置为4c8 i7 7700,java内存配置为ide默认
回复 使用道具 举报
Andy.C
注册会员   /  发表于:2024-4-22 09:54:58
板凳
如果是一批写入多个单元格数据,可以在写入前把wk.DeferUpdateDirtyState设置为true,在写入完成后后再把DeferUpdateDirtyState设置为false
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-4-22 12:14:02
地板
您好,可以参考楼上的回复,设置延迟标脏
  1. workbook.setDeferUpdateDirtyState(true);
  2. workbook.setDeferUpdateDirtyState(false);
复制代码

看是否可以解决您的问题
回复 使用道具 举报
BND
金牌服务用户   /  发表于:2024-4-22 14:23:50
5#
本帖最后由 BND 于 2024-4-22 14:24 编辑
Ellia.Duan 发表于 2024-4-22 12:14
您好,可以参考楼上的回复,设置延迟标脏

看是否可以解决您的问题
我们调整了一下,是如下这样做的。


写入前:
workbook.setEnableCalculation(false); //关闭公式计算引擎

写入后:
if (!workbook.getEnableCalculation())  {
        workbook.setEnableCalculation(true); // 启用公式计算引擎
        workbook.dirty(); // 让所有单元格保持dirty状态, 以触发重算
        workbook.calculate(); // 执行Workbook公式运算
}
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-4-22 14:55:26
6#
本帖最后由 Ellia.Duan 于 2024-4-22 16:31 编辑
BND 发表于 2024-4-22 14:23
我们调整了一下,是如下这样做的。

没太明白您的意思。
您本楼发的内容是指您的当前逻辑吗?

回复 使用道具 举报
BND
金牌服务用户   /  发表于:2024-4-22 15:12:02
7#
Ellia.Duan 发表于 2024-4-22 14:55
没太明白您的意思。
您本楼发的内容是指您的当前逻辑吗?
楼上给出的延迟标脏与您给出的代码并不冲突, ...

周六发帖后,我们再调整的逻辑。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-4-22 15:18:02
8#
本帖最后由 Ellia.Duan 于 2024-4-22 15:20 编辑

那么,现在的问题是,使用楼上给出的延迟标脏的方案,也没能提升您的性能问题吗?还是说,您这边使用您当前方案已经解决了?
回复 使用道具 举报
Andy.C
注册会员   /  发表于:2024-4-22 15:32:49
9#
BND 发表于 2024-4-22 15:12
周六发帖后,我们再调整的逻辑。

你这种方式有问题,首先设置了全表脏数据,而且还进行了全表重算。  这样会导致保存性能极差。
尽量不要去破坏gcexcel按需计算和读取计算的特性。  保存只做保存操作,不要做计算操作;  
回复 使用道具 举报
BND
金牌服务用户   /  发表于:2024-4-22 15:35:20
10#
Ellia.Duan 发表于 2024-4-22 15:18
那么,现在的问题是,使用楼上给出的延迟标脏的方案,也没能提升您的性能问题吗?还是说,您这边使用您当前 ...

使用我查到的方案有很大提升。

我的理解是这两个方案没有本质不同,核心都是在写数据时,关闭公式计算引擎,后果是此时会有脏数据(只要不读取就不是问题),等到写完数据之后,再开启公式计算引擎,整体计算一遍。

我想知道的是,这两个方案的代码内核逻辑是不是我说的这样,有无必要同时使用两个方案的代码。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部