UReport2 與業(yè)務(wù)結(jié)合

2022-12-30 13:39 更新
UReport2教學(xué)視頻
http://pan.baidu.com/s/1boWTxF5,密碼:98hj

       本小節(jié)中我們將介紹如何在業(yè)務(wù)頁(yè)面中展示報(bào)表、導(dǎo)出報(bào)表文件、引用報(bào)表內(nèi)容等操作。

UReport商業(yè)版BaskReport已推出,采出全新算法,全新設(shè)計(jì)器,實(shí)現(xiàn)百萬(wàn)條數(shù)據(jù)秒級(jí)加載, 價(jià)格低至1000/年,詳見(jiàn):https://www.basksoft.com  

報(bào)表相關(guān)URL

       在配置好一個(gè)包含UReport2的項(xiàng)目后,就可以運(yùn)行我們的項(xiàng)目,打開UReport2的基于網(wǎng)頁(yè)的報(bào)表設(shè)計(jì)器,它的地址如下:

UReport2報(bào)表設(shè)計(jì)器URL
http://host[:port][/context-path]/ureport/designer

       如果我們是在本地啟動(dòng)項(xiàng)目,并且服務(wù)器端口號(hào)為8080,context-path為ureport2-demo,那么我們的報(bào)表設(shè)計(jì)器的URL就是:http://localhost:8080/ureport2-demo/ureport/designer。

       在報(bào)表設(shè)計(jì)器中,設(shè)計(jì)好報(bào)表后,點(diǎn)擊左上角的圖標(biāo)就可以在線預(yù)覽報(bào)表(預(yù)覽報(bào)表有兩種方式,一種是不分頁(yè)預(yù)覽報(bào)表;一種是分頁(yè)預(yù)覽報(bào)表,如果報(bào)表數(shù)據(jù)量較大,我們推薦預(yù)覽時(shí)采用分頁(yè)方式,這樣可以減輕瀏覽器渲染壓力);預(yù)覽報(bào)表的URL如下:

UReport2預(yù)覽報(bào)表URL
http://host[:port][/context-path]/ureport/preview?_u=報(bào)表名稱

       在上面的URL中有個(gè)名為“_u”的參數(shù),它是用來(lái)指定當(dāng)前要預(yù)覽的報(bào)表模版名稱,如果是對(duì)正在設(shè)計(jì)器中的報(bào)表進(jìn)行預(yù)覽,那么它的值就是“p”,這是一個(gè)約定的值,表示要預(yù)覽的是正在設(shè)計(jì)器中的報(bào)表,所以可以看到我們演示時(shí)預(yù)覽的URL都是這樣:http://localhost:8080/ureport2-demo/ureport/preview?_u=p 。

預(yù)覽正在設(shè)計(jì)中的報(bào)表注意事項(xiàng)
在預(yù)覽正在設(shè)計(jì)器中設(shè)計(jì)的報(bào)表時(shí)(也就是_u=p),UReport2會(huì)在點(diǎn)擊設(shè)計(jì)器工具欄圖標(biāo)時(shí),將設(shè)計(jì)中的報(bào)表模版信息提交到服務(wù)器,存放于當(dāng)前用戶的session中(用戶會(huì)話中),所以一旦用戶session失效,如果我們?cè)俅沃苯宇A(yù)覽_u=p類型報(bào)表時(shí),會(huì)看到“com.bstek.ureport.console.exception.ReportDesignException: Report data has expired,can not do preview.”這樣的錯(cuò)誤提示,表示存放于session中的正在設(shè)計(jì)器中設(shè)計(jì)的報(bào)表模版已經(jīng)失效,不能預(yù)覽。
當(dāng)然,如果_u的值是一個(gè)具體的報(bào)表名稱,則不存在這種問(wèn)題,只有正在設(shè)計(jì)器中設(shè)計(jì)的報(bào)表模版在預(yù)覽中采用了這種機(jī)制,這點(diǎn)需要注意。

       如果預(yù)覽的不是正在設(shè)計(jì)器中設(shè)計(jì)的模版,那么只需要給出具體的報(bào)表名稱即可,需要注意的是,這里的報(bào)表名稱要以其ReportProvider中要求的前綴開始,比如http://localhost:8080/ureport2-demo/ureport/preview?_u=file:test.ureport.xml等。

       報(bào)表預(yù)覽后,通過(guò)預(yù)覽頁(yè)面上方工具欄中一排按鈕,可以實(shí)現(xiàn)報(bào)表的PDF打印、導(dǎo)出Word、Excel、PDF等,對(duì)應(yīng)的相關(guān)URL如下:

