JasperReports報表的開發流程

JasperReports的開發流程

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

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

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

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


在JasperReports開發過程中,報表源文件開各種格式的報表文件要經過下圖所示的過程:

在JasperReports的開發流程中,JasperReports共涉及以下幾個類:

net.sf.jasperreports.engine.design.JasperDesign

對應報表設計文件在內存中的形式,也就是對應的*.jrxml文件。

net.sf.jasperreports.engine.JasperReport

對應二進制報表文件在內存中的形式,也就是對應的*.jasper文件。

net.sf.jasperreports.engine.JasperPrint

對應可顯示報表設計文件在內存中的形式,也就是對應的*.jrprint文件。這時可以通過JasperReports內建的報表查看器直接使用,也可以序列化後存儲到磁盤上以後使用,更甚於通過網絡發送給他處使用。

net.sf.jasperreports.engine.xml.JRXmlLoader

當調用這個方法來載入一個對象時,程序會先通過一個有效的URL來解析路徑。如果失敗了,程序就會認爲這是一個文件路徑並且嘗試去讀取。如果這個文件也沒有被發現,程序就會嘗試在classpath裏尋找能夠匹配的資源。如果這也失敗了,只好拋出異常。

JasperDesign design = JRXmlLoader.load(File file);
JasperDesign design = JRXmlLoader.load(InputStreaminputStream);
JasperDesign design = JRXmlLoader.load(String sourceFileName);

net.sf.jasperreports.engine.JasperCompileManager

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

    JasperCompileManager.compileReport(InputStream inputStream);    return JasperReport
    JasperCompileManager.compileReport(JasperDesign jasperDesign);  return JasperReport
    JasperCompileManager.compileReport(String sourceFileName);      return JasperReport

    JasperCompileManager.compileReportToFile(JasperDesign jasperDesign, String destFileName);
    JasperCompileManager.compileReportToFile(String sourceFileName);
    JasperCompileManager.compileReportToFile(String sourceFileName, String destFileName).

    JasperCompileManager.compileReportToStream(InputStream inputStream, OutputStream outputStream);
    JasperCompileManager.compileReportToStream(JasperDesign jasperDesign, OutputStream outputStream);

net.sf.jasperreports.engine.JasperFillManager

這個類用於報表填充的。報表填充就是爲報表的數據查詢提供數據庫連接,給報表的參數設置值等。填充之前是*.jasper文件,經過填充後就變成了*.jrprint文件--這是一個可顯示或者可導出成報表的文件。

參數的值通常通過一個java.util.Map對象來提供,這個Map對象的鍵是報表參數的名字。

數據源在不同的情況下可以通過兩種方式提供:通常情況下,它必須作爲一個JRDataSource對象被提供。但是由於大多數的報表所填的值都是從關係數據庫取出來的。JasperReports有一個內建的默認行爲,可以讓人們在報表設計的時候就指定一條SQL查詢語句。當在運行時填充報表的時候,執行SQL查詢語句來獲得需要填充的值。在這種情況下,JasperReports需要的僅僅是一個java.sql.Connection對象,一個通常的數據源對象的實例。JasperReports需要使用這個連接對象通過JDBC連接到關係數據庫管理系統,並且執行報表查詢。

