七、数据处理

1)回到报表设计界面,查看表格具体参数配置,当前所有字段默认聚合方式均为:分组;

聚合方式用途
列表(select)对数据不作处理完整展示
分组(group)将数据相同的作为一组进行展示
自定义分组对数据自定义条件并进行分组,比如reader_number大于1000
汇总(sum)针对数值型字段数据,统计该字段值相加的和,比如transfer_task记录中reader_number的和
统计数量(count)针对数值型字段数据,统计所有记录中记录的条数,比如139条transfer_task记录
最大值(max)针对数值型字段数据,展示当前记录中该字段值最大的那条记录
最小值(min)针对数值型字段数据,展示当前记录中该字段值最小的那条记录
平均值(avg)

针对数值型字段数据,展示当前记录中该字段的平均值

参数用途
数据集下拉列表,展示数据源处已添加的数据集
属性在选择数据集之后,下拉列表展示该数据集下所有属性字段
聚合方式聚合方式包括列表、分组、自定义、汇总、统计、最大值、最小值、平均值等,参考上面表格
排序方式针对数据集数据,可进行正序和倒序排列
数据展开方式向下、向右、不展示,可依据需要进行选择
行高可自行依据数据真实高度进行设置
换行计算开启,或关闭,默认关闭
格式化可针对数值型数据及日期型数据进行格式化,比如#.00(保留两位小数),yyyy/mm/dd(年月日)等
补充空白行打开,关闭,默认关闭,打开情况下将设置数据行倍数,当总行数不是数据行倍数时自动补充空白行
条件属性可配置条件项,对当前值/指定属性/表达式进行条件配置,符合条件的数据行/单元格可进行属性配置

7.1 新增列并求和

1)新增一列并统计读写总数量,鼠标右键【插入列(后)】,新增列count,并在E2单元格输入表达式sum(B2,C2),统计每行数据读写之和,最终合并第三行(必须合并),编辑属性输入表达式,sum(E2),统计所有记录的读写和;

2)预览报表数据,当读数量超过28的数据均已添加背景色,并且数据已加粗表示,最后列表新增count列,数据为每行记录读写之和,最后一行是合计数据,累计读写之和,通过在数据库中查询SQL验证数据正确;

7.2 数据过滤

1)回到报表设计界面,进行部分数据过滤,以reader_number字段为例,过滤掉读数目小于28条的记录(也就是保留reader_number>28的数据都保留),选择B2单元格,编辑右侧属性,点击【过滤条件】,新增一条

2)预览报表数据,列表仅展示读数目大于28的记录;

7.3 数据映射

1)回到报表设计界面,对部分数据进行映射,此处以status字段为例,将status=1的映射为成功,status=2的映射为异常,status=3的映射为运行中,status=4的映射为已终止;

选择D2单元格,右侧点击【数据映射】,点击【+】,添加映射;

2)预报报表数据,C2列数据成功被映射,如下图所示:

7.4 时间格式化

1)新增一个报表,还是以transfer_task为例;添加字段id、reader_number、write_number、create_date,当某一字段值是时间属性,需要对其进行格式化时,可配置格式化参数(格式化之前可先预览数据看看时间数据是什么样的),

支持yyyy/MM/dd、yyyy/MM、yyyy-MM、yyyy、yyyy-MM-dd HH:mm:ss、yyyy年MM月dd日:HH:mm:ss、yyyy-MM-dd、yyyy年MM月dd日;

2)设置完成,预览报表,将会自动将时间格式化为规定的格式。

7.5 单元极引用

在报表当中,大多数的计算都是针对单元格或与单元格有关,因为报表中单元格多数都与数据绑定,而数据往往又是多条,所以计算后的报表一个单元格会产生多个,这样对于单元格的引用就变的比较复杂。在UReport2中,引用的目标单元格是相对当前单元格来进行计算的,引用方法就是直接在表达式里书写单元格名称,比如引用A1单元格,就直接写A1即可 。

目标格获取原则
UReport2中单元格表达式在取目标格值时,优先考虑的是目标格是否与其位于同一行或列
如果是则取与其位于同一行或列的目标单元格,如果不是,则取与当前单元格有共同父格的所有目标单元格,如果他们有共同的上父格或共同的左父格,那么就取共同上父格与共同左格交集部分的目标单元格;如果他们没有共同的父格,那么就取迭代后所有的目标单元格。

 