URL
說(shuō)明
http://host[:port][/context-path]/ureport/pdf/show?_u=報(bào)表名稱

這個(gè)URL將向?yàn)g覽器寫入一個(gè)PDF文件流,在Chrome、Firefox、Edge這些

 瀏覽器中將會(huì)直接在線顯示PDF文件內(nèi)容,這樣可以實(shí)現(xiàn)在線瀏覽PDF并打印輸出。

http://host[:port][/context-path]/ureport/word?_u=報(bào)表名稱導(dǎo)出對(duì)應(yīng)報(bào)表的Word文件
http://host[:port][/context-path]/ureport/excel?_u=報(bào)表名稱不分頁(yè)導(dǎo)出對(duì)應(yīng)報(bào)表的Excel文件
http://host[:port][/context-path]/ureport/excel/paging?_u=報(bào)表名稱分頁(yè)導(dǎo)出對(duì)應(yīng)報(bào)表的Excel文件
http://host[:port][/context-path]/ureport/excel/sheet?_u=報(bào)表名稱分頁(yè)分Sheet導(dǎo)出對(duì)應(yīng)報(bào)表的Excel文件
http://host[:port][/context-path]/ureport/pdf?_u=報(bào)表名稱導(dǎo)出對(duì)應(yīng)報(bào)表的PDF文件
關(guān)于報(bào)表參數(shù)
上面的這些URL在使用時(shí),如果需要向報(bào)表傳入?yún)?shù),可以將這些參數(shù)直接放在URL后面使用,如:http://localhost:8080/ureport2-demo/ureport/word?_u=file:test.ureport.xml&deptId=D11&age=50,將報(bào)表file:test.ureport.xml導(dǎo)出成word時(shí),傳入兩個(gè)參數(shù),分別是:deptId=D11以及age=50

       上述的這些URL后面除了可以用_u參數(shù)來(lái)指定要預(yù)覽的報(bào)表名稱外,還可以通過(guò)_i參數(shù)來(lái)指定當(dāng)前要預(yù)覽報(bào)表頁(yè)碼,也就是說(shuō)如果上述這些URL后面沒(méi)有_i參數(shù),將會(huì)顯示整個(gè)報(bào)表,如果有則顯示_i參數(shù)指定頁(yè)碼對(duì)應(yīng)的報(bào)表,比如URL后面跟_i=2,表示預(yù)覽報(bào)表分頁(yè)后第2頁(yè)內(nèi)容。

       在http://host[:port][/context-path]/ureport/preview對(duì)應(yīng)的HTML報(bào)表預(yù)覽頁(yè)面中,默認(rèn)頁(yè)面上部工具欄會(huì)顯示一排按鈕,用于實(shí)現(xiàn)打印和導(dǎo)出其它格式報(bào)表,如下圖所示:

tools

      在上面的工具欄中,一共有9個(gè)按鈕,分別用于實(shí)現(xiàn)打印及導(dǎo)出其它格式報(bào)表, 在實(shí)際使用中,如果希望這個(gè)工具欄只出現(xiàn)其中某些個(gè)工具的話,我們可以參數(shù)在URL后面添加_t參數(shù)來(lái)實(shí)現(xiàn),_t參數(shù)如果不指定,那么會(huì)顯示所有的按鈕,否則只顯示_t參數(shù)指定的按鈕。上面這些按鈕的顯示分別對(duì)應(yīng)參數(shù)值:1、2、3、4、5、6、7、8、9,多個(gè)參數(shù)間用“,”分隔,下面是一些示例:

