1.1  扩展函数

1.1.1   扩展的概念

报表工具与电子表格工具的最基本差异就是支持数据扩展。电子表格工具只能在每个单元格中填好需要的内容,并不能根据数据进行自动扩展。

以一个典型单行扩展的网格报表为例:

27

可以看到运行结果为:

28

我们可以看到,在excel设计的第五行(R5),数据集p1中的数据,通过select()函数进行纵向单行扩展,将一行扩展为四行。

但有时我们的一条数据可能并不全在一行显示,如下图显示,一条数据需要显示在多行上,这种类型的报表我们称之为卡片报表。

29图 2.3  卡片报表运行结果图

如何才能简单灵活的指定报表的扩展方式?x5报表工具通过excel中的合并行的概念解决了这个问题。

30图 2.4  卡片报表设计图

在卡片报表的设计时,将4-8行进行合并,这样报表工具会自动把4-8行当成一行进行处理,扩展将以这5行为一个单位进行。

如果我们这里不进行合并行的处理,会出现什么情况?

31图 2.5  卡片报表运行结果图

可以看到报表工具就会按照单行扩展的原理进行处理,这是错误的。

以上两个例子分别展现了单行与多行两种扩展方式,但它们表达的概念其实是一样的。即是报表工具有别于表格工具的最基本区别——扩展。

当然除了常见的纵向扩展外,也可以进行横向扩展,控制它们的方式就是使用接下来介绍的扩展函数。

1.1.2    select()、selecth()函数

  • 函数说明

从数据集的当前行集中选取符合条件的记录。

select()表示纵向扩展,selecth()表示横向扩展。

  • 语法

datasetName.select(select_exp,filter_exp,sort_exp)

datasetName.selecth(select_exp,filter_exp,sort_exp)

  • 参数说明

select_exp  选择的关系、字段、列名

filter_exp  数据过滤表达式,如果不需数据过滤,则此参数可省略,仅用’’占位。

sort_exp   数据排序表达式。格式如field:RELATION;order:ascending;type:number。

field表示排序关系,order表示升(ascending)降(descending)序,type表示关系类型(text、number)。

  • 返回值

一组数据集合,数据由select_exp的运算结果决定。

  • 示例

ds1.select(ds1. RPRODUCTID)

从数据源ds1中选取RPRODUCTID字段列的所有值。

ds2.select(ds2.RORDERID,’ds2.RORDERID=ds1.RORDERID’)

从数据源ds2中选取RORDERID字段列的值,条件是ds2的RORDERID值必须等于ds1的RORDERID的值。

ds1.select(ds1.RPRODUCTID,”,’field:RUNITPRICE;order:ascending;type:number’)

从数据源ds1中选取RPRODUCTID字段列的所有值,并将结果按照RUNITPRICE的值进行升序排序。

1.1.3  group()、grouph()函数

  • 函数说明

从数据集中选取符合条件的记录,并按照指定关系(列)进行分组。

  • 语法

datasetName.group(select_exp,filter_exp,sort_exp,condition_exp,display_exp)

datasetName.grouph(select_exp,filter_exp,sort_exp,condition_exp,display_exp)

  • 参数说明

select_exp   选择的关系、字段、列名

filter_exp    数据过滤表达式,如果不需数据过滤,则此参数可省略,仅用’’占位。

sort_exp   数据排序表达式。格式如field:RELATION;order:ascending;type:number。

Field 表示排序关系,order表示升(ascending)降(descending)序,type表示关系类型(text、number)。

condition_exp  条件序列,根据条件转换显示值,与显示序列配合使用,且条件个数必须与显示序列相同。

display_exp   显示序列,根据条件转换显示值,与条件序列配合使用,且个数必须与条件序列相同。

32

  • 返回值

一组数据集合,数据由select_exp的运算结果决定。

  • 示例

ds1.group(ds1.RCATEGORYNAME)

把数据源ds1中的所有数据按照RCATEGORYNAME(产品类别)进行分组。

ds1.group(ds1. RCATEGORYNAME,’ RUNITPRICE>10 and RUNITPRICE<20 ‘)