多个值的输出
在UReport2中,如果取到值超过一个,输出时多个值间以“,”分隔,类似于:“1,2,3,4”这种。

针对无共同左父格和共同上父格的单元格,我们可以修改左父格及上父格以确保可以进行计算

更改父格实现单元格取值
在之前的视频教程中,在介绍报表计算模型时,我们多次利用更改当前单元格的上父格或左父格使得当前单元格与目标格处于某个特定的父格下,其原理就来自于此。

w3cschool教程上有很多具体的例子,可以参见:单元格引入

7.6单元格坐标

为了实现更为复杂的单元格引用,UReport2引用了单元格坐标的概念。单元格坐标,也是相对于当前单元格来进行计算的,同样遵循上面的介绍的优先取同行、同列或共同父格的原则,一个标准的单元格坐标格式如下:

单元格坐标格式
单元格名称[Li:li,Li-1:li-1,…;Ti:ti,Ti-1:ti-1…]{条件...}

L表示左父格,l表示左父格展示后的序号,序号为负值,表示向上位移;T表示上父格,t表示上父格展开后的序号,序号为负值,表示相对于当前单元格向上位移,正值则表示向下位移,如果只有左父格,那么直接写L部分即可;如果只是上父格,那么前面需要加上“;”号,然后写T部分,后面的大括号中是条件部分,多个条件之间用and/or连接,表示对通过坐标取到的单元格进行条件过滤(如果取到多个单元格的话),条件部分是可选的,相关示例如下:

单元格坐标示例说明
C1[A1:2,B1:1]在找C1时先找单元格A1展开后的第2格;再找第二个A1下的B1单元格展开后的第一个单元格,然后再找这个B1单元格对应的C1单元格
C2[A1:2,B1:2;C1:3]在找C2时,先找A1单元格展开后的第二格,再找第二个A1单元格下B2单元格展开后的第二格,再根据第二个展开的B2单元格找其下名为C2单元格的左子格;然后再找到C1单元格展开后的第三格,再看其下的C2单元格,取C2单元格的交集
C2[A1:2,B2:2]{C2>1000}表示取A2单元格展开后的第二格,再取其下B2单元格展开后第二格,再取B2下所有的C2单元格,最后再对取到的C2单元格进行条件过滤,只取出C2单元格值大于1000的所有C2单元格。
C2[A1:2,B2:2]{C2>1000 and C2<10000}表示取A2单元格展开后的第二格,再取其下B2单元格展开后第二格,再取B2下所有的C2单元格,最后再对取到的C2单元格进行条件过滤,只取出C2单元格值大于1000且小于10000的所有C2单元格的值。
引用所有单元格
如果我们需要引用所有单元格时,那么只需要在单元格名称后跟”[]“即可,如A1[],表达引用所有A1单元格,而不管当前引用格所在位置,同时在引用所有单元格时,还可以后跟条件,以对引用格做进一步条件限制,如A1[]{@>1000 and @<10000},表示要引用所有的A1单元格,但要求引用的A1单元格值要大于1000同时小于10000,这里的@符号是2.2.3及以后版本新增加的一个表达式符号,专门用于取条件循环中当前循环对象。
关于$B2
在UReport2当中,在单元格名称前加$符号,表示取相对于目标单元格的单元格的值,多用在条件比较当中,比如上面的C2[A2:-1]{B2==$B2},这里的$B2就是指取到的C2单元格对应的B2单元格的值。

 

关于&标记的使用
在使用“&单元格名称”来标记目标单元格展开后的序号时,除上需要注意上面描述的内容外,还需要注意,取序号将以他们共同的父格为基准,如果他们有共同的父格,那么将以这个父格里目标单元格的数量来进行序号编排,这在之前视频教程介绍报表计算模型中,实现明细型主从报表,对从表数据进行编号时就有体现

具体使用可参见:单元极坐标

7.7 count函数

count函数是对给定的表达式在计算后对象数量进行统计。

示例说明
count(B2,C2)统计相对当前所在单元格,目标B2单元格以及C2单元格加在一起的数量
count(B2)统计相对当前所在单元格,目标B2单元格数量
count(B2{reader_number>20},C2{write_number>28})统计相对当前所在单元格,目标B2单元格绑定对象的reader_number属性大于20的B2单元格以及C2单元格绑定对象的write_number属性大于28的单元格数量
count(C2{write_number>20})统计相对当前所在单元格,目标C2单元格绑定对象的write_number属性大于20的C2单元格数量

