系列文章:
概要
在上一篇文章《还在担心报表不好做?不用怕,试试这个方法》(二)中,小编介绍了模板语言中的的一些基本概念和用法,今天小编将继续为大家介绍如何不同字段间的父子关系,是如何在模板语言中定义的。
首先重新回顾一下,上一次使用到的数据表。如下所示:
可以看到,在数据表中,销售公司和员工两列数据拥有一个所属关系。
因此在某些情况下,我们可以将员工按照所属的公司关系进行分类,如下图所示:
这样就实现了一个基于数据间的主从关系的显示布局。
数据中的主从关系
在数据表中,刚提到了销售公司与员工有一个所属关系的存在,即数据本身存在逻辑关系。员工列的数据隶属于某一个销售公司。
同时,商品和商品类型,也有一个逻辑关系,商品隶属于某一种商品类型。通常这种所属或隶属的关系,会被称为主从关系,或者父子关系。
为了方便理解,这里举一个例子,让您更好的理解这种包含,或者主从的关系。其本身更像是一种树形结构,也有另一种说法,来称呼这种关系,叫做“一对多”,1:N 的关系。
以国家为例,一个国家,有多个省,每个省有多个市,每个市又有多个区,每个区又有多个街道。显示出来就是:
国家 -> 省 -> 市 -> 区
这样一来,国家和省,一对多,省对市,一对多。对于 1:N 的关系,通常我们会将【1】这一方称之为父或者主,将【N】一方称之为子或者从。
至此,我们已经了解到概要中提到的数据表,其中有两个主从关系,即 公司:员工,类型:商品。
报表模板中的主从关系
介绍完数据中的主从关系之后,我们现在再看下面这个报表的图片,我们可以看到 A 列绑定的是 “公司” 字段, C 列绑定的是 “员工” 字段。同时,A 列会将相同的数据合并成为一个单元格。
基于上一篇文章《还在担心报表不好做?不用怕,试试这个方法》(二)讲到的数据绑定,我们做一个如下的模板。
生成的结果为:
但是会发现这与期望的结果不同,A 列的数据虽然仅出现了一次,但是 A 列与 C 列数据间的关系丢失了,从行的角度看,数据是错误的。
因此为了适应数据内部的主从关系,我们可以使用Context 属性来实现,下面来介绍一下:
Context 属性
Context的概念是可以为一个单元格指定一个主单元格。Context 的简写是【C】,将模板改写如下图所示:
这样生成的结果如下所示:
可以看到,Context 属性为 A 列和 C 列构建了一种主从关系。在生成报表时,其遵循如下原则:
- 先扩展主单元格,后扩展从单元格。
- 主单元格扩展的时候,需要复制从单元格,并调整主从关系。
- 从单元格获取数据的时候要受主单元格的约束,扩展的时候要考虑调整主单元格的位置和大小。
隐式主从关系
在报表中,数据的主从关系非常普遍。因此,在数据绑定后,需要为单元格指定主从关系的情况会很多。因此为了使得模板看起来更简洁,易读。我们需要实现隐式主从关系的设计,也就是说当两个单元格左右相邻时,这两个单元格会自动产生主从关系,且左边为主,右边为从。比如我们对模板进行如下修改时:
就会生成如下报表:
Range 属性
前面介绍了Context 属性和隐式主从关系,这两个都是在主从单元格的角度指定主单元格。但是在某些场合,还是需要我们手工设置 Context,例如:
- 空单元格或常量单元格,由于本身没有数据,不能扩展,不能隐式的成为其它单元格的主单元格。
- 函数都是汇总函数,不具有扩展能力,也不能隐式成为其它单元格的主单元格。
这一步可以使用 Range 属性来解决这个问题。观察下面这个模板,除了总销量单元格,其它单元格都得显示设置 Context,因为它们左边的单元格用的函数,不具有扩展性,所以没有默认的主单元格。
通过使用 Range 属性,则仅通过一个单元格来制定主从关系,模板修改后如下:
Range 属性设置单元格时有以下规则:
- Range 的优先级是最低的,当有主从关系冲突时,Context 或者隐式主从关系优先级更高。
- 扩展方向相同的 Range 属性扩展,可以嵌套,但不能出现交叉。当出现多个 Range 作用于同一个单元格时,即嵌套的情况,单元格将受到最内部的 Range 属性影响。
- 不同扩展方向的 Range 则允许交叉,且能解决交叉报表的问题。
这样根据上面的规则,我们就可以使用 Range 简化模板,如下例子:
通过为 A3 和 D1 设置 Range 属性,就可以轻松的给 B3,C3,D3,E3 指定了主单元格。
总结
本章主要对模板语言中数据和单元格之间主从关系进行讲解,本章的主要内容如下:
- 数据中的主从关系
- 报表模板中的主从关系
- Context 属性
- 隐式主从关系
- Range 属性
下一期,小编将为大家介绍数据展开等其他设置是如何在模板中使用的。
扩展链接:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。