在執行了報表查詢後,JasperReports會自動創建一個net.sf.jasperreports.engine.JRResultSetDataSource對象來封裝java.sql.ResultSet對象,並將它傳給普通的填充過程使用。

    JasperFillManager.fillReport(InputStream inputStream, Map parameters);         return JasperPrint
    JasperFillManager.fillReport(InputStream inputStream, Map parameters, Connection connection);
    JasperFillManager.fillReport(InputStream inputStream, Map parameters, JRDataSource dataSource);
    JasperFillManager.fillReport(JasperReport jasperReport, Map parameters);   
    JasperFillManager.fillReport(JasperReport jasperReport, Map parameters, Connection connection);
    JasperFillManager.fillReport(JasperReport jasperReport, Map parameters, JRDataSource dataSource);
    JasperFillManager.fillReport(String sourceFileName, Map parameters);                  
    JasperFillManager.fillReport(String sourceFileName, Map parameters, Connection connection);
    JasperFillManager.fillReport(String sourceFileName, Map parameters, JRDataSource dataSource);
    
    JasperFillManager.fillReportToFile(JasperReport jasperReport, String destFileName, Map parameters);
    JasperFillManager.fillReportToFile(JasperReport jasperReport, String destFileName, Map parameters, Connection connection);
    JasperFillManager.fillReportToFile(JasperReport jasperReport, String destFileName, Map parameters, JRDataSource datasource);
    JasperFillManager.fillReportToFile(String sourceFileName, Map parameters);
    JasperFillManager.fillReportToFile(String sourceFileName, Map parameters, Connection connection);
    JasperFillManager.fillReportToFile(String sourceFileName, Map parameters, JRDatasource dataSource);
    JasperFillManager.fillReportToFile(String sourceFileName, String destFileName, Map parameters);
    JasperFillManager.fillReportToFile(String sourceFileName, String destFileName, Map parameters, Connection connection);
    JasperFillManager.fillReportToFile(String sourceFileName, String destFileName, Map parameters, JRDataSource dataSource);
    
    JasperFillManager.fillReportToStream(InputStream inputStream, OutputStream outputStream, Map parameters);
    JasperFillManager.fillReportToStream(InputStream inputStream, OutputStream outputStream, Map parameters, Connection connection);
    JasperFillManager.fillReportToStream(InputStream inputStream, OutputStream outputStream, Map parameters, JRDataSource dataSource);
    JasperFillManager.fillReportToStream(JasperReport jasperReport, OutputStream outputStream, Map parameters);
    JasperFillManager.fillReportToStream(JasperReport jasperReport, OutputStream outputStream, Map parameters, Connection connection);
    JasperFillManager.fillReportToStream(JasperReport jasperReport, OutputStream outputStream, Map parameters, JRDataSource dataSource);

net.sf.jasperreports.engine.JasperPrintManager

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

    JasperPrintManager.printPage(InputStream inputStream, int pageIndex, boolean withPrintDialog);
    JasperPrintManager.printPage(JasperPrint jasperPrint, int pageIndex, boolean withPrintDialog);
    JasperPrintManager.printPage(String sourceFileName, int pageIndex, boolean withPrintDialog);     
    
    JasperPrintManager.printPages(InputStream inputStream, int firstPageIndex, int lastPageIndex, boolean withPrintDialog);          
    JasperPrintManager.printPages(JasperPrint jasperPrint, int firstPageIndex, int lastPageIndex, boolean withPrintDialog);          
    JasperPrintManager.printPages(String sourceFileName, int firstPageIndex, int lastPageIndex, boolean withPrintDialog);   
    
    JasperPrintManager.printPageToImage(InputStream inputStream, int pageIndex, float zoom);         
    JasperPrintManager.printPageToImage(JasperPrint jasperPrint, int pageIndex, float zoom);        
    JasperPrintManager.printPageToImage(String sourceFileName, int pageIndex, float zoom);  
    
    JasperPrintManager.printReport(InputStream inputStream, boolean withPrintDialog);         
    JasperPrintManager.printReport(JasperPrint jasperPrint, boolean withPrintDialog);        
    JasperPrintManager.printReport(String sourceFileName, boolean withPrintDialog);
    
    JasperPrintManager.printReportToPdf(JasperPrint jasperPrint);
    JasperPrintManager.printReportToPdfFile(JasperPrint jasperPrint, String destFileName);
    JasperPrintManager.printReportToPdfFile(String sourceFileName);
    JasperPrintManager.printReportToPdfFile(String sourceFileName, String destFileName);
    JasperPrintManager.printReportToPdfStream(InputStream inputStream, OutputStream outputStream);
    JasperPrintManager.printReportToPdfStream(JasperPrint jasperPrint, OutputStream outputStream);
    
    JasperPrintManager.printReportToXml(JasperPrint jasperPrint);
    JasperPrintManager.printReportToXmlFile(JasperPrint jasperPrint, String destFileName);
    JasperPrintManager.printReportToXmlFile(String sourceFileName);
    JasperPrintManager.printReportToXmlFile(String sourceFileName, String destFileName);
    JasperPrintManager.printReportToXmlStream(InputStream inputStream, OutputStream outputStream);
    JasperPrintManager.printReportToXmlStream(JasperPrint jasperPrint, OutputStream outputStream);

