本帖最后由 Wilson.Zhang 于 2024-12-14 17:26 编辑
背景:以公式为过滤条件,比如筛选列B中单元格文本长度大于2的单元格,然而,公式中的单元格引用格式在此尤为关键。
问题原帖:https://gcdn.grapecity.com.cn/showtopic-230685-1-1.html
SpreadJS的筛选器HideRowFilter除了以普通数值为筛选条件外,还可以以公式为筛选条件,这一支持扩大了筛选器的应用场景。比如,在本文的问题背景中,用户场景中的某列单元格中的数据是不同长度的文本字符串,用户需要根据文本长度做筛选。毋庸置疑,筛选器支持的公式条件便派上了用场。通过LEN()函数即可获取单元格文本内容的长度,结合不等式即可构成筛选条件,如LEN(A1)>2即判断A1单元格中的文本长度是否大于2。
如图1所示,令数据居于B列,且设置筛选器的筛选条件为LEN(B1)>2,即筛选文本长度大于2的单元格。实际运行代码后,发现筛选器无响应。在单元格中使用公式LEN(B1)>2可以正常运行得到结果,但是在筛选器中为什么不能正常响应得到期待的筛选结果呢?既然公式函数有效,那么可以锁定研究筛选器内部如何使用公式,以此为突破口。
图1. B列数据设置HideRowFilter
经调研发现,筛选器首先解析筛选条件中的公式LEN(B1)>2。此时,公式引用单元格的形式为相对引用,筛选器解析得到相对引用单元格B1的行列索引分别为0、1,且以此为基行基列偏移至C列。即筛选器解析公式后以C列为筛选目标,而C列并无数据,这便导致筛选结果不符合预期,误以为筛选器工作异常。而真相却是公式引用单元格的方式与筛选公式正常工作的方式不一致,那么正常的使用方式应该是怎样的呢?
既然数据在B列,筛选器也被设置在B列,那么筛选公式需要引用的单元格也在B列,可以使用相对引用和绝对引用结合的形式锁定B列但令单元格自上而下扩展,即LEN($B1)>2。在单元格引用$B1中,表示B列绝对,行相对加一。附上demo,以供参考。
这个问题看似稀松平常,但是反映出来单元格引用方式在公式筛选条件中的利害所在。在使用公式作为筛选条件时,要结合单元格绝对引用和相对引用组成能令筛选器正确发挥效用的公式。
在SpreadJS中,引用单元格的方式主要有相对引用和绝对引用两种,引用单元格必然要指定单元格的行列索引。以单元格A1为例,介绍下不同引用形式的区别。
绝对引用形式为$A$1,复制该公式至其他单元格也将保持引用相同的单元格,因为符号“$“锁定了A列和行1。如图2所示,在单元格A5通过绝对引用形式引用单元格A1,随后复制该公式粘贴至单元格B5至F5,可见粘贴在单元格中的公式均为”=$A$1“。
图2. 绝对引用
相对引用形式A1在复制粘贴至其他单元格时,将根据粘贴单元格与被复制单元格的相对位置关系同步更改行列索引。如图3所示,在单元格A6通过相对引用形式引用单元格A1,随后复制该公式粘贴至单元格B6至F6,可见粘贴在单元格中的公式分别为“=B1”、“=C1”、“=D1”、“=E1”、“=F1”。
图3. 相对引用
结合绝对引用和相对引用可以派生出两种不同的混合引用形式,即绝对行相对列和绝对列相对行。顾名思义,绝对行相对列即锁定行而令列相对偏移,绝对列相对行即锁定列而令行相对偏移。
绝对列相对行引用形式$A1复制粘贴在同列范围内的单元格时,行索引将根据粘贴单元格和被复制单元格之间的相对位置偏移。如图4所示,在单元格A7通过绝对列相对行引用形式引用单元格A1,随后复制该公式粘贴在单元格A8至A9,可见粘贴在单元格中的公式分别为“=$A2”、“=$A3”。
图4. 绝对列相对行引用
同理,绝对行相对列引用形式A$1复制粘贴在同行范围内的单元格时,列索引将根据粘贴单元格和被复制单元格之间的相对位置偏移。如图5所示,在单元格A10通过绝对行相对列引用形式引用单元格A1,随后复制该公式粘贴在单元格B10至F10,可见粘贴在单元格中的公式分别为“=B$1”、“=C$1”、“=D$1”、“=E$1”、“=F$1”。
图5. 绝对行相对列引用
关于单元格引用格式,可以参考官网产品文档了解更多使用细节: |