动态格间运算是复杂报表的一个典型特征。

一般来说,固定的列间或者固定的行间运算处理非常简单,所有的报表工具包括excel均可轻松处理。我们这里所说的动态格间运算,特指浮动行列的情况,即行列均为动态扩展出来的,此时行间、列间、甚至组间的运算叫动态格间运算。

要进行动态格间的运算就需要定位单元格,即通过坐标将单元格的位置表示出来,以便于引用和展现其值。

要准确的表示一个单元格的位置,有几种方式:

  • 绝对坐标:最简单的就是用单元格在报表中所处行列的标号表示,如:A1、B2、C3......,这就叫绝对坐标。

  • 层次坐标:如果单元格可扩展,那么扩展后的多个单元格对应的是报表中的一个格,用绝对坐标就表示不清楚了。这时可以使用层次坐标,来准确的定位单元格扩展后的位置。例如:C2[A2:2,B2:3]。

  • 位移坐标:如果我们不知道单元格的确切位置,只知道它相对于一个已知单元格的相对位移,这时可以使用位移坐标定位目标单元格的位置。例如:C3[A3:-1,B3:-2]。

  • 省略主格表示法:由于层次坐标和位移坐标的表示法比较繁琐,当单元格和当前格主格相同时,层次坐标和位移坐标可以采用省略主格的缺省写法。例如:C1[B1:2],C2[B2:-1]。

下面我们将具体的介绍几种坐标的写法。

绝对坐标

单元格通过“列号+行号”来命名。这种单元格的表示方法称为其绝对坐标,在文档中写为Cellx。

如果单元格为合并单元格,则以其左上角单元格的名称表示。

例1:B列第3行的单元格名为B3: 绝对坐标 - 图1

例2:A1、B1、C1合并后的单元格名为A1: 绝对坐标 - 图2

下图是一些单元格合并后的名称: 绝对坐标 - 图3

层次坐标

在进行报表设计时,单元格尚未扩展,但是其它单元格的表达式可能需要此单元格扩展后的位置。这时,就要对扩展后的每个单元格进行唯一性定义,这就是单元格的层次坐标。层次坐标是用于唯一描述(精确定位)扩展后的每一个单元格的表达式。

例如: 绝对坐标 - 图4 对于该主格,C1[A1:3,B1:2]表示对应的附属格,即图中黄色单元格。

语法: 绝对坐标 - 图5

说明: 绝对坐标 - 图6

在上述的层次坐标的表示法中,如果目标单元格Cellx本身是扩展单元格,那么要唯一描述(精确定位)其扩展后的单元格的位置,可以写为Cellx[Lk:lk,Lk-1:lk-1...L1:l1,Cellx:n],其中n为Cellx扩展后的次序。与之类似,如果Cellx只有上主格,可以写为Cellx[;Tk:tk,Tk-1:tk-1...T1:t1,Cellx:n]。

层次坐标,在文档中统一用[Coordinate]表示。

在层次坐标中,并不一定指定到最低一级主格扩展后的位置。在这种情况下,Cellx[Coordinate]会返回扩展后的若干单元格中的第一个,Cellx[Coordinate]{CriteriaExp}会返回扩展后的若干单元格中符合条件的单元格的集合。

层次坐标[Coordinate]的运算结果指向目标单元格的位置。如果层次坐标能够定位到一个单元格,那么Cellx[Coordinate]返回该单元格的值;如果定位到多个单元格,那么Cellx[Coordinate]返回这些单元格中第一个单元格的值。

下面是几个用层次坐标定位单元格的例子。

例1:下图的报表中,C1[A1:1,B1:2]的返回值为5;C1[A1:2,B1:3]的返回值为12;C1[A1:3,B1:4]的返回值为21;B1[A1:2,B1:2]的返回值为5,B1[A1:3,B1:4]的返回值为7。 绝对坐标 - 图7

例2:下图的报表中,C3[A3:1,B3:2;C1:2,C2:3]的返回值为216;C3[A3:3,B3:3;C1:1,C2:2]的返回值为255;C3[A3:2,B3:1;C1:3,C2:2]的返回值为228;C3[A3:3,B3:1;C1:3,C2:3]的返回值为248。 绝对坐标 - 图8

例3:下图的报表中,C3[A3:1,B3:2;C1:2]的返回值为212;C3[A3:3;C1:1,C2:2]的返回值为229;C3[A3:2;C1:3,C2:3]的返回值为231。 绝对坐标 - 图9

层次坐标还可以用相对位移来表示,下面介绍位移坐标。

位移坐标

许多时候,报表设计者并不知道目标单元格的具体位置,仅仅知道目标单元格相对于当前单元格的位移,因此给出了位移坐标。

位移坐标的运用非常广泛,例如报表中常常需要计算同期比、比上期之类的与时间相关的数据,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减前一列数据等等。这种涉及到相邻n行或者n列的行间、列间的运算,称为位移运算,相关的表达式称为位移表达式。

位移坐标是用来描述目标单元格和当前格之间的位置关系的表达式。

例如: 绝对坐标 - 图10

语法: 绝对坐标 - 图11

说明: 绝对坐标 - 图12

例如: 绝对坐标 - 图13

省略主格表示法

层次坐标和位移坐标的表示比较烦琐,而且大部分时候,对于单元格的定位是和当前格的位置有关系的,比如当前格的主格或者和当前格有着相同主格的单元格,这时可以采用省略主格的写法。

省略主格时,如果目标单元格的某个主格Lk和当前单元格的主格相同,那么层次坐标/位移坐标中该主格可以不写。

如果目标单元格与当前格的关系满足缺省主格认定规则,那么直接遵循缺省引用规则的表示法,不需要层次坐标/位移坐标。

例如: 绝对坐标 - 图14

如果目标单元格Cellx本身是扩展单元格,那么Cellx[n]表示其纵向扩展后的第n格单元格,Cellx[;n]表示其横向扩展后的第n格单元格。

在没有复杂的主格关系的报表中,Cellx[±n]表示当前格Cellx往上位移n格或者往下位移n格,其中+代表往下位移,-代表往上位移。