把数据源ds1中的所有RUNITPRICE(单价)大于10并且小于20数据按照RCATEGORYNAME(产品类别)进行分组。

ds1.group(ds1. RCATEGORYNAME,”,’field:RUNITPRICE;order:ascending;type:number’)

把数据源ds1中的所有数据按照RCATEGORYNAME(产品类别)进行分组,并将结果按照RUNITPRICE的值进行升序排序。

ds1.group(ds1.RUNITPRICE_V ,”,”,’RUNITPRICE > 10, RUNITPRICE = 10, 10 > RUNITPRICE’, ‘大于10, 等于10, 小于10’)

把数据源ds1的数据按照RUNITPRICE > 10, RUNITPRICE = 10, 10 > RUNITPRICE的条件进行筛选,且将符合条件的数据分别显示为大于10, 等于10, 小于10。

1.2  运算函数

1.2.1  sum()函数

  • 函数说明

对扩展后的单元格数据进行求和。

  • 语法

sum(cell)

  • 参数说明

cell指定单元格

  • 返回值

实数类型的数据。

  • 示例

sum(A1)   求出A1单元格扩展后所有数据的和。

1.2.2    avg()函数

  • 函数说明

对扩展后的单元格数据求平均值。

  • 语法

avg(cell)

  • 参数说明

cell指定单元格

  • 返回值

实数类型的数据。

  • 示例

avg(A1)    求A1单元格扩展后所有数据的平均值。

1.2.3  max()函数

  • 函数说明

找出扩展后单元格数据中的最大值。

  • 语法

max(cell)

  • 参数说明

cell指定单元格

  • 返回值

实数类型的数据。

  • 示例

max(A1)   求出A1单元格扩展后所有数据的最大值。

1.2.4   min()函数

  • 函数说明

找出扩展后单元格数据中的最小值。

  • 语法

min(cell)

  • 参数说明

cell指定单元格

  • 返回值

实数类型的数据。

  • 示例

min(A1)    求出A1单元格扩展后所有数据的最小值。

1.2.5    count()函数

  • 函数说明

对扩展后的单元格数据量进行计算。

  • 语法

count(cell)

  • 参数说明

cell指定单元格

  • 返回值

实数类型的数据。

  • 示例

count(A1)   求出A1单元格扩展后所有数据总量。

1.2.6   运算区域的设置

以上介绍的五个运算函数都是作用在一个数据集合上的,这样就产生了运算区域的概念。根据不同的需求,运算区域不尽相同。接下来我们介绍如何才能灵活的指定运算函数的运算区域。

下面这个例子:

在分组报表设计中,需要计算两种合计。一个是第六行(R6)的供应商库存合计,一个是第七行(R7)的库存总合计。SUM中的cell参数指定的都是G5单元格,但最后运算结果并不相同,原因就是它们的运算区域不同。

33图 2.6  分组报表运行结果图

34

图 2.7  分组报表运行结果图

报表工具会根据运算函数所在的行自动匹配一个运算区域,我们可以通过报表设计时的缓存文件看到。

35

在缓存文件中,可以看到结构化的报表定义,摘录有关运算合计的单元格如下:

<rdl:table-cell id="R6C7" column="C7" type="Number" v-group="$PR5C2" h-group="$ALL" ref="sum($R5C7)">
	</rdl:table-cell>
	<rdl:table-cell id="R7C7" column="C7" type="Number" v-group="$ALL" h-group="$ALL" ref="sum($R5C7)">
	</rdl:table-cell>

id=”R6C7”代表报表设计时中第六行第七个单元格,正是计算供应商合计的单元格。相应的,id=”R7C7″代表计算总合计的单元格。可以发现,两个单元格中只有v-group属性是不同的,同时还有一个类似的h-group属性,这两个属性即指定了运算函数SUM的运算区域。

R6C7单元格的v-group属性为$PR5C2,这是由报表工具自动计算得出的,代表在纵向上以第五行第二列单元格扩展后的区域进行计算,其中P代表一个决定如何扩展的单元格通常其中含有扩展函数(我们称之为repeat),R代表行,C代表列。