net.sf.jasperreports.engine.JasperExportManager

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

    JasperExportManager.exportReportToHtmlFile(JasperPrint jasperPrint, String destFileName);
    JasperExportManager.exportReportToHtmlFile(String sourceFileName);
    JasperExportManager.exportReportToHtmlFile(String sourceFileName, String destFileName);
    
    JasperExportManager.exportReportToPdf(JasperPrint jasperPrint);
    JasperExportManager.exportReportToPdfFile(JasperPrint jasperPrint, String destFileName);
    JasperExportManager.exportReportToPdfFile(String sourceFileName);
    JasperExportManager.exportReportToPdfFile(String sourceFileName, String destFileName);
    JasperExportManager.exportReportToPdfStream(InputStream inputStream, OutputStream outputStream);
    JasperExportManager.exportReportToPdfStream(JasperPrint jasperPrint, OutputStream outputStream);
    
    JasperExportManager.exportReportToXml(JasperPrint jasperPrint);
    JasperExportManager.exportReportToXmlFile(JasperPrint jasperPrint, String destFileName, boolean isEmbeddingImages);
    JasperExportManager.exportReportToXmlFile(String sourceFileName, boolean isEmbeddingImages);
    JasperExportManager.exportReportToXmlFile(String sourceFileName, String destFileName, boolean isEmbeddingImages);
    JasperExportManager.exportReportToXmlStream(InputStream inputStream, OutputStream outputStream);
    JasperExportManager.exportReportToXmlStream(JasperPrint jasperPrint, OutputStream outputStream);

net.sf.jasperreports.engine.export.JRXxxExporter

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

    eg: JRXlsExporter exporter = new JRXlsExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "reports/StretchReport.xls");
        exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
        exporter.exportReport();

net.sf.jasperreports.engine.JasperRunManager

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

    JasperRunManager.runReportToHtmlFile(String sourceFileName, Map parameters);
    JasperRunManager.runReportToHtmlFile(String sourceFileName, Map parameters, Connection conn);
    JasperRunManager.runReportToHtmlFile(String sourceFileName, Map parameters, JRDataSource jrDataSource);
    JasperRunManager.runReportToHtmlFile(String sourceFileName, String destFileName, Map parameters);
    JasperRunManager.runReportToHtmlFile(String sourceFileName, String destFileName, Map parameters, Connection conn);
    JasperRunManager.runReportToHtmlFile(String sourceFileName, String destFileName, Map parameters, JRDataSource jrDataSource);
    
    JasperRunManager.runReportToPdf(InputStream inputStream, Map parameters);
    JasperRunManager.runReportToPdf(InputStream inputStream, Map parameters, Connection conn);
    JasperRunManager.runReportToPdf(InputStream inputStream, Map parameters, JRDataSource jrDataSource);
    JasperRunManager.runReportToPdf(JasperReport jasperReport, Map parameters);
    JasperRunManager.runReportToPdf(JasperReport jasperReport, Map parameters, Connection conn);
    JasperRunManager.runReportToPdf(JasperReport jasperReport, Map parameters, JRDataSource jrDataSource);
    JasperRunManager.runReportToPdf(String sourceFileName, Map parameters);
    JasperRunManager.runReportToPdf(String sourceFileName, Map parameters, Connection conn);
    JasperRunManager.runReportToPdf(String sourceFileName, Map parameters, JRDataSource jrDataSource);
    
    JasperRunManager.runReportToPdfFile(String sourceFileName, Map parameters);
    JasperRunManager.runReportToPdfFile(String sourceFileName, Map parameters, Connection conn);
    JasperRunManager.runReportToPdfFile(String sourceFileName, Map parameters, JRDataSource jrDataSource);
    JasperRunManager.runReportToPdfFile(String sourceFileName, String destFileName, Map parameters);
    JasperRunManager.runReportToPdfFile(String sourceFileName, String destFileName, Map parameters, Connection conn);
    JasperRunManager.runReportToPdfFile(String sourceFileName, String destFileName, Map parameters, JRDataSource jrDataSource);
    
    JasperRunManager.runReportToPdfStream(InputStream inputStream, OutputStream outputStream, Map parameters);
    JasperRunManager.runReportToPdfStream(InputStream inputStream, OutputStream outputStream, Map parameters, Connection conn);
    JasperRunManager.runReportToPdfStream(InputStream inputStream, OutputStream outputStream, Map parameters, JRDataSource jrDataSource);

