一、报表简介
UReport2是一款基于架构在Spring之上纯Java的高性能报表引擎,通过迭代单元格可以实现任意复杂的中国式报表。 在UReport2中,提供了全新的基于网页的报表设计器,可以在Chrome、Firefox 等各种主流浏览器运行 (不支持IE)。 使用UReport2,打开浏览器即可完成各种复杂报表的设计制作。
二、主体功能
-
UReport2支持创建数据源、添加数据集,并对数据集进行函数、表达式处理;(参考【数据处理】)
-
UReport2支持对数据集形成可视化报表,包括饼状图、柱状图、曲线图等等(参考【图表展示】)
三、优缺点阐述
优点:
(1)开源、免费,集成即可使用;
(2)轻量级、易集成,工程中添加依赖即可进行集成使用;
(3)支持多函数处理,包括常用函数(sum、count、max、min、avg)、数学函数、字符串函数、日期函数等等;
(4)支持多种图表展示,包括饼状图、柱状图、曲线图、圆环图、雷达图、散点图等等;
缺点:
(1)工程在使用过程中经常出现空指针或者其他报错;
(2)UReport2部分功能不可用,包括导出及多条件表达式SQL查询等;
(3)支持数据源类型少,当前支持:mysql、SQLserver、oracle、db2等
四、集成及配置
UReport2的设计器是基于网页的,配置好一个项目,也就完成了报表设计器的安装。因为 UReport2是一款纯Java的报表引擎,所以它支持现在流行的所有类型J2EE项目,下面将具体介绍基于maven的SpringBoot工程如何集成UReport2 ,并基于当前工程进行一系列的数据处理及报表展示。
4.1 创建springboot工程
1、如果当前本地无springboot工程,提供下载地址:https://github.com/niceyoo/springboot-demo
2、基于已下载的springBoot工程,修改index.html文件内的外部js文件路径,将../修改为../../(原始路径不正确);
4.2 添加依赖
1、在springBoot工程的pom文件dependencies中添加依赖;
<dependency>
<groupId>com.bstek.ureport</groupId>
<artifactId>ureport2-console</artifactId>
<version>2.3.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.bstek.ureport</groupId>
<artifactId>ureport2-core</artifactId>
<version>2.3.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
2、在springBoot工程的pom文件添加repositories;
<repositories>
<repository>
<id>snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
</repositories>
3、基于当前工程,创建webapp/WEB-INF目录,工程【main】目录右键【Directory】》输入【webapp】,基于webapp,继续新建directory》【WEB-INF】;
4.3 创建web.xml文件并配置
1、基于已新建【webapp】》【WEB-INF】目录,添加web.xml文件,点击【file】》【Project Structure】》【Facets】》【web】,新增web.xml文件及web resources directory;
说明:
E:\company\idea\IdeaProjects\springboot-demo-master\src\main:为当前我工程的路径
E:\company\idea\IdeaProjects\springboot-demo-master\src\main\webapp\WEB-INF\web.xml(第5步)
E:\company\idea\IdeaProjects\springboot-demo-master\src\main\webapp (第7步)
2、基于步骤6新增的web.xml文件,添加listener及context-param、servlet、servlet-mapping;
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:ureport-console-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>ureportServlet</servlet-name>
<servlet-class>com.bstek.ureport.console.UReportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ureportServlet</servlet-name>
<url-pattern>/ureport/*</url-pattern>
</servlet-mapping>
4.4 创建UreportConfig 文件
1、基于工程启动文件的父节点,创建子文件夹ureport》config,并创建UreportConfig 文件;
package com.song.configuration.ureport.config;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import com.bstek.ureport.console.UReportServlet;
/**
* Ureport2 配置类
* @author qiaolin
* @version 2018年5月9日
*/
@ImportResource("classpath:ureport-console-context.xml")
@EnableAutoConfiguration
@Configuration
@ComponentScan(basePackages = "com.song.configuration")
public class UreportConfig {
@Bean
public ServletRegistrationBean buildUreportServlet(){
return new ServletRegistrationBean(new UReportServlet(), "/ureport/*");
}
}
2、在配置途中,当缺少包时,需要根据提示自行添加、下载依赖,配置完成,点击resources目录,修改application.properties文件中关于mysql的配置,换成可用库(因为当前springboot工程是以一张user表为例的,所以当前连接的数据库中需要包含user表,囊括id、name、password字段),工程启动的端口号,默认是8080,此处已修改为18090;
#server
server.port=18090
server.tomcat.uri-encoding=utf-8
#MySQL(当前仅为示例)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jeesite?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
4.5 启动工程
1、当上述均配置完成,进入到启动文件Entry,右键点击【Run Entry】启动工程;
4.6 访问工程
工程成功启动,访问地址为: http://localhost:18090/ureport/designer
五、报表基础配置
5.1 工具栏
1)顶栏:针对报表:报表预览、保存报表、打开报表、导入excel、报表配置、查询表单设计器;
针对单元格:重做(下一步)、撤销(上一步)、合并/拆分单元格、上下对齐、表格有无边框、斜线表头;
针对数据:字体样式、字体大小、是否加粗、斜体、下划线、背景色、字体颜色、图片、二维码、图表
图片:
选择左侧单元格,在右侧对应属性区域,输入图片路径,默认支持以classpath:开头位于classpath下的图片文件,或以/开头位于WEB应用根目录下或某目录下的图片文件;
比如"/WEB-INF/static/images/test.jpg"
2)左栏:单元格栏,可针对指定单元格进行单元格样式及数据的设置,鼠标右键可设置单元格;
标题行:
在报表计算后分页时只会出现在第一页第一行的行,如果定义了多个行为标题行类型,那么这些行将在报表运行后分页输出时第一页最前面插入标题行。需要注意的是,我们在报表中可以将位于任意位置的行定义成标题行,但报表计算分页输出时,总会将这些定义为标题行的行放在报表的第一页最前端显示;
重复表头:
与标题行不同的是,定义为重复表头行的行,在报表计算分页输出时会将定义成重复表头行的行放在每一页的前端进行显示。如果当前报表中定义的有标题行,那么对于第一页,标题前将位于最上面,其下才是重复表头行定义的行;
重复表尾:
与重复表头行类型,它也会在报表计算分页输出时放在每一页中显示,只是它会在每一页的最下端显示;
总结行:
与标题行对应,总结行会出现在报表计算后分页输出时最后一页的最下端显示。如果当前报表中定义了重复表尾行,那么在报表计算后分页输出的最后一页中总结后将位于重复表尾行下方显示。
3)右栏:单元格属性栏及数据源配置,可针对(2)中指定单元格,进行链接、类型(文本、表达式、数据集、图片、斜表头、二维码、条码、图表)、及对应类型下参数设置;
备注:
A、不同类型单元格,配置参数不一致,按界面要求输入参数即可;
B、链接:为单元格设置链接的后缀,比如URL配置为:/user/index,目标窗口:新窗口,那么在【预览报表】时,点击该单元格,将跳转到http://localhost:18090/user/index界面
5.2 报表存储
上述工程启动完成后,在springboot-demo-master\src\main\webapp\WEB-INF下自动生成了一个ureportfiles文件夹,用于存放报表文件,这个目录一般是默认的,当然也可以支持修改, 此处以默认路径进行介绍,如果需要修改,请自行参考报表存储目录配置。
设计界面,点击保存图标,试保存一个报表文件,如下图所示:
5.3 自定义报表存储器
UReport2默认提供的名为“服务器文件系统”的报表存储机制,
可查看源码 com.bstek.ureport.provider.report.ReportProvider :源码, 实现了ReportProvider接口后,只需要将实现类配置到Spring中,让其成为一个标准的Spring Bean,这样UReport2就会检测到它而将其加载。ureport2支持自定义报表存储器, 通过实现ReportProvider接口 开发一个新的报表存储器将报表文件存储到数据库、FTP等。
5.4 数据源配置
数据源配置是ureport2中的重点模块,因为后续数据处理、计算、报表展示都是基于数据源中的数据集进行操作的。
ureport2支持 三种类型的报表数据源: 直接连接数据库,Spring Bean以及通过实现com.bstek.ureport.definition.datasource.BuildinDatasource接口提供的内置数据源。
1、直连数据源:比较简单
实现方式:
1)在工程pom文件中添加驱动依赖(当前是这种)
2)在WEB-INF下建立lib文件夹,将驱动jar文件放置在lib中;
3)界面点击
说明:此处数据作为示例,具体以用户当前存在的数据库为准。
数据源名称:test
连接用户名:qingqing
连接密码:qingqing
驱动名称:com.mysql.jdbc.Driver
连接URL:jdbc:mysql://localhost:3306/mysql?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
2、Spring Bean数据源
可以选择Spring上下文中定义好的一个Bean来作为数据源 ,点击叶子 图标, 在弹出的窗口中输入数据源名称及要采用的Bean的ID (必须真实存在)即可,保存完成,即可基于当前数据源右键,添加数据集,输入 数据集名称、对应的方法名以及返回对象类型 ,具体可参考配置Spring Bean数据源
3、内置数据源:
这种类型的数据源,要示我们实现BuildinDatasource接口,同时将BuildinDatasource接口实现类配置到Spring即可;
1)BuildinDatasource源码:
package com.bstek.ureport.definition.datasource;
import java.sql.Connection;
/**
* @author Jacky.gao
* @since 2017年2月9日
*/
public interface BuildinDatasource {
/**
* @return 返回数据源名称
*/
String name();
/**
* @return 返回当前采用数据源的一个连接
*/
Connection getConnection();
}
2)BuildinDatasource接口实现类UreportDataSource:
package com.bstek.ureport.definition.datasource;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.bstek.ureport.definition.datasource.BuildinDatasource;
@Component
public class UreportDataSource implements BuildinDatasource {
private Logger log = LoggerFactory.getLogger(UreportDataSource.class);
private static final String NAME = "UreportDataSource";
@Autowired
private DataSource dataSource;
/**
* 数据源名称
*/
@Override
public String name() {
return NAME;
}
/**
* 获取连接
*/
@Override
public Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
log.error("Ureport数据源,获取连接失败!");
e.printStackTrace();
}
return null;
}
}
3)将实现类配置到spring(ureport-console-context.xml):
添加如下:
<bean id="ureport.UreportDataSource" class="com.bstek.ureport.definition.datasource.UreportDataSource"></bean>
4)报表 > 数据源界面,点击分享
图标,将出现UreportDataSource内置数据源,如下图所示:
六、添加数据集
6.1 配置数据源
1)设计报表界面,选择右侧数据源,点击
图标,输入相关数据源相关连接信息,:
说明:此处数据作为示例,具体以用户当前存在的数据库为准。
数据源名称:test
连接用户名:root
连接密码:123456
驱动名称:com.mysql.jdbc.Driver
连接URL:jdbc:mysql://localhost:3306/jeesite?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
2)信息输入完成,点击【测试连接】,提示“连接测试成功”;
6.2 添加数据集
1)选择已添加的数据源“test”,右键点击【添加数据集】;
2)进入数据源添加界面,左侧展示test数据源内的所有table,右侧展示SQL输入区及参数栏;
3)基于已存在的table,添加数据集【当前jeesite数据库里已事先添加了一张transfer_task表,表内有项目的实际数据,后续将基于这张表进行基本的功能演示及介绍】,双击transfer_task表,右侧将自动导入SQL
【支持复杂SQL,可自行在SQL输入框中输入:比如多表查询、left join等等,输入完成可预览数据】;
备注:
SQL输入区同样支持表达式语法,表达式以${}进行包裹
表达式模式:
param是固定表达,表示参数。当job_type为空或为null时,全查询,否则查询指定类型的transfer_task记录,主要用于后续处理数据,在设计表单时可针对当前参数设置查询条件(参考下图):
${
if(param("job_type")=='' || param("job_type")== null){
return "select * from transfer_task"
}else{
return "select * from transfer_task where job_type=:job_type"
}
}
4)预览数据,这块界面排版及布局不够友好,但支持鼠标左右移动进行数据查看,也相当于是横向滚动条;
5)数据集添加完成,可针对数据集进行后续处理;
6)数据源与数据集均支持增、删、改操作,鼠标选中右键即可操作,此处不做过多介绍;
7)值得一提的是,可针对已添加的数据集,进行删除字段操作,删除后,后续使用此数据集时,都不再展示该字段;
6.3 加载数据集至表格
1)点击左侧表格A1,选择右侧数据源栏已添加的数据集“transfer_task”,双击所需要的字段(此处以worker_name为例)同理,依次为B1、C1、D1单元格添加数据集reader_number、write_number、status字段;
表格宽度可调整,也可通过鼠标直接拉长
2)对当前表格添加边框,便于预览表格时层次分明;
3)基于(2),在字段上方添加一行,依次选中A1、B1、C1、D1,在右侧文本内容中输入:worker_name、reader_number、write_number、status,并添加边框;
4)点击【预览报表】》【预览】,预览报表数据;
5)报表展示当前四个字段数据,数据以默认的分组方式进行展示;
6)报表支持分页预览(分页预览模式下,数据将更清晰的进行展示),分页预览如下:
7)报表预览界面,支持对报表导出为PDF、在线打印、导出为Word、excel、分页导出excel、分页分sheet导出为excel(功能不是很好用,当有合并列时,在线预览及导出布局会有问题,部分时候数据会有丢失情况出现),此处不做过多介绍,可自行体验。
七、数据处理
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"}}
八、查询表单设计
查询表单设计主要是针对于使用表达式类型的SQL而言的,具体使用如下:
1)保存当前报表,点击左上角保存按钮;
2)浏览器地址输入: http://localhost:18090/ureport/designer ,开始新增一个全新报表;
3)添加jdbc数据源,参考【配置数据源】章节;
4)基于数据源,添加新的表达式数据集,参考【添加数据集】表达式模式;
${
if(param("job_type")=='' || param("job_type")== null){
return "select * from transfer_task"
}else{
return "select * from transfer_task where job_type=:job_type"
}
}
5)基于数据集,设计报表,添加边框等:
6)设计查询表单,点击右上角 按钮,进入查询表单设计器界面;
7)选择三列布局,并依次在三列中,加入单选列表、提交按钮、重置按钮;
8)点击【属性】框,对单选列表进行设置:
绑定参数:job_type,即添加数据集的SQL中的参数;
标题位置:左边;
标题:输入“类型”;
数据来源:固定值;
选项:稽核作业、流处理作业(多余选项删除掉)
9)提交和重置按钮,将标题修改一下:查询、重置即可,按钮风格改为:基本
10)关闭设计窗口,预览报表,查看数据:
11)选择类型:稽核作业,进行查询,展示对应查询条件的数据记录;
九、图表展示
UReport2中支持10种类型的图表,分别是:饼状图、圆环图、曲线图、柱状图、水平柱状图、面积图、雷达图、极坐标图、散点图以及气泡图,点击工具栏上的 插入图表的图标,在弹出的菜单中选择目标图表类型,即可完成图表的添加工作。
选中图表所在单元格,即可在属性面板中配置图表的相关属性。在UReport2中,图表的属性有三类,分别是与数据集绑定的属性、配置XY轴的相关属性以及配置图例标题之类的属性。
对于饼状图、圆环图、雷达图、极坐标图图表来说,由于它们没有XY轴,所以在属性面板中看不到XY轴配置标签页。
在绑定数据集配置的的标签页中,可以用来配置图表要表现的具体数据,在UReport2中图表绑定的数据都来自数据源,所以在配置图表之前,我们需要准备好需要用图表展示的具体数据的数据集。
对于饼状图、圆环图、曲线图、柱状图、水平柱状图、面积图、雷达图、极坐标图几种图表来说,它们要展示数据结构一样。
操作:
1)保存当前“查询表单设计”图表;
2)浏览器输入地址: http://localhost:18090/ureport/designer ,新建一个空图表并进行保存为饼状图;
3)新增jdbc数据源并添加数据集,数据集内的SQL:select * from transfer_task;
4)左侧单元格区域合并单元格,点击图标;
5)点击 插入饼状图;
9.1 饼状图
配置:
(1)点击单元格属性;
(2)数据集tab,选中数据集“饼状图”;
(3)选择分类属性:worker_name;
(4)选择值属性:reader_number;
(5)值属性选择属性值,属性选择del_flag;
(6)聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
聚合方式:
A、汇总:统计不同状态,不同worker内的读数量总和;
B、罗列数据:展示第一条记录的数据值,无参考意义;
C、统计数量:统计不同状态、不同worker内的task任务条数;
D、最大值:统计不同状态,不同worker内的读条数最高的并展示;
E、最小值:统计不同状态,不同worker内的读条数最小的并展示;
F、平均值:统计不同状态,不同worker内的读条数平均值并展示
选项:
A、标题:支持配置图标的标题并进行指定位置展示,当前默认:否;
B、图例展示:支持配置图例,即是否展示数据集tab中配置的分类属性,当前默认:是;
C、数据标签:支持配置数据标签,配置完成将在图表默认展示数据,即值属性,当前默认:否。
预览报表:
9.2 圆环图
(1)单元格区域,在饼状图下方添加8行
(2)选择新增的8行单元格,点击 图标合并单元格,并点击
插入圆环图;
(3)选择圆环图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
预览圆环图:
9.3 曲线图
(1)单元格区域,在圆环图下方添加8行;
(2)选择新增的8行单元格,点击
![](https://i-blog.csdnimg.cn/blog_migrate/381dfa2b308e81d5d5193670613578fe.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b07fdbb0c32060d3f5f27f7cf530029e.jpeg)
(3)选择曲线图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
轴配置:
X轴配置、Y轴配置:
(1)标题旋转角度:默认0;
(2)显示轴标题:默认否;
(3)轴标题:默认空
预览曲线图:
9.4 柱状图
(1)单元格区域,在饼状图右侧添加4列;
(2)选择新增的4列单元格,点击
![](https://i-blog.csdnimg.cn/blog_migrate/04a6064b16cb6253270b1f7d6de3fee7.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/206e366e9e01ecc136fe9d8c7274ee93.jpeg)
(3)选择柱状图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
预览柱状图:
9.5 水平柱状图
(1)选择柱状图下方的8行单元格,点击
![](https://i-blog.csdnimg.cn/blog_migrate/d463a326aed1a1ffef625a9b93f4e686.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/551d0a661226abb8b48ab7ab47fd1702.jpeg)
(2)选择水平柱状图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
预览水平柱状图:
9.6 面积图
(1)选择水平柱状图下方的单元格,点击 图标合并单元格,并点击
![](https://i-blog.csdnimg.cn/blog_migrate/d92f410fc12c88bd317a0b9e87d6f85f.jpeg)
(2)选择面积图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
预览面积图:
9.7 雷达图
(1)单元格区域,在柱状图右侧添加4列;
(2)选择新增的4列单元格,点击 图标合并单元格,并点击
![](https://i-blog.csdnimg.cn/blog_migrate/a75f046d55503e4edea1178b0558e0f7.jpeg)
(3)选择雷达图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
预览雷达图:
9.8 极坐标图
(1)选择雷达图下方的8行单元格,点击图标合并单元格,并点击
![](https://i-blog.csdnimg.cn/blog_migrate/b63b3c8bace5182d2d523e429d180dec.jpeg)
(2)选择极坐标图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:worker_name;
4、选择值属性:reader_number;
5、值属性选择属性值,属性选择del_flag;
6、聚合方式选择:汇总(统计不同del_flag状态,不同worker内的读数量总和);
预览极坐标图:
9.9 散点图
(1)选择极坐标图下方的单元格,点击图标合并单元格,并点击
![](https://i-blog.csdnimg.cn/blog_migrate/17de2fc3f20cb63e24da9a3796265d05.jpeg)
(2)选择散点图单元格,配置单元格属性:
1、点击单元格属性;
2、数据集tab,选中数据集“饼状图”;
3、选择分类属性:status;
4、X值属性:write_number;
5、Y值属性:reader_number
预览散点图:
十、报表打印、导出
ureport2支持打印报表,不过存在bug,数据会显示不全,导出为Word文档同样存在问题,数据不全且当有合并单元格时数据会混乱展示;
建议方式:
预览数据界面,点击【在线打印】将数据缩放保存为pdf模式,再进行打印;
数据支持导出为excel、支持分页导出excel、支持分页分sheet导出为excel;
十一、ureport2不支持自动发送邮件
十二、权限控制
ureport2本身不支持权限控制,但是码云上有用户将 renren-security采用SpringBoot2.0、MyBatis、Shiro框架,开发的一套权限系统 ,集成了ureport2,但是目前还不成熟,还存在问题。