预览报表:

7.8 sum函数

sum函数是对给定的表达式在计算后值进行累加,sum函数要求各个表达式计算后的值必须是数字,否则将产生错误。

示例说明
sum(B2)相对当前单元格,取到所有B2单元格值进行累加
sum(C2{write_number>28})相对当前单元格,取到所有绑定对象属性write_number大于28的C2单元格值进行累加
sum(B2,C2)相对当前单元格,取到所有B2和C2单元格的值进行累加
sum(B2{reader_number>28},C2{write_number>28})相对当前单元格,取到所有绑定对象属性reader_number大于28的B2单元格值以及绑定对象属性write_number大于28的C2单元格的值进行累加

 

预览报表数据:

7.9 avg函数

avg函数是对给定的表达式在计算后值求平均值,avg函数要求各个表达式计算后的值必须是数字,否则将产生错误,求平均数比较简单,此处不进行过多介绍,可参见函数

示例说明
avg(B2)相对当前单元格,求B2单元格的平均值
avg(C2{write_number>28})相对当前单元格,取到绑定对象属性write_number大于28的C2单元格值的平均值
avg(B2,C2)相对当前单元格,求B2和C2单元格的平均值
avg(B2{reader_number>28},C2{write_number>28})相对当前单元格,取到所有绑定对象属性reader_number大于28的B2单元格值以及绑定对象属性write_number大于28的C2单元格的值进行求平均值

 

 

7.10 max函数

max函数是对给定的表达式在计算后值求其中的最大值,max函数要求各个表达式计算后的值必须是数字,否则将产生错误。

示例说明
max(B2)相对当前单元格,求B2单元格的最大值
max(C2{age>28})相对当前单元格,取到绑定对象属性age大于28的C2单元格值的最大值
max(B2,C2)相对当前单元格,求B2和C2单元格的最大值
max(B2{reader_number>28},C2{write_number>28})相对当前单元格,取到所有绑定对象属性reader_number大于28的B2单元格值以及绑定对象属性write_number大于28的C2单元格的值进行求最大值

7.11min函数

min函数是对给定的表达式在计算后值求其中的最小值,min函数要求各个表达式计算后的值必须是数字,否则将产生错误。

示例说明
min(B2)相对当前单元格,求B2单元格的最小值
min(C2{age>28})相对当前单元格,取到绑定对象属性age大于28的B2单元格值的最小值
min(B2,C2)相对当前单元格,求B2和C2单元格的最小值
min(B2{reader_number>28},C2{write_number>28})相对当前单元格,取到所有绑定对象属性reader_number大于28的B2单元格值以及绑定对象属性write_number大于28的C2单元格的值进行求最小值

7.12 row函数(取行号)

取当前单元格所在行的行号,这个函数比较简单,它没有参数。

示例说明
row()取当前单元格所在行的行号

 

7.13 column函数(取列号)

取当前单元格所在列的列号,这个函数比较简单,它没有参数。

示例说明
column()取当前单元格所在列的列号

7.14 order函数(排序)

order函数需要两个参数,第一个为要进行排序的对象表达式,第二个是一个布尔值,用来设置排序方式,true正序,false为倒序。

示例说明
order(C2,false)相对当前单元格,取到所有C2单元格值,对这些值进行倒序排序,返回排序好的结果集合
order(C2{write_number>28},true)相对当前单元格,取到与C2单元格绑定的对象属性write_number值大于28的所有C2单元格值,对这些值进行正序排序,返回排序好的结果集合

7.15 list函数(罗列数据)

取到表达式中定义所有数据,并以集合形式返回。

示例说明
list(C2)相对当前单元格,取到所有C2单元格值以集合形式返回
list(B2,C2{write_number>28})相对当前单元格,取到所有B2单元格值及C2单元格中write_number属性大于28的所有C2单元格值以集合形式返回

如图:

预览报表数据:

7.16 param函数

可参考【添加数据集】章节的表达式模式SQL。

param函数用来获取外部传入的参数,它需要一个参数,用于指定要获取的参数名称。

