(一)JasperReport介紹

1. JasperReport介紹

    JasperReport 是一個開源的Java報表引擎,它不像其他的報表工具,例如Crystal報表是基於Java的,沒有自己的表達式語法。Jasper Reports有提供豐富的內容到屏幕上,到打印機,或轉換成PDF,HTML,XLS,RTF,ODT,CSV,TXT和XML文件的能力。Jasper Reports是一個Java類庫,需要嵌入到Java應用程序中。Jasper Report的特點如下:

  • 具有靈活的報表佈局;
  • 可以用文字或圖形顯示數據;
  • 開發人員可以通過多種方式提供數據;
  • 可以接受來自多個數據源的數據;
  • 可以生成水印(水印是這樣的方式被放置在主圖像的副圖像);
  • 可以生成子報表;
  • 能夠導出報表到多種格式的。

 

2. 開發流程

    JasperReport完全由Java編寫,可以用於在各種Java應用程序,包括J2EE,Web應用程序中生成動態內容。它主要目的是輔助生成面向頁面的、準備打印的文檔。下面的流程圖描述了一個典型的報表開發的工作流程。

 

    如上圖所示,JasperReport報表開發分爲四個階段:

(1)設計報表

    這個階段是創建jrxml文件,該文件是包含報表佈局定義的XML文檔,可以使用JasperSoft Studio或iReport這兩種可視化開源開發工具來創建。

(2)編譯報表

    這一階段是將源文件(*.jrxml)編譯成二進制文件(*.jasper),該jasper文件可以隨應用程序運行。

(3)執行報表

    該步驟是將應用程序中的數據填充在報表模板中,即jasper文件。這一階段將會產生jasper打印文件(*.jrprint),該文件可以用來打印或導出報表。

(4)導出報表到所需要的格式中

    JasperReport提供了各種形式的導出格式,如:HTML,PDF,Excel等。該階段可以導出需要的報表格式。

 

3. 實現原理

    JasperReport Library爲報表開發提供了豐富的類庫,其中生成報表並打印、導出全過程如下圖所示。

 

    開發流程如下:

(1)開發報表設計文件,也就是一個*.jrxml文件。

(2)使用JasperReports提供的JasperCompileManager工具編譯*.jrxml文件,編譯後生成一個*.jasper文件。

(3)使用JasperReports提供的JasperFillManager工具填充編譯後的*.jasper文件,填充後生成一個*.jrprint文件。

(4)使用導出管理器JasperExportManager或者各種格式的文件導出器JRXxxExporter將*.jrprint文件導出成各種格式的報表文件。也可以使用JRViewer工具類來直接瀏覽報表。也可以使用打印管理器JasperPrintManager來打印報表。

 

4. 相關實現類

    在JasperReport的開發流程中,主要涉及下面的這幾個類:

(1)net.sf.jasperreports.engine.design.JasperDesign

    這個類可以在JasperReport類庫內置的XML解析器對XML report design進行解析處理之後得到[2]。其對應與報表模板文件在內存中的形式,即*.jrxml文件。

(2)net.sf.jasperreports.engine.JasperReport

    這個類的實例包含了一個經過編譯的report design對象。生成它的時機是對報表編譯之後,但尚未對其填入數據的時候。編譯過程中,JasperReport需要生成一個臨時的類文件,用以保存report 表達式,如變量表達式、文本、圖像表達式、組表達式等等。這個臨時的Java Source File是被動態編譯的,編譯器使用的是JDK中用來執行應用程序的編譯器類(compiler class)。如果 tools.jar不在classpath中,編譯過程將採用javac.exe來進行後臺編譯。編譯後所得的字節碼保存在JasperReport類中,用來在執行期填充數據和給表達式賦值。對應二進制報表文件在內存中的形式,也就是對應的*.jasper文件。

(3)net.sf.jasper.engine.JasperPrint

    當一個報表已經裝填好數據之後,這個文檔就以JasperPrint類的實例出現。這個類可以直接用JasperReport內置的viewer進行查看,也可以序列化到硬盤以備後用,或者發送到網上去。這個類的實例是報表裝填過程後的產物,它可以被JasperReport類庫中的導出方法導出成各種流行的格式如PDF,HTML,XML等等。

(4)net.sf.jasperreports.engine.xml.JRLoader

    裝載器用於報表生成的各個主要階段如編譯,填充等。用戶和引擎都可以利用這個類來裝載所需的序列化對象如file、URLs、intput stream等。這個類最令人感興趣的函數當屬loadOnjectFromLocation(String location)[3]。當用戶使用這個類從指定地點裝載對象的時候,該函數將首先將location解釋爲一個合法的URL,如果解析失敗,函數將認爲所提供的location是硬盤上的一個文件名,並將試圖讀取它。如果在指定地點沒找到文件,它將通過classpath定位一個相應於該location的資源,所有努力失敗之後,將拋出異常。

(5)net.sf.jasperreports.engine.JasperCompileManager

    這是一個與編譯有關的類,利用它提供的一些編譯方法,允許我們將一個報表設計文檔(*.jrxml文件)編譯成一個二進制文件(*.jasper文件)。此外,它也可以直接將net.sf.jasperreports.engine.design.JasperDesign(*.jrxml文件在內存中的形式)對象編譯成net.sf.jasperreports.engine.JasperReport對象。