示例
說(shuō)明
_t=1,3顯示第一個(gè)和第三個(gè)按鈕
_t=1,2,5顯示第一個(gè),第二個(gè)和第五個(gè)按鈕
_t=1,2,3,4,5顯示第一個(gè),第二個(gè),第三個(gè),第四個(gè)和第五個(gè)按鈕

       如果我們不希望顯示HTML預(yù)覽頁(yè)面的工具欄,那么設(shè)置_t=0即可。

關(guān)于在線打印
在UReport2的報(bào)表預(yù)覽頁(yè)面中,可以看到UReport2提供了三種在線打印方式,分別是直接HTML打印、直接PDF打印以及PDF在線預(yù)覽打印。這其中直接HTML打印是利用瀏覽器的HTML打印功能實(shí)現(xiàn),能用于普通的A4紙類型報(bào)表頁(yè)面的打印,同時(shí)它不能打印出報(bào)表中定義的頁(yè)眉頁(yè)腳,如果有定義的話。對(duì)于直接PDF打印以及PDF在線預(yù)覽打印是服務(wù)端向?yàn)g覽器中寫入PDF流,利用Chrome、Firefox、Edge這些瀏覽器可以在線顯示PDF功能實(shí)現(xiàn)的打印,這種是直接打印的PDF,所以可以應(yīng)付各種復(fù)雜報(bào)表紙張類型的打印輸出。
Firefox在預(yù)覽PDF時(shí)存在的問(wèn)題
在預(yù)覽PDF時(shí),F(xiàn)irefox不允許當(dāng)前frame外通過(guò)javascript調(diào)用其打印功能(目前來(lái)看可能是Firefox的Bug),所以我們需要手工點(diǎn)擊其frame內(nèi)部自帶的打印按鈕實(shí)現(xiàn)打印。

       在業(yè)務(wù)頁(yè)面中,如果需要預(yù)覽打印或?qū)С鰣?bào)表,那么就可以采用上述URL實(shí)現(xiàn)需要的功能。

在代碼中使用報(bào)表

       在UReport2當(dāng)中,我們可以使用ExportManager實(shí)現(xiàn)在業(yè)務(wù)代碼中導(dǎo)出各種類型的報(bào)表,ExportManager接口源碼如下:

package com.bstek.ureport.export;
import java.util.Map;
import com.bstek.ureport.export.html.HtmlReport;
/**
 * @author Jacky.gao
 * @since 2016年12月4日
 */
