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

QQ登录

只需一步,快速开始

.fly

注册会员

2

主题

15

帖子

43

积分

注册会员

积分
43
最新发帖
.fly
注册会员   /  发表于:2025-3-13 11:31  /   查看:216  /  回复:18
30金币
本帖最后由 .fly 于 2025-3-13 11:33 编辑

在进入编辑公式状态时,假设我存储有{'A1': 'sum(...)', 'A2': 'A1:A10', 'A3': '我的自定义名称'}
则我希望当鼠标点击A1时,公式框内不会自动填充A1,而是会自动填充sum(...)
进一步泛化地,我希望用一个function (row, col, row_count, col_count)=>text 来取代原有的坐标获取逻辑
我应该怎么做?

最佳答案

查看完整内容

您好!我理解您的诉求了,完全可以理解您的想法。 咱们在往单元格键入公式并且通过鼠标点击单元格对公式传参引用单元格时,并不能触发SelectionChanged事件,这便导致咱们无法在编辑公式的过程中了解到被选择的单元格。EditChange事件虽然可以监听到编辑过程中单元格内数据的变化,但是咱们并不能就此修改输入的数据,至少在EditChange事件处理函数中的修改不会作用在单元格上。 如果您支持在输入公式时另外显示一个弹框,就 ...

18 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-3-13 11:31:50
来自 13#
您好!我理解您的诉求了,完全可以理解您的想法。

咱们在往单元格键入公式并且通过鼠标点击单元格对公式传参引用单元格时,并不能触发SelectionChanged事件,这便导致咱们无法在编辑公式的过程中了解到被选择的单元格。EditChange事件虽然可以监听到编辑过程中单元格内数据的变化,但是咱们并不能就此修改输入的数据,至少在EditChange事件处理函数中的修改不会作用在单元格上。

如果您支持在输入公式时另外显示一个弹框,就可以在EditChange事件处理函数中将editingText参数的正在编辑的公式中的单元格引用转换为您业务场景中定义的名称,然后将转换后的公式字符串显示在弹框中。如此,编辑和显示同步进行,您可以评估下这样是否能满足您的需求。
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-13 15:05:02
2#
本帖最后由 Matthew.Xue 于 2025-3-13 15:06 编辑

您好,刚好我昨天写了一篇文章,您可以先看一下:监听范围选择器的选择事件
文章中是在FormulaTextBox中添加了一个ValueChanged事件,并对endSelectMode方法做了一些修改。您目前想要做的事情其实是类似的,想要重写text方法,按照文章中对endSelectMode方法的重写来做就好了。
但是由于FormulaTextBox非常常用,而text方法又是其中的重点方法,在很多地方都有用,所以建议您另外挂载一个myText方法,您自己使用的时候,就可以使用myText。
  1. GC.Spread.Sheets.FormulaTextBox.FormulaTextBox.prototype.myText = function() {
  2.     let text = this.text()
  3.     // do something to text
  4.     text = text + " custom"
  5.     return text
  6. }
复制代码

回复 使用道具 举报
.fly
注册会员   /  发表于:2025-3-13 17:23:57
3#
本帖最后由 .fly 于 2025-3-13 17:38 编辑
Matthew.Xue 发表于 2025-3-13 15:05
您好,刚好我昨天写了一篇文章,您可以先看一下:监听范围选择器的选择事件
文章中是在FormulaTextBox中添 ...

我阅读了您的文章,在名称管理器的例子下它确实有效。但在单元格编辑公式时,似乎并不会触发endSelectMode事件,还有别的入口吗?
此外,我最直接的需要并不是捕获公式编辑区内的text,而是修改“根据选中单元格区域获得text”的逻辑。譬如,选择0行0列时,不再填充“A1”,而是填充“1A”。
文本确实提供了一个可能的备选路径,我可以将“A1”解为row和col,并运行我自己的逻辑,得到新的文本“1A”,并再次执行text,替换我捕获到的文本。但当公式复杂时,可能还涉及到比对公式前后变化的区域、判断这个变化是否来自于单元格区域选择(还是来自于用户输入或其他原因),可能比较麻烦。
企业微信截图_17418576982306.png


回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-13 17:37:56
4#
本帖最后由 Matthew.Xue 于 2025-3-13 17:43 编辑
.fly 发表于 2025-3-13 17:23
我阅读了您的文章,在名称管理器的例子下它确实有效。但在单元格编辑公式时,似乎并不会触发endSelectMod ...