net.sf.jasperreports.engine.JRDataSource

JasperReports在報表數據來源方面是具有高柔韌性的。人們可以使用任意的數據源,前提條件就是能夠提供一個這個接口的恰當的實現。這樣報表引擎可以在填充報表時從數據源解析和檢索數據。

通常來說,如果一個報表填充了數據,肯定有一個這個接口的實例被報表引擎提供或創建。

net.sf.jasperreports.engine.JREmptyDataSource

作爲最簡單的net.sf.jasperreports.engine.JRDataSource接口的實現,這個類可以在不希望顯示從數據源獲得的數據,而只關心數據源的虛擬行數時在報表中使用。

在提供的例子裏有不少在填充報表時用到了這個類的實例,例如:fonts、images、shapes和unicode。這樣做是爲了模擬一個有一條空記錄的數據源。

net.sf.jasperreports.engine.JRResultSetDataSource

這個類是net.sf.jasperreports.engine.JRDataSource接口的一個默認實現。由於大多數的報表都由關係數據庫的數據生成,JasperReports包含了一個封裝了java.sql.ResultSet對象的默認實現。

這個類有着明確的目的:在傳給報表填充測試之前封裝已經載入的數據集。在執行了通過JDBC的報表查詢後它會被用來封裝從數據庫獲得的數據。

net.sf.jasperreports.engine.data.JRTableModelDataSource

這個類是net.sf.jasperreports.engine.JRDataSource接口的另外一個默認實現。它封裝了javax.swing.table.TableModel對象。它可以在Java Swing應用程序中通過已經載入的屏幕表格的數據生成報表。

net.sf.jasperreports.engine.data.JRBeanCollectionDataSource

使用Bean作爲數據源,JRBeanCollectionDataSource繼承JRAbstractBeanDataSource類,而JRAbstractBeanDataSource是一個抽象類它間接的實現了JRDataSource這個接口,所以我們就可以不用自己去實現next()/getFieldValue()這兩個方法了

 eg:JRDataSource datesource = new JRBeanCollectionDataSource(list);

net.sf.jasperreports.swing.JRViewer

這個類和上面說到的類不大一樣,說它是一個實用類不如說是一個顯示插件。它可以用在基於Swing的應用程序裏來顯示JasperReports生成的報表。

這個可視化組件並不能滿足每一個人。它被當作一個例子組件被包含在主類庫中,用來顯示核心打印功能可以在基於Swing的應用程序裏通過net.sf.jasperreports.engine.JasperPrintManager類生成java.awt.Image對象來顯示報表。

如果想修改這個組件使其滿足應用程序的需求,首選的方法是使用它的子類。

    JRVierer jr = new JRViewer(InputStream inputStream, boolean isXML);
    JRVierer jr = new JRViewer(inputStream inputStream, boolean isXML, Locale locale);
    JRVierer jr = new JRViewer(inputStream inputStream, boolean isXML, Locale locale, ResourceBundle resBundle);

    JRVierer jr = new JRViewer(JasperPrint jrPrint);
    JRVierer jr = new JRViewer(JasperPrint jrPrint, Locale locale);
    JRVierer jr = new JRViewer(JasperPrint jrPrint, Locale locale, ResourceBundle resBundle);
    
    JRVierer jr = new JRViewer(String fileName, boolean isXML);
    JRVierer jr = new JRViewer(String fileName, boolean isXML, Locale locale);
    JRVierer jr = new JRViewer(String fileName, boolean isXML, Locale locale, ResourceBundle resBundle);

net.sf.jasperreports.view.JasperViewer

這也是一個以教學爲目的的類。它使用了net.sf.jasperreports.swing.JRViewer組件來顯示報表。它是一個簡單的Java Swing應用程序,可以裝載和顯示報表。它在提供的例子中被廣泛的使用,用來顯示生成的文檔。

net.sf.jasperreports.view.JasperDesignViewer

通常,一個使用JasperReports來生成報表的應用程序如果使用了這個類將不能運行。這個類可以在設計階段用來預覽報表模版。它被當作一個用作可視化設計而使用的開發工具提供。

net.sf.jasperreports.engine.JRAbstractScriptlet

腳本程序(Scriptlets)是JasperReports類庫中一個非常強大的功能。它可以讓用戶自己編寫在填充過程中可以被報表引擎執行的代碼。用戶代碼可以在一個定義良好的片斷(例如:頁、列或者組)裏操作報表數據;爲生成的文檔建立一個新的range。