那么如何设置运算函数的区间呢?可以通过设置v-group和h-group属性(批注)来实现。

我们通过一个主从报表来说明设置运算区域的作用,如下图:

36图 2.8  主从报表运行结果图

37图 2.9  主从报表设计图

上图所示序号是分别按照每个子表数据条数进行计算的,如果我们需要按照全部数据计算的话,可以在设计报表时为计算单元格添加v-group属性(批注),设置属性值为$ALL。

38图 2.10  主从报表运行结果图

1.2.7    表达式

x5报表工具提供了加减乘除四种表达式。

加法符号——“+” 减法符号——“-”

乘法符号——“*” 除法呼号——“div”

我们先来看一个乘法的例子:

39图 2.11  网格报表设计图

如图,在G5单元格将单价与库存数量做乘法计算每个产品的库存成本。

运行结果如下:

40图 2.12  网格报表运行结果图

可以看到扩展后,报表工具将每行的单价都乘以库存数量得到成本值。

再通过一个占比的例子来说明表达式的用法:

41

图 2.13  占比运算报表设计图

如图,在D4和G4单元格,我们将产品数量与总数量进行了除法,得到的就是每个产品数据占总数量的比重。

42图 2.14  占比运算报表运行结果图

通过上面两个例子可以发现,在写表达式时,不仅可以通过数据关系(列名)进行计算,也可以通过指定单元格来完成。

 1.3  属性(批注)

x5报表工具中属性的设置是通过excel的批注方式来实现的。

我们将属性划分为四大类:全局属性、行属性、列属性、单元格属性。

详细的属性列表可参考6.1节。

1.3.1  全局属性

作用在整个报表上的属性称之为全局属性。全局属性需要在报表设计时的第一行第一列单元格设置。

我们以auto-height(自动列高)属性为例,如果报表单元格中的内容过多时,可能会造成下图这种情况:

43图 2.15  卡片报表运行结果图

遇到这种情况我们需要设置全局属性auto-height:true,代表报表的行高度根据内容自适应。在报表设计工具中设置auto-height属性后,属性值会生成在excel的第一行一列的单元格上。

44图 2.16  全局属性示例图

再看一下这个页面的运行效果就可以发现,单元格的高度根据内容高度自动撑开了。

45图 2.17  应用属性后运行结果图

1.3.2  行属性

作用在报表一行上的属性称之为行属性。行属性需要设置在作用行的第一列上。

当我们需要隐藏报表上的一行时,可以使用行属性v-visible,如下图,当在第四行的第一列设置了v-visible:false后,在运行时第四行整行都会被隐藏。

46图 2.18  行属性示例图

1.3.3  列属性

作用在报表每列上的属性称之为列属性。列属性需要设置在作用列的第一行上。

当我们需要隐藏报表上的一列时,可以使用列属性h-visible,如下图,当在F行的第一列设置了h-visible:false后,在运行时F列整列都会被隐藏。

47图 2.19  列属性示例图

1.3.4  格属性

只作用在报表单元格上的属性称之为格属性。

在2.2.6节我们使用的v-group就是一个格属性,这里不在赘述格属性的设置方法

1.4  显示

1.4.1  显示格式、边框、对齐、字体

x5报表工具对于报表显示格式的设置,都是基于excel上的单元格格式而来。也就是说,在excel中定义的格式,最终会作为报表运行时的格式显示。

48图 2.20  excel单元格设置图

除了单元格格式外,报表工具也读取了excel的页面设置作为报表的默认打印设置。

49图 2.21  excel页面设置图

1.4.2   显示扩展

如图所示的交叉报表,是一个具有横向扩展的报表,如果我们按照这样进行报表设计的话:

50图 2.22  图 2.21  excel页面设置图

运行结果就会这样,标题会按照数据进行横向扩展,这不是我们需要的。

51图 2.23  交叉报表运行结果图