public interface ExportManager {
    public static final String BEAN_ID="ureport.exportManager";
    /**
     * 導(dǎo)出Html報(bào)表
     * @param file 報(bào)表模版文件名
     * @param contextPath 當(dāng)前項(xiàng)目的context path
     * @param parameters 參數(shù)
     * @return 返回一個(gè)HtmlReport對(duì)象,里面有報(bào)表產(chǎn)生的HTML及相關(guān)CSS
     */
    HtmlReport exportHtml(String file,String contextPath,Map<String, Object> parameters);
    /**
     * 導(dǎo)出指定頁(yè)碼的Html報(bào)表
     * @param file 報(bào)表模版文件名
     * @param contextPath 當(dāng)前項(xiàng)目的context path
     * @param parameters 參數(shù)
     * @param pageIndex 頁(yè)碼
     * @return 返回一個(gè)HtmlReport對(duì)象,里面有報(bào)表產(chǎn)生的HTML及相關(guān)CSS
     */
    HtmlReport exportHtml(String file,String contextPath,Map<String, Object> parameters,int pageIndex);
    /**
     * 導(dǎo)出PDF報(bào)表
     * @param config 包含報(bào)表模版文件名、參數(shù)等信息的配置對(duì)象
     */
    void exportPdf(ExportConfigure config);
    /**
     * 不分頁(yè)導(dǎo)出Excel
     * @param config 包含報(bào)表模版文件名、參數(shù)等信息的配置對(duì)象
     */
    void exportExcel(ExportConfigure config);
    /**
     * 分頁(yè)導(dǎo)出Excel
     * @param config 包含報(bào)表模版文件名、參數(shù)等信息的配置對(duì)象
     */
    void exportExcelWithPaging(ExportConfigure config);
    /**
     * 分頁(yè)分Sheet導(dǎo)出Excel
     * @param config 包含報(bào)表模版文件名、參數(shù)等信息的配置對(duì)象
     */
    void exportExcelWithPagingSheet(ExportConfigure config);
    /**
     * 導(dǎo)出Word
     * @param config 包含報(bào)表模版文件名、參數(shù)等信息的配置對(duì)象
     */
    void exportWord(ExportConfigure config);
}

       因?yàn)镋xportManager接口實(shí)現(xiàn)是配置在Spring當(dāng)中,所以要使用ExportManager接口,我們需要首先通過(guò)Spring的ApplicationContext取到ExportManager實(shí)例對(duì)象,我們可以通過(guò)ExportManager.BEAN_ID來(lái)取到對(duì)應(yīng)的Bean實(shí)例。我們來(lái)看下如何采用ExportManager導(dǎo)出HTML報(bào)表,并將報(bào)表內(nèi)容嵌入到一個(gè)JSP中。

       首先我們需要采用報(bào)表設(shè)計(jì)器設(shè)計(jì)好一個(gè)報(bào)表模版文件,將其保存,比如報(bào)表模版保存后的文件名為demo.ureport.xml,然后在項(xiàng)目中創(chuàng)建一個(gè)JSP(這里之所以選擇JSP,是因?yàn)樗顬楹?jiǎn)單,可以保證所有的J2EE開發(fā)者都能看懂,實(shí)際使用時(shí)可能是MVC框架、Ajax等,但如果了解了在JSP中用法,其它的就簡(jiǎn)單了),在JSP中輸入相應(yīng)代碼,導(dǎo)出Html報(bào)表,并將其寫入到JSP中,完整的JSP源碼如下:

<%@page import="com.bstek.ureport.export.html.HtmlReport"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="com.bstek.ureport.export.ExportManager"%>
<%@page import="com.bstek.ureport.Utils"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>HTML報(bào)表測(cè)試</title>
</head>
<body>
<!-- 通過(guò)一個(gè)HTML鏈接來(lái)導(dǎo)出目標(biāo)報(bào)表模版的PDF格式報(bào)表 -->
<a href="<%=request.getContextPath() %>/ureport/pdf?_u=file:demo.ureport.xml">導(dǎo)出PDF格式報(bào)表</a>
<p></p>
<%
ExportManager  exportManager=(ExportManager)Utils.getApplicationContext().getBean(ExportManager.BEAN_ID);
Map<String,Object> parameters=new HashMap<String,Object>();
HtmlReport htmlReport = exportManager.exportHtml("file:demo.ureport.xml",request.getContextPath(),parameters);
//輸出Css樣式
out.println("<style type=\"text/css\">");
out.println(htmlReport.getStyle());
out.println("</style>");
//輸出報(bào)表內(nèi)容
out.println(htmlReport.getContent());
%>
</body>
</html>

       啟動(dòng)項(xiàng)目,瀏覽這個(gè)JSP,就可以看到生成的HTML報(bào)表內(nèi)容,如下圖所示:

demo

       可以看到,在運(yùn)行后的JSP中,可以點(diǎn)擊上方的鏈接導(dǎo)出PDF格式報(bào)表,下方的表格則是這個(gè)報(bào)表的HTML格式展現(xiàn),實(shí)際使用時(shí)還可以在這個(gè)頁(yè)面里加入一些其它與業(yè)務(wù)相關(guān)元素,具體做法這里就不再贅述。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)