1.1 扩展函数
1.1.1 扩展的概念
报表工具与电子表格工具的最基本差异就是支持数据扩展。电子表格工具只能在每个单元格中填好需要的内容,并不能根据数据进行自动扩展。
以一个典型单行扩展的网格报表为例:
可以看到运行结果为:
我们可以看到,在excel设计的第五行(R5),数据集p1中的数据,通过select()函数进行纵向单行扩展,将一行扩展为四行。
但有时我们的一条数据可能并不全在一行显示,如下图显示,一条数据需要显示在多行上,这种类型的报表我们称之为卡片报表。
如何才能简单灵活的指定报表的扩展方式?x5报表工具通过excel中的合并行的概念解决了这个问题。
在卡片报表的设计时,将4-8行进行合并,这样报表工具会自动把4-8行当成一行进行处理,扩展将以这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 显示序列,根据条件转换显示值,与条件序列配合使用,且个数必须与条件序列相同。
- 返回值
一组数据集合,数据由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单元格,但最后运算结果并不相同,原因就是它们的运算区域不同。
图 2.7 分组报表运行结果图
报表工具会根据运算函数所在的行自动匹配一个运算区域,我们可以通过报表设计时的缓存文件看到。
在缓存文件中,可以看到结构化的报表定义,摘录有关运算合计的单元格如下:
<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属性(批注)来实现。
我们通过一个主从报表来说明设置运算区域的作用,如下图:
上图所示序号是分别按照每个子表数据条数进行计算的,如果我们需要按照全部数据计算的话,可以在设计报表时为计算单元格添加v-group属性(批注),设置属性值为$ALL。
1.2.7 表达式
x5报表工具提供了加减乘除四种表达式。
加法符号——“+” 减法符号——“-”
乘法符号——“*” 除法呼号——“div”
我们先来看一个乘法的例子:
如图,在G5单元格将单价与库存数量做乘法计算每个产品的库存成本。
运行结果如下:
可以看到扩展后,报表工具将每行的单价都乘以库存数量得到成本值。
再通过一个占比的例子来说明表达式的用法:
图 2.13 占比运算报表设计图
如图,在D4和G4单元格,我们将产品数量与总数量进行了除法,得到的就是每个产品数据占总数量的比重。
通过上面两个例子可以发现,在写表达式时,不仅可以通过数据关系(列名)进行计算,也可以通过指定单元格来完成。
1.3 属性(批注)
x5报表工具中属性的设置是通过excel的批注方式来实现的。
我们将属性划分为四大类:全局属性、行属性、列属性、单元格属性。
详细的属性列表可参考6.1节。
1.3.1 全局属性
作用在整个报表上的属性称之为全局属性。全局属性需要在报表设计时的第一行第一列单元格设置。
我们以auto-height(自动列高)属性为例,如果报表单元格中的内容过多时,可能会造成下图这种情况:
遇到这种情况我们需要设置全局属性auto-height:true,代表报表的行高度根据内容自适应。在报表设计工具中设置auto-height属性后,属性值会生成在excel的第一行一列的单元格上。
再看一下这个页面的运行效果就可以发现,单元格的高度根据内容高度自动撑开了。
1.3.2 行属性
作用在报表一行上的属性称之为行属性。行属性需要设置在作用行的第一列上。
当我们需要隐藏报表上的一行时,可以使用行属性v-visible,如下图,当在第四行的第一列设置了v-visible:false后,在运行时第四行整行都会被隐藏。
1.3.3 列属性
作用在报表每列上的属性称之为列属性。列属性需要设置在作用列的第一行上。
当我们需要隐藏报表上的一列时,可以使用列属性h-visible,如下图,当在F行的第一列设置了h-visible:false后,在运行时F列整列都会被隐藏。
1.3.4 格属性
只作用在报表单元格上的属性称之为格属性。
在2.2.6节我们使用的v-group就是一个格属性,这里不在赘述格属性的设置方法
1.4 显示
1.4.1 显示格式、边框、对齐、字体
x5报表工具对于报表显示格式的设置,都是基于excel上的单元格格式而来。也就是说,在excel中定义的格式,最终会作为报表运行时的格式显示。
除了单元格格式外,报表工具也读取了excel的页面设置作为报表的默认打印设置。
1.4.2 显示扩展
如图所示的交叉报表,是一个具有横向扩展的报表,如果我们按照这样进行报表设计的话:
运行结果就会这样,标题会按照数据进行横向扩展,这不是我们需要的。
因此我们就需要使用到显示扩展功能,如下图所示。colspan是列合并属性,$ALL.PR4C3表示按照第四行第三列定义的扩展函数的所有数据进行扩展,并在最后扩展结果上加上1列(指B列)。
通过在B2列添加colspan属性,使得标题可以按照函数扩展的列进行自适应居中,运行效果如下:
1.5 组件
UI层与报表相关的组件包括:数据组件(reportData)、报表组件(report)、图表组件(chart)、报表工具栏组件(printBar和exportBar)。
1.5.1 数据组件
数据组件(reportData),为报表组件和图表组件提供数据支持。每一个报表或图表组件都可以对应一个或多个数据组件。
数据组件含有三个属性:
id:组件的唯一标识,报表或图表中引用数据时都以该标识为准。
source:数据来源,定义为action和ksqlAction。
1.5.2 报表组件
报表组件(report),报表样式的展现组件。含有下列属性:
id:组件唯一标识。
report-name:报表名称,导出文件采用该名称保存。
src:报表定义excel的路径。
data-list:报表引用数据集,对应数据组件(reportData)的id(非必填项)。
auto-load:报表是否在页面打开时自动加载。
Excel报表设计:
如果指定了src中的excel设计文件,则可以通过鼠标右键点击report组件选择 “切换到报表设计”进入excel报表设计界面。
图 2.28 report切换到报表设计示例图
excel报表设计模式中的属性列表:
全局属性:作用到报表整体的参数,以批注方式定义到excel第一行第一列单元格内。
行属性:作用到报表单独一行,以批注方式定义到指定行第一列单元格内。
列属性:作用到报表单独一列,以批注方式定义到指定列第一行单元格内。
格属性:以批注方式定义到指定单元格中。
(具体属性作用请参考第6章附录)
1.5.3 图表组件
图表组件(chart),图表样式的展现组件。
id:组件唯一标识。
chart-name:图表名称,导出文件采用该名称保存。
data-list:图表引用数据集,对应数据组件(reportData)的id。
auto-load:图表是否在页面打开时自动加载。
chart组件为图表容器,需要通过鼠标右键点击chart组件后选择“添加子图表”,实现具体图表设计。
图 2.31 chart组件结构图
子图表设计:
data属性:图表数据来源。
config属性:图表样式配置。
图表样式参数分两种,公共参数与私有参数。公共参数指所有图表类型中共有的样式,如标题。私有参数值每个图表各自的样式。详情参考6.3、6.4节。
1.5.4 报表工具栏组件
报表工具栏组件提供报表图表的打印、预览、导出功能,包含两个组件:printBar、exportBar。
图 2.34 printBar、exportBar组件属性示例图
id:组件唯一标识。
report:关联的报表或图表组件标识(id)。
printBar和exportBar可以在结构树中,通过右键设置项,对工具栏中的按钮进行显示调整。
1.6 服务器配置
1.6.1 服务器映射
从第1章中的介绍中,可以知道报表工具包含报表设计工具(UI)与报表服务器(ReportServer)两部分,同时报表服务器(ReportServer)还需要从业务服务器(BusinessServer)获取数据,这样就形成了如下链接关系。
图 2.36 示例图
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
评一波