我一开始以为您是想自己写一个FormulaTextBox,您其实是想在设计器上方的公式编辑栏以及单元格内部输入吗?
我文章中的方法是针对那种悬浮在页面的FormulaTextBox有用,而设计器上方常驻的编辑栏根本就不会进入到selectMode,所以就谈不上endSelectMode。
如果您只是想在页面的单元格中去改变公式,比方说在某个单元格写了“=A1”,就自动替换成“=SUM(...)”,那么完全可以使用CellChanged事件来监听,当监听到propertyName为formula时,就获取这个单元格的formula,并根据您的规则对单元格的公式做出修改
CellChanged
getFormula
setFormula
image.png923381347.png
注意,所有的事件可以直接注册在workbook上,您不必非在sheet中注册:
  1. spread.bind(GC.Spread.Sheets.Events.CellChanged, function(e,info) {
  2.     console.log(info)
  3.     let formula = getProcessedFormula(info.sheet, info.row, info.col)
  4.     info.sheet.setFormula(info.row, info.col, formula)
  5. })

  6. function getProcessedFormula(sheet, row, col) {
  7.     let formula = sheet.getFormula(row, col)
  8.     // do something to formula
  9.     formula = "sum(...)"
  10.     return formula
  11. }
复制代码

回复 使用道具 举报
.fly
注册会员   /  发表于:2025-3-13 17:42:09
5#
本帖最后由 .fly 于 2025-3-13 17:44 编辑
Matthew.Xue 发表于 2025-3-13 17:37
我一开始以为您是想自己写一个FormulaTextBox,您其实是想在设计器上方的公式编辑栏以及单元格内部输入吗 ...

我希望修改编辑公式时,“根据选中的单元格区域获得text”的逻辑。原来的逻辑是,当我输入=,并点击0行0列时,公式会自动变成“=A1”,然后,如果我再输入“=A1+”,并点击0行1列单元格,公式会自动变成“=A1+B1”。
我希望修改它的逻辑,譬如,使它的结果变为“=零行零列+零行一列”
也就是说,将映射:(0,0)=>"A1", (0,1)=>"B1"修改为(0,0)=>"零行零列", (0,1)=>"零行一列"
回复 使用道具 举报
.fly
注册会员   /  发表于:2025-3-13 17:49:03
6#
Matthew.Xue 发表于 2025-3-13 17:37
我一开始以为您是想自己写一个FormulaTextBox,您其实是想在设计器上方的公式编辑栏以及单元格内部输入吗 ...

动机是,我有一套单元格自动命名机制。因此,希望用户在编辑公式时,如果利用鼠标选中单元格区域来快速填充公式,优先填充单元格的名称,而不是坐标。以便于公式审计和理解。
回复 使用道具 举报
.fly
注册会员   /  发表于:2025-3-13 17:52:12
7#
Matthew.Xue 发表于 2025-3-13 17:37
我一开始以为您是想自己写一个FormulaTextBox,您其实是想在设计器上方的公式编辑栏以及单元格内部输入吗 ...

这个方法确实可行。但过程可能比较间接?相当于:选中单元格区域=>填充文本=>捕捉文本=>根据文本解析单元格坐标=>根据单元格坐标重新获取自定义文本=>填充文本。

可否直接:选中单元格区域=>捕捉事件,根据单元格坐标获取自定义文本=>填充文本?
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-13 17:54:04
8#
.fly 发表于 2025-3-13 17:49
动机是,我有一套单元格自动命名机制。因此,希望用户在编辑公式时,如果利用鼠标选中单元格区域来快速填 ...

那用我上面回复中的代码应该就可以实现您要的功能,但是您的这套映射规则,对与spreadjs来说是不认识的,所以这样改过后公式肯定会报错,或者无法正确计算,这个您是可以接受的吗?
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-13 17:55:57
9#
本帖最后由 Matthew.Xue 于 2025-3-13 17:58 编辑
.fly 发表于 2025-3-13 17:52
这个方法确实可行。但过程可能比较间接?相当于:选中单元格区域=>填充文本=>捕捉文本=>根据文本解析单元 ...

当然可以,目前是在输入公式时做出改变,但是改变公式的核心逻辑是一致的,只是触发的时机不同。
如果是想让整个sheet的公式都做出改变,其实连选择区域这一步都可以省略,您只需要在打开一个模板时去获取usedRange,并传入参数formula,就可以拿到所有带有公式的区域,对这个区域遍历循环,去执行类似上面的逻辑就可以了。如果只是对选择的区域做出改变,也是一样,usedRange就变成用户自己选的区域,使用getSelections就好,逻辑是相同的

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