找回密码
 立即注册

QQ登录

只需一步,快速开始

spreadjs666
金牌服务用户   /  发表于:2024-11-21 11:11  /   查看:39  /  回复:6
1金币
本帖最后由 spreadjs666 于 2024-11-21 11:19 编辑

【v17】如何在拖拽/复制执行前知道落值的单元格包含的公式

场景:
一个公式单元格【E3】引用了【D3】,用户拖拽填充/复制 【E3】至【E4】后,
【E4】单元格公式引用了【D4】,而【D4】单元格为不可见单元格,此时需要取消用户的拖拽操作并给出提示。


因此希望在用户操作执行前,例如DragFillBlock时判断被填充的区域内公式是否包含不可见区域,包含的话就e.cancel取消掉,但DragFillBlock时如何提前获取被填充的区域内公式呢?
image.png894468078.png

6 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:昨天 11:32
沙发
本帖最后由 Wilson.Zhang 于 2024-11-21 12:24 编辑

您好!咱们在拖动填充时sheet并不知道会被拖拽填充的区域,只能是随着光标拖动的方向了解下一个要被填充的单元格。SpreadJS提供了两个事件用以监听拖拽填充,分别是DragFillBlock和DragFillBlockCompleted事件,这两个事件可以监听到被填充的区域。您可以通过这两个事件监听,拖拽填充结束即可知晓被填充区域,通过Worksheet:getFormula()获取填充单元格中的公式,据此判断公式引用的单元格是否可见,进而根据判断结果决定是否需要给出提示。您尝试下看是否能够满足您的需求。
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:昨天 11:38
板凳
Wilson.Zhang 发表于 2024-11-21 11:32
您好!咱们在拖动填充时sheet并不知道会被拖拽填充的区域,只能是随着光标拖动的方向了解下一个要被填充的 ...

您好,如何根据拖拽源中的单元格引用区域推算拖拽填充的单元格对应要引用的单元格区域呢?
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:昨天 12:22
地板
spreadjs666 发表于 2024-11-21 11:38
您好,如何根据拖拽源中的单元格引用区域推算拖拽填充的单元格对应要引用的单元格区域呢?

您好!抱歉设想的方向不太对,在拖拽填充结束后,即可通过Worksheet:getFormula()获取被填充单元格中的公式,通过公式内容即可了解公式引用的单元格区域,据此即可判断被引用单元格是否为您业务中的不可见单元格。如果您需要通过单元格的行列索引判断单元格是否可见,可以通过CalcEngine:formulaToExpression()获取公式的解析树,结果中的row、column即引用单元格的行行列索引。

可以参考官网API文档了解详情:
CalcEngine:formulaToExpression()--https://demo.grapecity.com.cn/sp ... formulatoexpression
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:昨天 14:53
5#
Wilson.Zhang 发表于 2024-11-21 12:22
您好!抱歉设想的方向不太对,在拖拽填充结束后,即可通过Worksheet:getFormula()获取被填充单元格中的公 ...

您好,我们需要在填充结束之前就取消该操作并给出用户提示,防止该操作进入撤销栈。
所以需要在DragFillBlock这个时机去判断,但是没有找到根据拖拽源中的单元格引用区域推算拖拽填充的单元格对应要引用的单元格区域的方法。
麻烦看下有没有更好的时机和方法可以满足该需求?
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:昨天 17:30
6#
spreadjs666 发表于 2024-11-21 14:53
您好,我们需要在填充结束之前就取消该操作并给出用户提示,防止该操作进入撤销栈。
所以需要在DragFill ...

您好!通过您的描述,了解您的需求。其实推测过程有点儿复杂,但不代表不可行,我的思路如下:

1. DragFillBlock事件能够监听到的信息包括拖拽填充方向和区域,填充方向只有水平向右和垂直向下,对应属性fillDirection值分别为1和3。拖拽填充单元格区域被记录在属性fillRange中,包含有row、col、rowCount、colCount。
2. 假定拖拽源单元格中公式引用的单元格为A1,其行列索引均为0,拖拽填充方向为水平向右,那么,即可推算拖拽填充区域中公式应该引用单元格的行索引与A1相同,为0,而列索引则依次增1。同理,拖拽填充方向为垂直向下时,拖拽填充区域中公式应该引用单元格的列索引与A1相同,而行索引则依次增1。

推算规则大致如上,有点儿繁琐,而且是个细致的过程,您可以参考下。
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:昨天 18:21
7#
本帖最后由 spreadjs666 于 2024-11-21 18:26 编辑
Wilson.Zhang 发表于 2024-11-21 17:30
您好!通过您的描述,了解您的需求。其实推测过程有点儿复杂,但不代表不可行,我的思路如下:

1. Dra ...

您好,根据您的建议查看了下,目前是可行的。
我们目前想采取
  1. GC.Spread.Sheets.CalcEngine.formulaToExpression(sheet, '=$D$92+$E$95+$C$98+$M19+SUM(A1:B100)', 0, 0)
复制代码
这种方式获取公式树后遍历所有单元格引用,

目前能想到的需要处理的情况有:
单元格的绝对引用、
单元格的相对引用、
A1:B100的区域引用、
跨表格引用、
循环引用

目前看以上情况在公式树中表现形式和参数都是不一样的,
所以想了解下还有什么其他的情况?
image.png648085937.png

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部