JasperReports,Jasper .[dʒæspə]碧玉html
16.1 JasperReports簡介java
JasperReport是一個強大、靈活的報表生成工具,可以展現豐富的頁面內容,並將之轉換成Excel、PDF、HTML或者XML格式。這個工具是開源的,徹底使用java編寫。mysql
JasperReport由一份XML格式的報表設計文件開始,通過編譯、填充、導出或預覽,能夠產生多種格式的報表文件。除此以外,它還提供了一個iPeport的開發工具,該工具能以所見即所得的方式來開發報表定義文件。spring
使用JasperReports開發報表的核心工做就是編輯一個報表設計文件。這個文件可使用手工方式編輯,這種方式效率低下,也可使用iReport。sql
16.1.1下載和安裝JasperReport數據庫
到官方站點:http://jasperreports.sourceforge.net下載(目前站點改成http://jasperforge.org/了,讀者注)。下載解壓後在dist文件夾內找到它的API文檔和JAR包apache
下載其餘開源項目框架
JasperReports框架生成一些格式的文檔可能依賴另一些開源項目,例如生PDF文檔依賴於iTest項目;生成Excel文件則依賴POI項目。eclipse
16.1.2 JasperReports初探jsp
以開發一個靜態報表爲例。
首先把jasperReports JAR包複製到工程的lib中
1、定義一個報表設計文件(.jrxml)
包含大量的JasperReports標籤,可使用iReport工具生成,讀者不要花太多時間在這份文件上
二、把報表設計文件編譯成報表文件(.jasper)
public static void main(String[] args)throws JRException {
JasperCompileManager
.compileReportToFile("static.jrxml","static.jasper");
System.out.println("成功編譯成JasperReport文件(*.jasper)");
}
三、填充數據(.jsprint)
public static void main(String[] args)throws JRException {
JasperFillManager
.fillReportToFile("static.jasper", null, new
JREmptyDataSource());//使用空參數,空的數據源
System.out.println("成功填充了一個報表文件(.jrprint)");
}
.jsprint文件已是一個能夠顯示的報表了,可是這份報表是格式無關的,它既能夠生成PDF格式,也能夠生成Excel格式
四、瀏覽報表
JasperReports使用JRViewer類瀏覽報表,這個類繼承了java裏的Jpanel.
public static void main(String[] args)throws JRException {
JRViewer jrv=new JRViewer("static.jrprint",false);
//C/S結構使用Jframe來裝載JRViewer。B/S則使用Applet來裝載
JFrame jf=new JFrame("報表預覽");
jf.add(jrv);
jf.pack();
jf.setVisible(true);
}
五、導出Excel文檔
這時要POI項目支持,下載網址:http://poi.apache.org/
public static void main(String[] args)throws JRException {
JasperPrint print=(JasperPrint)JRLoader
.loadObject("static.jrprint");
//excel文件導出器
JRXlsExporter exporter=new JRXlsExporter();
//導出的目標文件
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
//設置每張報表都寫在不一樣的文件裏
exporter.setParameter(JRXlsExporterParameter
.IS_ONE_PAGE_PER_SHEET, true);
exporter.exportReport();
System.out.println("成功建立了一個excel文檔");
}
除了JRXlsExporter導出器外,JasperReports還提供了以下文件導出器
JRCsvExporter:用於導出CSV格式文件
JRHtmlExporter:導出HTML文件
JRPdfExporter:導出PDF文件
JRRtfExporter:導出RTF格式文件
JRTextExporter:導出文本文件
JRXmlExport:導出XML格式文件
除此以外,JasperReports還提供了一個導出管理器:JasperExportManager,能夠將JasperPrint文件導出成HTML、PDF、XML格式的報表文件(沒有excel格式)。還提供了一個運行管理器:JasperRunManager,只能夠導出HTMl和PDF格式的文件
六、導出成PDF文件
須要iText項目支持,下載網點:http://itextpdf.com/
public static void main(String[] args) throws JRException{
JasperExportManager
.exportReportToPdfFile("static.jrprint","static.pdf");
System.out.println("成功建立一個PDF文件");
}
16.1.3JasperReports的開發流程
1、定義報表設計文件(.jrxml)
2、使用JasperCompileManager編譯.jrxml文件成.jasper文件
三、使用JasperFillManager工具填充.jasper文件成.jrprint文件
四、使用導出管理器JasperExportManager或各類格式的文件導出器(JRXxxExport)或JasperRunManager將.jrprint文件導出成各類格式。也可使用JRViewer直接瀏覽報表
16.1.4解決PDF報表的中文問題
在報表設計文件中(.jrxml)有中文字符的地方設置中文字符所用的PDF編碼,以及PDF字體。
在文件內容前增長如下元素:
<textElement>
<font pdfFontName=」STSong-Light」 pdfEncoding=」UniGB-UCS2-H」/>
</textElemtnt>
也能夠在文件中定義style對象,如
<style pdfFontName=」STSong-Light」 pdfEncoding=」UNIGB-UCS2-H」/>
16.2動態報表
1、定義報表設計文件(.jrxml)
能夠在設計報表時使用<parameter>元素定義一些傳入參數,如:
<parameter name=」book3」 isForPrompting=」false」
class=」java.lang.String」/>
定義以後,可使用$P{book3}輸出參數內容
二、編譯,同上
三、填充
經過Map對象傳入,如
Map<String, String> params=new HashMap<String, String>();
params.put("author", "李剛");
params.put("book1", "spring2.0寶典");
JasperFillManager.fillReportToFile("static.jasper", params,
new JREmptyDataSource());
四、瀏覽或導出文件,同上
16.2.2帶查詢的的報表
即系統的報表顯示來自數據庫裏的數據。
一、 定義報表設計文件
<!--定義一個參數 -->
<parameter name=」id」 isForPrompting=」true」 class=」java.lang.Integer」/>
isForPrompting:表示輸入參數是不是用於查詢語句
<!--定義查詢 -->
<queryString><![CDATA[select * from bool_table where book_id>$P{id}]]/>
<!--將查詢的字段定義成Field -->
<field name=」book_id」 class=」java.lang.Integer」/>
<!--輸出book_id的Field -->
$F{book_id}
建立報表設計文件時引用動態數據的方式
a、$V{variablesName}:訪問變量
b、$P(parameterName):訪問參數,參數經過Map對象填充
c、$F{fieldsName}:訪問字段,經過查詢數據庫返回
二、 編譯,同上
三、 填充
public static void main(String[] args)throws Exception {
Map<String, String> params=new HashMap<String, String>();
params.put("id", "1");
JasperFillManager.fillReportToFile("simpleQuery.jasper",
params, QueryFill.getConnection());
System.out.println("成功填充了一個報表文件(.jrprint)");
}
private static Connection getConnection()throws
ClassNotFoundException,SQLException{
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost/jee";
String user="root";
String password="123";
Class.forName(driver);
Connection conn=DriverManager
.getConnection(url,user,password);
return conn;
}
16.3使用iReport設計報表
iReport是一個所見即所得工具,能夠快速地編輯出精美的報表設計文件(.jrxml)
16.3.1下載和安裝iReport
下載網站:http://jasperforge.org/ (官方已有中文版的)
16.3.2使用iReport
以帶條件查詢的報表設計文件爲例,iReport的版本是3.7.1,版本不一樣菜單會有所不一樣
1、文件->new…->Report 新建文件.
2、創建數據庫鏈接
把數據庫驅動程序複製到iReport的lib路徑下,重啓iReport.(3.7版本已經有Mysql驅動,在目錄iReport-3.7.1\ide10\modules\ext下)
點擊」Report Datasources 」工具按鈕,再new一個新的數據庫鏈接,如圖:
三、編寫SQL查詢語句
若是SQL語句沒有錯誤,會查詢出表單字段,單擊OK,iReport會自動添加Fields。
4、設計報表佈局
在Report Elements中選擇元素添加到.jrxml,再把Fields元素拉到合格的位置。設計好.jrxml後,就可使用上面介紹的步驟生成須要格式的文檔
16.4安裝JasperReports插件
struts2項目中有這個插件,myeclipse 8中也有,名稱爲
struts2-jasperreports-plugin-x.jar,能夠到http://struts.apache.org/下載
使用解壓縮軟件打開其中的struts-plugin.xml文件,發現
<package name="jasperreports-default" >沒有擴展原有的struts-default,李剛老師已經向struts2項目組反映(在struts2.1.8版中,已經發現插件配置文件擴展了extends="struts-default")
16.5使用JasperReports報表
16.5.1建立生成報表的Action
生成報表的Action和大部struts2的Action同樣,但該Action使用List封裝大量VO(value object,也就是要在頁面顯示的javaBean)
1、VO
public class Book {
private int id;
private String name;
private String author;
public int getId() {
return id;
}
public Book(int id,String name,String author){
this.id=id;
this.name=name;
this.author=author;
}
}
2、Action
public class JasperAction extends ActionSupport {
public List getBookList(){
List<Book> result=new ArrayList<Book>();
result.add(new Book(1,"Spring2寶典","李剛"));
result.add(new Book(2,"輕量級J2EE企業應用實戰","李剛"));
result.add(new Book(3,"基於J2EE的Ajax寶典","李剛"));
return result;
}
}
16.5.2配置生成JasperReports報表的Action
須要增長一個類型爲jasper類型的Result,故應該讓該Action所在包繼承jasperreports default包。定義jasper類型的Result時,須要配置如下3個屬性:
1、 location:指定報表設計文件(.jasper)的位置
2、 format:指定生成報表文件的格式,如HTMl、PDF
3、 dataSource:指定一個集合屬性名,讓報表自動迭代輸出該集合中的VO對象
<package name="lee" extends="jasperreports-default">
<action name="export"
class="com.rain.shop.jasperreports.JasperAction">
<result name="sucess" type="jasper">
<param name="location">jasper\sample_report.jasper</param>
<param name="format">PDF</param>
<param name="dataSource">bookList</param>
</result>
</action>
</package>
16.5.3生成JasperReport報表
通過上面步驟,只要提供系統所需的報表設計文件便可,這個文件可使用iReport工具設計。按照上面VO的設計,在報表設計文件中增長3個字段,如:
<field name=」id」 class=」java.lang.Integer」/>
能夠直接在iReport添加,如:
有了field,就能夠在iReport上設計它們的位置和樣式。
最後向export.action發送請求,將會得到一份PDF文檔。系統會下載一份文件,後綴是
action。若是但願讓系統自動使用該報表文件的後綴是pdf,應該在Struts2攔截請求後綴中增長pdf,而後直接向export.pdf請求,將獲得一份名爲export.pdf文件。