jasperReports入門

1. JasperReports概述 
    JasperReports是一個基於Java的開源報表工具,它可以在Java環境下像其它IDE報表工具 一樣來製作報表。JasperReports支持PDF、HTML、XLS、CSV和XML等文件輸出格式。JasperReports是當前Java開發者最常用的報表工具。 
JasperReports採用LGPL開源協議。 

2. JasperReports的一些特性 

靈活的報表佈局
 
    JasperReports允許你將報表分割成多個部分:報表標題、表頭、報表內容、表尾和彙總,這樣你就可以分開進行處理,以達到靈活佈局的效果。

多種方式顯示數據 
JasperReports可以以文本或者圖形的方式顯示數據,可以通過使用表達式來產生顯示動態數據的報表。  

多種方式提供數據 
JasperReports可以以傳參數的方式將數據傳給報表,這個參數可以是任一Java類的實例;也可以通過數據源的方式傳遞。

支持多種數據源 
JasperReports可以通過多種數據源產生報表:JDBC、XML文件、POJOs(Plain Old Java Objects)以及任何實現了java.util.Map或者javax.swing.TableModel接口的Java類。

水印功能 
JasperReports可以在產生的報表上生成背景圖或者文字。 

子報表功能 
JasperReports可以產生子報表、嵌套報表。 

支持多種文件輸出格式 
JasperReports支持多種文件輸出格式:PDF、XLS(Excel)、RTF、HTML、XML、CSV等。

 
 
 
 
 

3. 實戰JasperReports 

準備: 
1. 首先在實戰前,我們需要下載JasperReports。 
您可以通過 
http://www.jasperforge.org/index.php?option=com_content&task=section&id=16&Itemid=277下載到最新版本的JasperReports 1.3.4(下載前,您首先需要註冊、登錄)。

2. 解壓下載的jasperreports-1.3.4-project.zip,將dist和lib目錄下的所有jar文件添加到項目的CLASSPATH中。 

HelloWorld 
在開始我們第一個JasperReports程序之前,讓我們先來了解下使用JasperReports創建報表的典型流程: 
創建一個XML格式的報表模板文件(JRXML文件),這個文件的後綴是.jrxml。JRXML文件,可以手工編輯完成,也可以使用可視化的設計工具來完成,例如JasperReports的官方圖形化報表設計器——iReport。 
通過調用JasperReports類庫中的相應方法(compileReportToFile())或者使用自定義的ant任務,把JRXML文件編譯成JasperReports本地二進制模板,這個模板通常被稱爲Jasper文件。 
通過爲Jasper文件提供所需的數據,產生最終的報表。 
導出生成的報表。 

Ok,讓我們開始HelloWorld吧! 
建立一個JRXML文件,HelloReportWorld.jrxml: 

<?xml version="1.0"?> 
<!DOCTYPE jasperReport 
PUBLIC "-//JasperReports//DTD Report Design//EN" 
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 
<jasperReport name="HelloReportWorld"> 
<parameter name="reportTitle" class="java.lang.String"/> 
<parameter name="author" class="java.lang.String"/> 
<parameter name="startDate" class="java.lang.String"/> 
<title> 
<band height="60"> 
<textField> 
<reportElement x="0" y="10" width="500" height="40"/> 
<textElement textAlignment="Center"> 
<font size="24"/> 
</textElement> 
<textFieldExpression class="java.lang.String"> 
<![CDATA[$P{reportTitle}]]> 
</textFieldExpression> 
</textField> 
<textField> 
<reportElement x="0" y="40" width="500" height="20"/> 
<textElement textAlignment="Center"/> 
<textFieldExpression class="java.lang.String"> 
<![CDATA["Run by: " + $P{author} 
+ " on " + $P{startDate}]]> 
</textFieldExpression> 
</textField> 
</band> 
</title> 
<detail> 
<band height="200"> 
<staticText> 
<reportElement x="0" y="0" width="500" height="20"/> 
<text><![CDATA[Hello Report World!]]></text> 
</staticText> 
</band> 
</detail> 
</jasperReport> 

這個文件中,使用了<parameter>、<title>等模板元素,下面來具體介紹JRXML模板元素: 
<jasperReport>:根元素 
<import>:用於導入Java類或包 
<reportFont>:用於定義顯示在報表上的文本的字體 
<parameter>:用於定義報表參數。參數值通過調用JasperReports API中的相關方法,利用 
java.util.Map來提供。 
<queryString>:用於定義從數據庫中得到數據的SQL查詢語句。 
<field>:用於將利用數據源或者查詢得到的數據映射到報表模板中。 
<variable>:用於簡化報表模板。將報表中多次使用的報表表達式指定給variable。 
<group>:用於報表分組。 
<background>:用於定義報表中的頁面背景。 
<title>:用於定義報表標題。只在報表的開頭出現一次。 
<pageHeader>:用於定義表頭。在報表每個頁面的開頭都出現。 
<columnHeader>:用於定義列頭部分。 
<detail>:用於定義報表的細節部分。 
<columnFooter>:用於定義列尾部分。 
<pageFooter>:用於定義表尾。在報表每個頁面的底部都出現。 
<lastPageFooter>:用於定義報表最後一個頁面的表尾。 
<summary>:用於報表彙總。 


