第1章 概述

在实际应用中,经常需要制作分组报表。在前台查看时,如果能够支持前台按组动态展开收起组内的数据,查看报表会方便很多。

第2章 折叠报表实现方法

2.1 数据形式

目前了解到的数据形式多样,大体分为下列几类:

一列编码数据,一列地区数据

1

2

有节点ID和父节点ID的数据

3

多个数据字段分别代表每个级别

4

2.2 制作步骤

首先以一列编码数据,一列地区数据为例,做一个折叠报表,首先数据如下

2

创建一个报表,共两行,一行放表头,一行放数据

5

其中A2格如下

5

值是=groupbytree(0,'ds1','编码'),这代表以ds1的编码数据列按照树形结构排布分组;

标题是=get('ds1','部门'),这代表根据编码获取相应的部门名称并作为标题显示;

下面的树形折叠为是,是说明这个格子会在浏览器展现时以树形折叠的方式动态展开与收起。

节点ID和节点父ID是为了确认每个节点的层级关系。因为A2本身的值就是编码,所以A2的节点ID就是自己本身的值:cellvalue(),父ID这里可以用一个公式去计算:GetTreeParentId(cellvalue(),list(1,1,3)),从数据上可以看出来,数据的id是113分组的,所以对于任意一个id,是能够计算出他的父ID的,这个公式的第一个参数就是需要计算父ID的字符串,第二个是分组的规则,这个数据中是113分组的,所以后面需要写一个集合:list(1,1,3)。这样就能获取到该ID的父ID

B2格就是简单的获取人数就可以。

5

需要注意的是,折叠报表是不能分页的,所以最好在导出设置中将显示行数设置为-1

页面预览如下

5

下面继续介绍数据形式如下图的做法

1

其实这种数据和第一种没有太大区别,只是编码上位数是相同的,只是在计算父ID时有所区别,可以看到,这个编码是2位一个组织,其中当后几位都是0时就是父节点的ID。这里使用公式=GetTreeParentId(cellvalue(),2,'0'),这里代表计算cellvalue的父ID,且每两位是一组,位数用0补齐。

5

页面预览效果如下

5

下面介绍第三种情况,有节点ID和节点父ID的情况,数据如下

5

这里区别主要在于GroupByTree公式的用法,示例报表如下

5

A1单元格的公式如下

5

这里简单讲解一下GroupByTree公式,公式的第一个参数表示类型,如果只有一列编码的情况,类型就是0,如果是有ID和父ID这种情况,类型就是1,0的情况下,后续参数就是数据集和字段,1的情况下,后续参数是数据集、ID字段、父ID字段。所以这里的公式为groupbytree(1, 'ds2', 'id','pid'),即取ds2中的id为节点ID,pid为父ID。报表预览如下

5

下面介绍多个数据字段分别代表每个级别这种数据形式的做法,数据如下

5

首先需要把报表设计成树形结构的样子,如下图所示

5

前两列是为了把数据排布成纵向分组的形式,其中C2单元格代表省,C3单元格代表市,C4单元格代表区,后面是跟着他们各自结构的数据加和

其中C2、C3、C4单元格的树形折叠选项都要选择是,然后C2代表省,所以C2没有父节点,而其节点ID就是本身的值

5

C3代表市,所以其父节点是省,也就是C2,即A2,节点ID还是本身的值

5

C4代表区,同理,其节点ID是本身,父节点ID是市,也就是B3

5

预览如下

5

可以看到,如果是上述的数据形式,节点的名称是不能重复的,如果遇到名称重复的怎么办呢,可以在sql中将所有机构连接起来作为一个字段,中间使用某种字符隔开,比如‘-’,这样就变成了一列编码的形式,如下图所示

5

然后采用第一种方式去做报表,区别在于GetTreeParentId公式,此时应写成GetTreeParentId(cellvalue(),'-'),即获取当前单元格值的父ID,以-作为连接,这样就可以做出想要的报表了。

2.2 全部展开和全部收起

报表提供了两个js方法来实现点击展开全部节点和收起全部节点,全部展开如下图所示

5

全部收起如下

5

results matching ""

    No results matching ""

    results matching ""

      No results matching ""