allen.leng 发表于 2024-12-20 17:40:22

v17.1.10 SJ 脏数据和增量计算问题

我通过脏数据监听文件有没有被修改过,但是开启增量计算的时候会产生脏数据,这就产生了一点矛盾。这是一个bug么,还是一个机制,有什么好办法解决这个问题么

Wilson.Zhang 发表于 2024-12-23 08:38:49

您好!请教下在您的业务场景中会怎样修改?手动修改某个单元格的数据吗?还是通过公式计算?需要您详细介绍下您的业务场景。

allen.leng 发表于 2024-12-23 10:08:13

Wilson.Zhang 发表于 2024-12-23 08:38
您好!请教下在您的业务场景中会怎样修改?手动修改某个单元格的数据吗?还是通过公式计算?需要您详细介绍 ...

都有可能的,我们需要监听到哪些单元格对应的行被修改过

Wilson.Zhang 发表于 2024-12-23 17:27:21

allen.leng 发表于 2024-12-23 10:08
都有可能的,我们需要监听到哪些单元格对应的行被修改过

在自动计算模式下,手动修改某个单元格后,会触发当前sheet自动重算,与这个单元格有引用关系的单元格将被重算后的结果代替,与该单元格没有引用关系的单元格数值不变。因此,即便是增量计算模式下,被重算的是与被修改单元格相关的单元格,这些单元格由于数值变化变为脏数据单元格也正常。

也可以考虑将计算模式切换为手动模式,这样手动修改单元格数据后sheet不执行自动重算,此时获取到的脏数据都由手动修改造成。手动重算后,依然是与被修改单元格存在引用公式关系的单元格由于重算改变了数据,变为脏数据单元格。

allen.leng 发表于 2024-12-23 19:45:53

Wilson.Zhang 发表于 2024-12-23 17:27
在自动计算模式下,手动修改某个单元格后,会触发当前sheet自动重算,与这个单元格有引用关系的单元格将 ...

你这个说法没有解答我的疑惑,
我还没有手动修改,增量计算本身就产生了很多脏数据。

Wilson.Zhang 发表于 2024-12-24 08:59:06

allen.leng 发表于 2024-12-23 19:45
你这个说法没有解答我的疑惑,
我还没有手动修改,增量计算本身就产生了很多脏数据。

增量计算是计算过程中的辅助优化性能机制,您的文件中可能存在触发计算的机制,比如导入文件后自动重新计算,或者自动或手动触发了计算。

如果有数据被修改,引用了该数据的公式将在计算后获得新结果,相应地该公式所在单元格会变为脏状态,其所在行也变为脏数据行。
如果您未修改数据,那是否有手动重新计算?需要您详细介绍下您的使用场景,可以提供一个能够复现问题的ssjson文件,同时介绍下操作步骤。

allen.leng 发表于 2024-12-27 17:46:13

本帖最后由 allen.leng 于 2024-12-27 17:48 编辑

有没有什么方法可以监听到脏数据是怎么产生的么。
我在在线demo上试的时候,是没有脏数据的,但是我本地调试的时候,就是会产生脏数据,都只是简单排了个序。然后我现在不知道这脏数据是在哪产生的。

Wilson.Zhang 发表于 2024-12-30 10:07:09

allen.leng 发表于 2024-12-27 17:46
有没有什么方法可以监听到脏数据是怎么产生的么。
我在在线demo上试的时候,是没有脏数据的,但是我本地调 ...

当单元格中值发生变化后,单元格即为脏数据单元,如下图所示定义:

在排序过程中,根据用户定义的排序规则,单元格可能会发生值变化,由此引发标脏动作,这便会记录脏数据。您可以在排序过程中暂停标脏,在排序结束时恢复标脏,同时清除在此过程中由于排序标脏产生的脏数据。或者不作暂停恢复,仅在排序完成后清除脏数据。

可以参考官网产品文档了解排序过程的标脏:https://demo.grapecity.com.cn/spreadjs/help/docs/BestPractices/UsingsuspendDirtyandresumeDirty

allen.leng 发表于 2024-12-30 13:52:21

Wilson.Zhang 发表于 2024-12-30 10:07
当单元格中值发生变化后,单元格即为脏数据单元,如下图所示定义:

在排序过程中,根据用户定义的排序 ...

我设置了的

Wilson.Zhang 发表于 2024-12-30 17:28:14

allen.leng 发表于 2024-12-30 13:52
我设置了的

如果不希望在排序过程对排序列产生脏数据,我理解可以在排序完成时通过Worksheet::clearPendingChanges()清除在这个过程中产生的脏数据,暂停标脏后又恢复标脏还是会将置换了数据的单元格标脏,不过这样会优化因标脏带来的性能。
最终在排序完成时,需要清除脏数据。您的代码中缺少清除标脏语句。

另外,早先跟您了解到您的使用场景可能会手动修改单元格数据、也可能通过公式计算修改单元格数据。无论是否为增量计算,如果被修改单元格被其他公式引用,除了被修改单元格外,引用该单元格的公式所在的单元格、及引用这些公式的单元格,以此类推,在引用链上的所有单元格,均会变为脏数据单元格。


上述修改单元格值的方式中,只有手动修改才能触发ValueChanged事件。关于因计算发生改变的单元格,您可以结合触发时机获取脏数据单元格。
页: [1] 2
查看完整版本: v17.1.10 SJ 脏数据和增量计算问题