(6)Class net.sf.jasper.engine.JasperFillManager 

    這個類用來實現報表的數據填充。報表填充就是爲報表的數據查詢提供數據庫連接,給報表的參數設置值等。填充之前是*.jasper文件,經過填充後就變成了*.jrprint文件--這是一個可顯示或者可導出成報表的文件。這個類提供了很多方法來接受各種類型的report design,可以是一個對象、文件、或輸入流。它的輸出結果也是多樣的:file、Object、output Stream。

(7)net.sf.jasperreports.engine.JasperPrintManager

    用於將一個*.jrprint文件完成打印。在JapserReports中,我們可以通過這個類來打印報表,它包含了所有的打印功能。它提供了打印整個文檔或者部分文檔、顯不顯示打印對話框的方法。使用這個類可以將JasperReports文檔的一頁作爲一個java.awt.Image對象來顯示。

(8)net.sf.jasperreports.engine.JasperExportManager

    這個管理類對不同來源和不同去處(文件、輸入輸出流等)的數據提供不同的方法。用於將可顯示的報表導出成各種格式的報表文件,例如PDF、HTML、XML和其他的格式。

(9)net.sf.jasperreports.engine.export.JRXxxExporter

    這是一系列的文件導出器,它們用於將*.jrprint文件導出成對應格式的報表文件。例如XSL、PDF、HTML、XML、CSV、RTF、TXT和其他的格式。JRXlsExporter、JRPdfExporter、JRXmlExporter、JRCsvExporter、JRHtmlExporter、JRTextExporter、JRRtfExporter。

(10)net.sf.jasperreports.engine.JasperRunManager

    這個類可以直接將*.jasper文件導出成各種格式的報表文件,有時候在報表填充過程中我們不希望生成中間的net.sf.jasperreports.engine.JasperPrint對象,而直接生成我們所需要的文檔格式,例如:PDF或HTML。

 

5. 報表數據源

    Jasper報表引擎獲得來自數據源的數據,可以從數據庫,XML文件,對象數組和集合中的對象來獲得。前面我們介紹了利用JasperFillManager來實現報表的數據填充,具體是由fillReportXXX()方法獲取數據源進行填充。

(1)JDBC數據源

    JRResultSetDataSource類關聯入一個java.sql.ResultSet對象。這是當報表數據從關係數據庫中提取最常用的數據源實現。如果使用java.sql.Connection傳遞給引擎,它首先執行相關的查詢,並將該返回java.sql.ResultSet中的對象在一個JRResultSetDataSource實例。

(2)JavaBean數據源

    JRBeanArrayDataSource類和JRBeanCollectionDataSource類實現了可以分別包裝的JavaBean對象的數組或集合。數組或集合中的每個對象都將被視爲對這種類型的數據源中的一個記錄。一個特定的JavaBean屬性和相應的報表字段之間的映射是通過命名約定進行。報表字段的名稱必須是相同的所指定的JavaBeans的規範JavaBean屬性的名稱。

(3)基於Map數據源

    父級應用程序已經存儲在內存中的java.util.Map對象提供填充數據的實現類JRMapArrayDataSource和JRMapCollectionDataSource非常有用。被包裝的數組或集合中的每個映射對象被認爲是數據源中的一個虛擬的記錄,每個報表字段的值從映射中使用報表字段名作爲鍵提取。

(4)TableModel的數據源

    許多客戶端應用程序的數據以表格形式顯示。在許多應用中常見的需求是允許用戶打印該表格形式的報告。實現類JRTableModelDataSource使生成的表格格式的Swing應用程序報告的任務。這個類封裝了一個javax.swing.table.TableModel對象。列在包裝的TableModel對象可以通過他們的名字或他們的基於0索引來訪問。

(5)XML數據源

    類JRXmlDataSource是基於DOM,它使用XPath表達式來選擇XML文檔數據的數據源的實現。 XML數據源中的記錄是通過XPath表達式選擇的節點元素表示。字段值是由每個記錄使用由字段描述(JRXML<fieldDescription>元素)所提供的XPath表達式檢索。

(6)CSV數據來源

    JRCsvDataSource 代表了從結構化文本文件中檢索其數據的數據源的實現,通常爲CSV。字段值是正在使用他們的列索引檢索。

(7)XLS數據來源

    JRXlsDataSource 代表其檢索的Excel文件的數據的數據源的實現。報表字段映射爲這個數據源的實現也是基於字段列索引。

(8)空數據來源

    類JREmptyDataSource,模擬與內部虛擬空的記錄給定數量的數據源。它是由用戶界面的工具來提供基本的報表預覽功能,或在特殊報告模板,或用於測試和調試目的。

   

    到此爲止,JasperReport報表開發的整個流程和實現原理已經介紹完了,在瞭解了這些之後,後面實踐起來心裏就要清楚一些。

參考文獻

[1] JasperReport在線教程.http://gitbook.net/jasper_reports/jasper_getting_started.html

[2] JasperReports 報表的開發流程.http://topmanopensource.iteye.com/blog/1866879

[3] JasperReport API. http://jasperreports.sourceforge.net/api/

 

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