示例说明
param("job_type")获取外部传入的名为job_type的参数值
param(C2)

相对于当前单元格,取到C2单元格的值,如果有多个C2单元格则么第一个,然后以这个C2单元格值作为参数名称,获取外部对应的参数值。

${
    if(param("job_type")=='' || param("job_type")== null){
        return   "select * from transfer_task"
    }else{
        return   "select * from transfer_task where job_type=:job_type"
    }
}

7.17 formatdate函数(格式化日期)

参考【数据处理】》【时间格式化】章节。

对给定的日期参数进行格式化,它至少需要一个参数,第一个参数是要格式化的日期类型的对象,第二个参数是可选的,用于定义格式化采用的模式,如不指定则用默认的:yyyy-MM-dd HH:mm:ss来进行格式化。

示例说明
formatdate(D2)取到D2单元格值,这个值必须是日期类型,然后按yyyy-MM-dd HH:mm:ss来进行格式化成字符串输出
formatdate(D2,"yyyyMMdd")取到D2单元格值,这个值必须是日期类型,然后按yyyyMMdd来进行格式化成字符串输出

7.18 formatnumber函数(格式化数字)

	对给定的参数进行格式化,它至少需要一个参数,第一个参数是要格式化的数字对象,要保证这个参数值取到后可以转换成日期,否则将发生错误;第二个参数是可选的,用于定义数字格式化采用的模式,如不定义,则采用默认的#来进行格式化。
示例说明
formatnumber(B2)取到B2单元格值,这个值必须可以转换成数字,然后按#来进行格式化成字符串输出
formatnumber(B2,"#,###.00")取到B2单元格值,这个值必须可以转换成数字,然后按#,###.00来进行格式化成字符串输出

支持格式化格式包括:#.##、#.00 、 ##.##% 、 ##,##.##、 ##0.0E0、 ¥##,###.##、 $##,###.##

7.19 非常用函数

分页函数:

所谓分页相关函数,是指这些函数是在分页的时候进行计算,比如计算当前页有多少条记录、当前页某个单元格值累加后是多少、平均值是多少、最大值是多少等等。

分页相关函数使用
一般来说,分页相关函数多用在行类型为“重复表头”或“重复表尾”的行中的单元格里。
同时,需要注意的是,分页相关函数只会在分页预览时显示,这点需要注意。

pcount函数、psum函数、pmax函数、pmin函数、page函数、pages函数等

pages函数的使用范围
pages函数目前仅能在页眉页脚中使用

数学函数:

abs函数(求绝对值)、ceil函数(最小值)、floor函数(最大值)、chn函数(数字转中文)、rmb函数(数字转换为大写的人民币金额)、cos函数(余弦)、sin函数(正弦)、tan函数(正切)、exp函数(方法用于返回自然数底数e的参数次方)、log10函数(返回以10为底的对数值)、log函数(自然对数)、median函数(中位数)、mode函数(众数)、vara函数(方差)、stdevp函数(标准差)、pow函数(返回第一个参数的第二个参数次方)、random函数(随机数)、round函数(四舍五入)、sqrt函数(平方根)

chn函数使用注意事项
chn函数转换数字即可是整数,也可是小数,如果是小数支持后面最多两位小数,如果实际小数过多,chn函数会先进行四舍五入,然后再进行转换。
rmb函数使用注意事项
rmb函数转换数字即可是整数,也可是小数,如果是小数支持后面最多两位小数,如果实际小数过多,rmb函数会先进行四舍五入,然后再进行转换。

日期函数:

date函数(日期)、day函数(天)、month函数(月)、week函数(星期)、year函数(年)

字符串函数:

indexOf函数(位置)、length函数(长度)、lower函数(转小写)、upper函数(转大写)、replace函数(替换字符串)、substring函数(子字符串)、trim函数(去空格)、json函数(解析JSON字符串)

对JSON字符串的要求
json函数在解析JSON字符串时,要求必须是标准的JSON字符串,比如下面这样的:
{"name":"superman","age":32,"company":{"name":"bstek","address":"SHANGHAI CHINA"}}
也就是key属性也需要用“”包裹的,如果是下面这种类型的JSON字符串就解析时就会产生错误:
{name:"superman",age:32,company:{name:"bstek",address:"SHANGHAI CHINA"}}

 

 

 

 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