net.sf.jasperreports.engine.JRDefaultScriptlet

這是net.sf.jasperreports.engine.JRAbstractScriptlet的一個便利的子類。大多數時間用戶在使用腳本程序時會選擇這個類,這樣他們就不需要實現抽象類裏定義的所有抽象方法了。


 附:Exporter常用參數說明

Ø         net.sf.jasperreports.engine.JRExporterParameter. JASPER_PRINT
這個參數是net.sf.jasperreports.engine.JasperPrint的對象,exporter在導出報表前會做檢測  

Ø         net.sf.jasperreports.engine.JRExporterParameter. JASPER_PRINT_LIST
這個參數是包含了n個net.sf.jasperreports.engine.JasperPrint對象的java.util.List,exporter在導出報表前會做檢測

Ø         net.sf.jasperreports.engine.JRExporterParameter.INPUT_STREAM
這個參數是net.sf.jasperreports.engine.JasperPrint被序列化對象的輸入流,exporter在導出報表前會做檢測

Ø         net.sf.jasperreports.engine.JRExporterParameter.INPUT_URL
這個參數是包含net.sf.jasperreports.engine.JasperPrint被序列化對象的URL,exporter在導出報表前會做檢測

Ø         net.sf.jasperreports.engine.JRExporterParameter.INPUT_FILE_NAME
這個參數是存儲了net.sf.jasperreports.engine.JasperPrint被序列化對象的文件路徑,exporter在導出報表前會做檢測
注意:以上幾個參數不能全部爲空

Ø         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_STRING_BUFFER
這個參數是java.lang.StringBuffer的對象,存儲已經產生出的指定格式報表的內容

Ø         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_WRITER
這個參數是java.io.Writer的對象,將指定格式報表的內容發送到一個字符流,例如Servlet的PrintWriter

Ø         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_STREAM
這個參數是java.io.OutputStream的對象,將指定格式報表的內容發送到一個輸出流,例如ServletOutputStream

Ø         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_FILE
這個參數是java.io.FILE的對象,將指定格式報表的內容存儲到文件裏面

Ø         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_FILE_NAME
這個參數是java.lang.String的對象,將指定格式報表的內容存儲到文件裏面

Ø         net.sf.jasperreports.engine.JRExporterParameter.CHARACTER_ENCODING
這個參數是java.lang.String的對象,指定格式報表的內容編碼

Ø         net.sf.jasperreports.engine.JExcelApiExporterParameter.IS_FONT_SIZE_FIX_ENABLED
這個參數是java.lang.Boolean的對象,是否允許自動修正Excel每個欄位的大小  

Ø         net.sf.jasperreports.engine.JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET
這個參數是java.lang.Boolean的對象,每一頁是否用一個Sheet  

Ø         net.sf.jasperreports.engine.JRXlsExporterParameter. IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS
這個參數是java.lang.Boolean的對象,是否移除行與行之間的空行  

Ø         net.sf.jasperreports.engine.JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND
這個參數是java.lang.Boolean的對象,頁面的背景是否爲白的

Ø         net.sf.jasperreports.engine.JRXlsExporterParameter.SHEET_NAMES
這個參數是java.lang.String的對象,Sheet的名字

Ø         net.sf.jasperreports.engine.JRCsvExporterParameter.FIELD_DELIMITER
這個參數是java.lang.String的對象,欄位之間的分隔符

Ø         net.sf.jasperreports.engine.JRCsvExporterParameter.RECORD_DELIMITER
這個參數是java.lang.String的對象,欄位之間的分隔符

Ø         net.sf.jasperreports.engine.JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR
這個參數是java.lang.Boolean的對象,是否輸出圖片到目錄  

Ø         net.sf.jasperreports.engine.JRHtmlExporterParameter.IMAGES_DIR_NAME
這個參數是java.lang.String的對象,圖片目錄的絕對路徑  

Ø         net.sf.jasperreports.engine.JRHtmlExporterParameter.IMAGES_DIR
這個參數是java.io.File的對象,圖片目錄

Ø         net.sf.jasperreports.engine.JRHtmlExporterParameter.IMAGES_URI
這個參數是java.lang.String的對象,通過Web訪問時圖片的URI

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