请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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


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

最佳答案

查看完整内容

您最主要的目的是判断拖拽填充的单元格中公式是否会引用在您业务场景中不允许被引用的单元格,可以不用关心ExpressionType。通过CalcEngine可以将公式转为表达式,再基于表达式和基行基列可以创建新的表达式,而表达式也可以被转换为公式,又可以从公式中解析出引用区域。具体思路如下: 1. 通过GC.Spread.Sheets.CalcEngine.formulaToExpression()将拖拽源单元格中的公式转换为表达式。 2. 通过DragFillBlock事件可以监听到 ...

13 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2024-11-21 11:11:38
来自 12#
spreadjs666 发表于 2024-11-26 15:01
是的,就是本帖遇到的场景,使用formulaToRanges无法获取到公式对应的sheet表格,因此只能使用GC.Spread. ...

您最主要的目的是判断拖拽填充的单元格中公式是否会引用在您业务场景中不允许被引用的单元格,可以不用关心ExpressionType。通过CalcEngine可以将公式转为表达式,再基于表达式和基行基列可以创建新的表达式,而表达式也可以被转换为公式,又可以从公式中解析出引用区域。具体思路如下:

1. 通过GC.Spread.Sheets.CalcEngine.formulaToExpression()将拖拽源单元格中的公式转换为表达式。
2. 通过DragFillBlock事件可以监听到目标填充区域,对这个区域中的每个单元格,基于表达式通过GC.Spread.Sheets.CalcEngine.expressionToFormula()计算填充区域单元格中需要被填充的公式。
3. 对计算出来的公式,通过GC.Spread.Sheets.CalcEngine:formulaToRanges()逐一获取各公式引用的单元格区域。
4. 对得到的单元格区域,逐个判断是否为不允许被引用的单元格。

这样即可实现您的需求,也不用自行定义推断规则了。您可以亲自测试下上述方案。

评分

参与人数 1满意度 +5 收起 理由
spreadjs666 + 5

查看全部评分

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-11-21 11:32:49
2#
本帖最后由 Wilson.Zhang 于 2024-11-21 12:24 编辑

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

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

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

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

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

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-11-22 09:44:11
8#
spreadjs666 发表于 2024-11-21 18:21
您好,根据您的建议查看了下,目前是可行的。
我们目前想采取
这种方式获取公式树后遍历所有单元格引用 ...

还有跨工作簿引用、混合引用等。可以理解混合引用是相对引用和绝对引用的结合。

可以参考官网文档了解公式引用的详情和跨工作簿引用:
https://demo.grapecity.com.cn/spreadjs/help/docs/formulareference
跨工作簿公式--https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/calculation/cross-workbook-formula/purejs
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:2024-11-26 11:57:43
9#
Wilson.Zhang 发表于 2024-11-22 09:44
还有跨工作簿引用、混合引用等。可以理解混合引用是相对引用和绝对引用的结合。

可以参考官网文档了解 ...

您好,根据您提供的方法进行了调研,GC.Spread.Sheets.CalcEngine.formulaToExpression 方法会返回一个公式树,公式树中的type为GC.Spread.CalcEngine.ExpressionType

但想了解下什么样的公式type会包含以下被框选的码值,我需要造些数据依次处理一下

image.png633825683.png


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