因此我们就需要使用到显示扩展功能,如下图所示。colspan是列合并属性,$ALL.PR4C3表示按照第四行第三列定义的扩展函数的所有数据进行扩展,并在最后扩展结果上加上1列(指B列)。

52图 2.24  显示扩展设计图

通过在B2列添加colspan属性,使得标题可以按照函数扩展的列进行自适应居中,运行效果如下:

53图 2.25  显示扩展运行结果图

1.5  组件

UI层与报表相关的组件包括:数据组件(reportData)、报表组件(report)、图表组件(chart)、报表工具栏组件(printBar和exportBar)。

1.5.1 数据组件

数据组件(reportData),为报表组件和图表组件提供数据支持。每一个报表或图表组件都可以对应一个或多个数据组件。

数据组件含有三个属性:

54图 2.26  reportData属性示例图

id:组件的唯一标识,报表或图表中引用数据时都以该标识为准。

source:数据来源,定义为action和ksqlAction。

1.5.2  报表组件

报表组件(report),报表样式的展现组件。含有下列属性:

55图 2.27  report组件属性示例图

id:组件唯一标识。

report-name:报表名称,导出文件采用该名称保存。

src:报表定义excel的路径。

data-list:报表引用数据集,对应数据组件(reportData)的id(非必填项)。

auto-load:报表是否在页面打开时自动加载。

Excel报表设计:

如果指定了src中的excel设计文件,则可以通过鼠标右键点击report组件选择 “切换到报表设计”进入excel报表设计界面。

56

图 2.28  report切换到报表设计示例图

excel报表设计模式中的属性列表:

全局属性:作用到报表整体的参数,以批注方式定义到excel第一行第一列单元格内。

行属性:作用到报表单独一行,以批注方式定义到指定行第一列单元格内。

列属性:作用到报表单独一列,以批注方式定义到指定列第一行单元格内。

格属性:以批注方式定义到指定单元格中。

(具体属性作用请参考第6章附录)

57图 2.29  报表属性设计示例图

1.5.3   图表组件

图表组件(chart),图表样式的展现组件。

58图 2.30  chart组件属性示例图

id:组件唯一标识。

chart-name:图表名称,导出文件采用该名称保存。

data-list:图表引用数据集,对应数据组件(reportData)的id。

auto-load:图表是否在页面打开时自动加载。

chart组件为图表容器,需要通过鼠标右键点击chart组件后选择“添加子图表”,实现具体图表设计。

59

图 2.31  chart组件结构图

子图表设计:

data属性:图表数据来源。

60

61图 2.32  data属性编辑器

config属性:图表样式配置。

图表样式参数分两种,公共参数与私有参数。公共参数指所有图表类型中共有的样式,如标题。私有参数值每个图表各自的样式。详情参考6.3、6.4节。

62图 2.33  config属性编辑器

1.5.4   报表工具栏组件

报表工具栏组件提供报表图表的打印、预览、导出功能,包含两个组件:printBar、exportBar。

63图 2.34  printBar、exportBar组件属性示例图

id:组件唯一标识。

report:关联的报表或图表组件标识(id)。

printBar和exportBar可以在结构树中,通过右键设置项,对工具栏中的按钮进行显示调整。

64图 2.35  printBar组件设置项示例图

1.6  服务器配置

1.6.1   服务器映射

从第1章中的介绍中,可以知道报表工具包含报表设计工具(UI)与报表服务器(ReportServer)两部分,同时报表服务器(ReportServer)还需要从业务服务器(BusinessServer)获取数据,这样就形成了如下链接关系。

65

图 2.36  示例图

66

 

1.6.2   服务器日志

报表服务器日志配置文件为:runtime\ReportServer\WEB-INF\justep.log.properties

如果需要更改报表服务器运行日志,可以将以下参数:

log4j.rootLogger=ERROR,CONSOLE,X5,HTML_FILE

修改为

log4j.rootLogger=DEBUG,CONSOLE,X5,HTML_FILE

本文由WeX5君整理,WeX5一款开源免费的html5开发工具H5 App开发就用WeX5!

阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443