ureport2報表詳細使用

一、報表簡介

UReport2是一款基於架構在Spring之上純Java的高性能報表引擎,通過迭代單元格可以實現任意複雜的中國式報表。 在UReport2中,提供了全新的基於網頁的報表設計器,可以在Chrome、Firefox 等各種主流瀏覽器運行 (不支持IE)。 使用UReport2,打開瀏覽器即可完成各種複雜報表的設計製作。

二、主體功能

  1. UReport2支持創建數據源、添加數據集,並對數據集進行函數、表達式處理;(參考【數據處理】)

  2. 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/Sonlan/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行單元格,點擊 圖標合併單元格,並點擊  插入曲線圖;

(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列單元格,點擊 圖標合併單元格,並點擊  插入柱狀圖;

(3)選擇柱狀圖單元格,配置單元格屬性:

1、點擊單元格屬性;
2、數據集tab,選中數據集“餅狀圖”;
3、選擇分類屬性:worker_name;
4、選擇值屬性:reader_number;
5、值屬性選擇屬性值,屬性選擇del_flag;
6、聚合方式選擇:彙總(統計不同del_flag狀態,不同worker內的讀數量總和);

預覽柱狀圖

9.5 水平柱狀圖

(1)選擇柱狀圖下方的8行單元格,點擊圖標合併單元格,並點擊 插入水平柱狀圖;

(2)選擇水平柱狀圖單元格,配置單元格屬性:

1、點擊單元格屬性;
2、數據集tab,選中數據集“餅狀圖”;
3、選擇分類屬性:worker_name;
4、選擇值屬性:reader_number;
5、值屬性選擇屬性值,屬性選擇del_flag;
6、聚合方式選擇:彙總(統計不同del_flag狀態,不同worker內的讀數量總和);

預覽水平柱狀圖:

9.6 面積圖

(1)選擇水平柱狀圖下方的單元格,點擊 圖標合併單元格,並點擊  插入面積圖;

(2)選擇面積圖單元格,配置單元格屬性:

1、點擊單元格屬性;
2、數據集tab,選中數據集“餅狀圖”;
3、選擇分類屬性:worker_name;
4、選擇值屬性:reader_number;
5、值屬性選擇屬性值,屬性選擇del_flag;
6、聚合方式選擇:彙總(統計不同del_flag狀態,不同worker內的讀數量總和);

預覽面積圖:

9.7 雷達圖

(1)單元格區域,在柱狀圖右側添加4列;

(2)選擇新增的4列單元格,點擊 圖標合併單元格,並點擊 插入雷達圖;

(3)選擇雷達圖單元格,配置單元格屬性:

1、點擊單元格屬性;
2、數據集tab,選中數據集“餅狀圖”;
3、選擇分類屬性:worker_name;
4、選擇值屬性:reader_number;
5、值屬性選擇屬性值,屬性選擇del_flag;
6、聚合方式選擇:彙總(統計不同del_flag狀態,不同worker內的讀數量總和);

預覽雷達圖:

9.8 極座標圖

(1)選擇雷達圖下方的8行單元格,點擊圖標合併單元格,並點擊 插入極座標圖;

(2)選擇極座標圖單元格,配置單元格屬性:

1、點擊單元格屬性;
2、數據集tab,選中數據集“餅狀圖”;
3、選擇分類屬性:worker_name;
4、選擇值屬性:reader_number;
5、值屬性選擇屬性值,屬性選擇del_flag;
6、聚合方式選擇:彙總(統計不同del_flag狀態,不同worker內的讀數量總和);

預覽極座標圖:

9.9 散點圖

(1)選擇極座標圖下方的單元格,點擊圖標合併單元格,並點擊 插入散點圖;

(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,但是目前還不成熟,還存在問題。

參考地址: https://gitee.com/zkool/renren-security-ureport2

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章