开发指南

企业报表应用

系统提供企业报表应用,用于解析报表设计模型,运行报表。开发前,在租户内添加企业报表应用并进行服务注册。

报表组件

开发报表功能需要报表组件 reportUix,用于设计报表、展现报表。

属性

包括以下属性:

  • id:组件唯一标识
  • 显示名称:设计时组件显示的标识
  • 报表导出文件名称:报表名称,导出文件采用该名称保存
  • 报表类型:常规的报表均为静态报表
  • Excel 文件:报表定义 Excel 的路径
  • 数据源:报表引用数据集,对应数据组件的 id
  • 自动加载:报表是否在页面打开时自动加载
  • 默认行高:报表设计器中单元格的默认高度
  • 默认列宽:报表设计器中单元格的默认宽度

设置

增加报表工具栏可以在页面中生成打印和导出相关的操作按钮,如下:

进入报表设计会打开如下的报表设计页面:

报表设计页面分别提供了“设置单元格”,“保存报表文件”,“打开报表模板”和“切换静态(动态)报表”4个功能

  • 设置单元格:可以把当前正在设计的报表信息设置到 Excel 中
  • 保存报表文件:可以把当前报表的设计状态保存至服务器,便于运行预览或者下次打开再次编辑
  • 打开报表模板:可以使用组件包目录下的后缀为 .xlsx 的 Excel 文件作为模板替换至当前设计的报表中
  • 切换静态(动态)报表:可以把当前设计的报表切换设计类型

扩展函数

扩展的概念

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

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

img

可以看到运行结果为:

img

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

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

img

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

img

在卡片报表的设计时,将4-8行进行合并,这样报表工具会自动把4-8行当成一行进行处理,扩展将以这5行为一个单位进行。 如果我们这里不进行合并行的处理,会出现什么情况?

img

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

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

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

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:单价;order:ascending;type:number。 field 表示排序关系,order 表示升(ascending)降(descending)序,type 表示字段类型(text、number)。

  • 返回值

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

  • 示例

ds1.select(ds1.产品ID) 从数据源 ds1 中选取产品 ID 字段列的所有值。

ds2.select(ds2.订单ID,'ds2.订单ID=ds1.订单ID') 从数据源 ds2 中选取订单 ID 字段列的值,条件是 ds2 的订单 ID 值必须等于 ds1 的订单 ID 的值。

ds1.select(ds1.产品ID,'','field:单价;order:ascending;type:number') 从数据源 ds1 中选取产品 ID 字段列的所有值,并将结果按照单价的值进行升序排序。

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:单价;order:ascending;type:number。 field 表示排序关系,order 表示升(ascending)降(descending)序,type 表示字段类型(text、number)。 condition_exp 条件序列,根据条件转换显示值,与显示序列配合使用,且条件个数必须与显示序列相同。 display_exp 显示序列,根据条件转换显示值,与条件序列配合使用,且个数必须与条件序列相同。

  • 返回值

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

  • 示例

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

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

ds1.group(ds1.产品类别,'','field:单价;order:ascending;type:number') 把数据源 ds1 中的所有数据按照产品类别进行分组,并将结果按照单价的值进行升序排序。

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

运行函数

sum()函数

  • 函数说明

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

  • 语法

sum(cell)

  • 参数说明

cell 指定单元格

  • 返回值

实数类型的数据。

  • 示例

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

avg()函数

  • 函数说明

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

  • 语法

avg(cell)

  • 参数说明

cell 指定单元格

  • 返回值

实数类型的数据。

  • 示例

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

max()函数

  • 函数说明

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

  • 语法

max(cell)

  • 参数说明

cell指定单元格

  • 返回值

实数类型的数据。

  • 示例

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

min()函数

  • 函数说明

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

  • 语法

min(cell)

  • 参数说明

cell 指定单元格

  • 返回值

实数类型的数据。

  • 示例

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

count()函数

  • 函数说明

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

  • 语法

count(cell)

  • 参数说明

cell 指定单元格

  • 返回值

实数类型的数据。

  • 示例

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

运算区域的设置

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

下面这个例子:

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

分组报表设计图:

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

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

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

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

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

那么如何设置运算函数的区间呢?可以通过设置 v-group 和 h-group 属性(批注)来实现。 我们通过一个主从报表来说明设置运算区域的作用,如下图: 主从报表运行结果图:img

主从报表设计图:

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

表达式

报表工具提供了加减乘除四种表达式。 加法符号——“+” 减法符号——“-” 乘法符号——“*” 除法呼号——“div”

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

如图,在 I5 单元格将单价与库存数量做乘法计算每个产品的库存成本。 运行结果如下:

可以看到扩展后,报表工具将每行的单价都乘以库存数量得到成本值。 再通过一个占比的例子来说明表达式的用法:

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

属性(批注)

报表工具中属性的设置是通过 Excel 的批注方式来实现的。 我们将属性划分为四大类:全局属性、行属性、列属性、单元格属性。 详细的属性列表可参考《附录

全局属性

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

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

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

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

行属性

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

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

列属性

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

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

格属性

只作用在报表单元格上的属性称之为格属性。 在“运算区域的设置”中我们使用的 v-group 就是一个格属性,这里不在赘述格属性的设置方法。

显示

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

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

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

显示扩展

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

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

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

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

results matching ""

    No results matching ""