<band>:用於包含顯示在報表中的數據。前面介紹的每個元素都包含一個<band>元素作爲它的子元素。
 
 
 

看完了各個模板元素的具體含義,下面讓我們看看如何利用這個模板產生報表。 
建立一個Java類文件,HelloReportWorld.java: 

import java.util.HashMap; 
import java.util.Map; 
import net.sf.jasperreports.engine.JREmptyDataSource; 
import net.sf.jasperreports.engine.JRException; 
import net.sf.jasperreports.engine.JasperCompileManager; 
import net.sf.jasperreports.engine.JasperExportManager; 
import net.sf.jasperreports.engine.JasperFillManager; 
import net.sf.jasperreports.engine.JasperPrint; 
import net.sf.jasperreports.engine.JasperReport; 
import net.sf.jasperreports.view.JasperViewer; 

public class HelloReportWorld { 
public HelloReportWorld() { 

public static void main(String[] args) { 
String reportSource = "./report/templates/HelloReportWorld.jrxml"; 
String reportDest = "./report/results/HelloReportWorld.html"; 
Map<String, Object> params = new HashMap<String, Object>(); 
params.put("reportTitle", "Hello Report World"); 
params.put("author", "Thomas Qi"); 
params.put("startDate", (new java.util.Date()).toString()); 
try { 
JasperReport jasperReport = 
JasperCompileManager.compileReport(reportSource); 
JasperPrint jasperPrint = 
JasperFillManager.fillReport( 
jasperReport, params, new JREmptyDataSource()); 
JasperExportManager.exportReportToHtmlFile( 
jasperPrint, reportDest); 
JasperViewer.viewReport(jasperPrint); 

catch (JRException ex) { 
ex.printStackTrace(); 




通過以下代碼: 

try { 
JasperReport jasperReport = 
JasperCompileManager.compileReport(reportSource); 
JasperPrint jasperPrint =JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource()); 
JasperExportManager.exportReportToHtmlFile(jasperPrint, reportDest); 
JasperViewer.viewReport(jasperPrint); 


可以看出使用JasperReports創建報表典型流程中的2、3、4步驟,分別對應於JasperCompileManager.compileReport()、JasperFillManager.fillReport()、 
JasperExportManager.exportReportToHtmlFile()。 
我們將報表導出成HTML格式。 


 
 
 
 
到目前爲止,一個簡單的JasperReports應用就完成了
 
 
 
 

JDBC數據源報表 

重點還是JRXML文件: 
<?xml version="1.0"?> 
<!DOCTYPE jasperReport 
PUBLIC "-//JasperReports//DTD Report Design//EN" 
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 
<jasperReport name="DbReport"> 
<parameter name="reportTitle" class="java.lang.String"/> 
<parameter name="author" class="java.lang.String"/> 
<parameter name="startDate" class="java.lang.String"/> 
<queryString> 
<![CDATA[SELECT * FROM user ORDER BY id]]> 
</queryString> 
<field name="id" class="java.lang.Integer"/> 
<field name="email" class="java.lang.String"/> 
<field name="password" class="java.lang.String"/> 
<title> 
<band height="60"> 
<textField> 
<reportElement x="0" y="10" width="500" height="40"/> 
<textElement textAlignment="Center"> 
<font size="24"/> 
</textElement> 
<textFieldExpression class="java.lang.String"> 
<![CDATA[$P{reportTitle}]]> 
</textFieldExpression> 
</textField> 
<textField> 
<reportElement x="0" y="40" width="500" height="20"/> 
<textElement textAlignment="Center"/> 
<textFieldExpression class="java.lang.String"> 
<![CDATA["Create by: " + $P{author} 
+ " on " + $P{startDate}]]> 
</textFieldExpression> 
</textField> 
</band> 
</title> 

<columnHeader> 
<band height="30"> 
<rectangle> 
<reportElement x="0" y="0" width="500" height="25"/> 
<graphicElement/> 
</rectangle> 
<staticText> 
<reportElement x="5" y="5" width="50" height="15"/> 
<textElement/> 
<text><![CDATA[ID]]></text> 
</staticText> 
<staticText> 
<reportElement x="55" y="5" width="150" height="15"/> 
<text><![CDATA[Email]]></text> 
</staticText> 
<staticText> 
<reportElement x="205" y="5" width="255" height="15"/> 
<text><![CDATA[Password]]></text> 
</staticText> 
</band> 
</columnHeader> 

<detail> 
<band height="20"> 
<textField> 
<reportElement x="5" y="0" width="50" height="15"/> 
<textElement/> 
<textFieldExpression class="java.lang.Integer"> 
<![CDATA[$F{id}]]> 
</textFieldExpression> 
</textField> 
<textField> 
<reportElement x="55" y="0" width="150" height="15"/> 
<textElement/> 
<textFieldExpression class="java.lang.String"> 
<![CDATA[$F{email}]]> 
</textFieldExpression> 
</textField> 
<textField> 
<reportElement x="205" y="0" width="255" height="15"/> 
<textElement/> 
<textFieldExpression class="java.lang.String"> 
<![CDATA[$F{password}]]> 
</textFieldExpression> 
</textField> 
</band> 
</detail> 
</jasperReport> 

這個示例與HelloWorld的主要區別,在於黑體部分。 
<queryString> 
<![CDATA[SELECT * FROM user ORDER BY id]]> 
</queryString> 

這裏定義了從user表中查詢數據的SQL語句,user表中包含id, email和password三個字段; 
<field name="id" class="java.lang.Integer"/> 

用於定義user表中的字段; 
<textFieldExpression class="java.lang.Integer"> 
<![CDATA[$F{id}]]> 



這是將查詢出的對應字段的數據填充到報表中。
 
 

使用這個模板的客戶端核心代碼: 

try { 
JasperReport jasperReport = JasperCompileManager.compileReport(reportSource); 
// Make the driver class available. 
Class.forName("com.mysql.jdbc.Driver"); 
// Create a connection to pass into the report. 
java.sql.Connection conn = 
DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456"); 
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, conn); 
JRCsvExporter csvExporter = new JRCsvExporter(); 
csvExporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint); 
csvExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,reportDest); 
csvExporter.exportReport(); 
JasperViewer.viewReport(jasperPrint); 
} catch (JRException e) { 
e.printStackTrace(); 

catch (ClassNotFoundException ex) { 
ex.printStackTrace(); 

catch (SQLException ex) { 
ex.printStackTrace(); 



JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, conn); 
這句將HelloWorld中空的JasperReports數據源替換成了一個叫做conn的數據庫連接參數,這也是程序的重點所在! 
這次,我們將報表導出成CSV格式。 



 
 
 
Ok,通過這個JDBC數據源報表的應用,您該掌握瞭如何以JDBC的方式獲取數據並創建報表。 
可是您會發現: 
<queryString> 
<![CDATA[SELECT * FROM user ORDER BY id]]> 
</queryString> 

在OO大行其道的今天,這種直接寫SQL語句的做法,就顯得太過程化了。POJOs?對,就是它!JasperReports也提供了對POJOs數據源支持。  
 
 
POJOs數據源報表 

建立一個簡單的Java類文件(POJOs),User.java: 
public class User implements java.io.Serializable { 
private Integer id; 
private String email; 
private String password; 

public User() { 

public User(String email, String password) { 
this.email = email; 
this.password = password; 

public User(Integer id, String email, String password) { 
this.id = id; 
this.email = email; 
this.password = password; 


public Integer getId() { 
return this.id; 

public void setId(Integer id) { 
this.id = id; 

public String getEmail() { 
return this.email; 

public void setEmail(String email) { 
this.email = email; 

public String getPassword() { 
return this.password; 

public void setPassword(String password) { 
this.password = password; 



JRXML文件 

基本和JDBC數據源的一致,只是這裏不再需要: 
<queryString> 
<![CDATA[SELECT * FROM user ORDER BY id]]> 
</queryString> 

重點看客戶端核心代碼: 
try { 
JasperReport jasperReport = JasperCompileManager.compileReport(reportSource); 
ArrayList reportRows = new ArrayList(); 
reportRows.add(new User(1, "[email protected]", "123456")); 
reportRows.add(new User(1, "[email protected]", "000000")); 
reportRows.add(new User(3, "[email protected]", "abc123")); 
reportRows.add(new User(3, "[email protected]", "987654321")); 
JRDataSource dataSource = new JRBeanCollectionDataSource(reportRows); 
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, 
params, dataSource); 
JasperExportManager.exportReportToPdfFile(jasperPrint, reportDest); 
JasperViewer.viewReport(jasperPrint); 
} catch (JRException e) { 
e.printStackTrace(); 



JRDataSource dataSource = new JRBeanCollectionDataSource(reportRows); 
這次,我們把使用POJOs的ArrayList作爲了數據源。 
我們將報表導出成pdf格式。 
發佈了4 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章