說到iReport不得不先介紹Jasperreport,Jasperreport是一個報表製作程序,用戶需要按照它制定的規則編寫一個XML文件,然後得到用戶需要輸出的格式文件。它支持輸出的文件格式包括PDF,HTML,XML,XLS,CVS等等。而iReport就是一個製作Jasperreport的XML文件的可視化開發工具。只是一個UI。
二、安裝說明
2.1 基本安裝
現在最新的版本是iReport 0.5.1 (Aug 27, 2005).
下載後解壓然後在根目錄雙擊iReport.bat就可以用了,但是爲了可以使用external ttf font還必須要把 iReport-0.5.1/fonts 加到環境變量裏面去。
2.2 瞭解製作報表用的包
下載後到到 iReport-0.5.1/lib 裏看看,你就可以發現iReport的真面目了。
(1) jasperreports-1.0.1.jar
jasperreports是iReport的核心內容。它是一個強力的報表產生工具,他有能力描述豐富內容到屏幕上、到打印機或到PDF, HTML, XLS, CSV和XML文件。它完全用Java編寫的,並可在各種Java應用(包括J2EE或WEB應用)中用來產生動態內容。它的主要目的是以一種簡單而靈活的方式來幫助創建導向的頁面。
JasperReports組織根據在一個XML文件中定義的報表設計通過JDBC來接受來自一個關係數據庫中的數據. 爲了以數據來填充報表,報表設計必須首先被編譯。
jasperreports的官方網站:http://jasperreports.sourceforge.net/
iText是一個開放源碼的Java類庫,是用來生成PDF文件的。
iText的官方網站:http://itext.sourceforge.net
如果要在生成的pdf文件顯示中文等亞洲字符,還必須下載itext的亞洲字符包。
tTextAsian的官方下載地址:http://itextdocs.lowagie.com/downloads/iTextAsian.jar
(3) jfreechart-1.0.0-rc1.jar
jfreechart是一款免費的、功能強大的統計圖生成工具,可以直接生成PNG,JPG等各式的文件。
這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分佈圖、混合圖、甘特圖以及一些儀表盤等等。
jfreechart的官方下載地址:http://www.jfree.org/jfreechart/
(4) jcommon-1.0.0-rc1.jar
JCommon是一組有用的classes集合.它已經用在JFreeChart,JFreeReport與其它項目上. 這個類庫包含了以下功能: 文本工具類(text utilities), 用來顯示關於應用程序信息的用戶界面類,佈局定製管理器,一個日期選擇面板,序列化工具類,XML解析器支持類.
jcommon的官方下載地址:http://www.jfree.org/jcommon/
Apache的Jakata項目的POI子項目,目標是處理ole2對象。目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。
直接調用poi包的不是ireport,而是jasperreport。
poi的官方下載地址:http://www.apache.org/dyn/closer.cgi/jakarta/poi/
這些是用來製作報表用的包,所以可以用最新的版本來代替原有包。但是務必保持與項目中的包一致,因爲很多開源的項目都不向下兼容。(例如jasperreport)
三、製作jrxml、jasper
3.1 選擇語言
Tools->Option->General->Language
3.2 連接數據庫
資料來源->連結/資料來源
如果要使用mysql以外的數據庫,要保證jdbc包在環境變量裏。放到iReport-0.5.1/lib 下也可以。name相當於一個JNDI。添好後點擊test按鈕如果顯示成功就可以執行下一步了。
3.3 新建一個Report
定位可以控制報表是橫向的還是縱向的。Portrait是縱向,Landscape是橫向。
邊距是可以調整的。
3.4 基本域
title域用來放報表的總標題
pageHeaher域顧名思義頁頭
columnHeader域是用來放static text的,也就是不循環的部分。
detail域是用來放text field的,也就是循環部分。
pageFooter域是用來放本頁的統計參數的。
summary域是用來放整個表的統計參數的。
可以直接調整每個域的長度,也可以通過Band properties來調整。當然總長度是不會超過頁面的原長。
3.5 報表查詢
3.5.1 爲報表添加SQL查詢語句
資料來源->報表查詢
在Report SQL query裏填寫SQl語句。如果語句正確,在下面的field裏就會顯示正常的表字段。
3.5.2 爲報表添加動態字段
預覽->報表字段
把fields裏的字段直接拖到報表上就行了。
3.5.3 爲SQL語句添加參數
預覽->報表參數
在parameters裏新增一個參數
paratemeter name 是參數名,在SQL語句裏寫成"$P{參數名}"
paratemeter class type裏選擇參數類型。
注意:如果是int型的數據,最好在報表字段裏將該字段的Class type改成java.lang.String型的。
另外一種辦法,不管該字段原來是什麼數據類型,直接在paratemeter class type裏選擇java.lang.String類型,然後在Default value expression 填寫"Integer.toString(整數)"。
3.5.4 添加報表變量
預覽->報表變量 $V{變量名}
3.5.5 處理字體
3.5.5.1 基本設置
選中字段->右鍵->properties->font(雙擊也可以)
Report font 選擇全局的字體(僅限於該報表)
Font name 選擇在ireport裏面顯示的字體
Pdf font name 選擇在pdf裏面顯示的字體
Rotation 選擇內容是否旋轉(很有用的選項)
PDF Encoding 中文要用UniGB-UCS2-H,外部字體要選Identity-H
3.5.5.2 選擇外部字體
第一步 先在Pdf font name裏選擇External TTF font,然後在下面的Ture Type font裏選擇外部字體,當然要用的外部字體放在iReport-0.5.1/fonts目錄下面。
第二步 在web項目的WEB-INF/classes/下面放要用到的外部字體,才能在程序里正常顯示。
3.5.5.3 設定該報表的全局字體
預覽->報表字型
3.6 編譯jrxml
建立->編譯
編譯後生成一個後綴名爲jasper的binary文件,可以直接給程序調用。
四、web項目應用
4.1.1 需要放到項目裏的包
itext-1.3.1.jar
iTextAsian.jar
jasperreports-1.0.1.jar
4.1.2 輸出PDF注意事項:
4.1.3 jsp輸出PDF的例子
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JasperRunManager"%>//pdf
<%
String rowid = "1";//初始化變量
Connection conn= DriverManager.getConnection("proxool.test");//從數據源連接數據庫
//裝載jasper文件application
File exe_rpt = new File(application.getRealPath("/reports/test.jasper"));
//rowid就是iReport的變量$P{rowid}的名稱
Map parameters = new HashMap();
parameters.put("rowid",rowid);
try{
// fill
JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
// 生成pdf
byte[] bytes = JasperRunManager.runReportToPdf(exe_rpt.getPath(),parameters,conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes,0,bytes.length);
ouputStream.flush();
ouputStream.close();
conn.close();
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
}
4.2 jsp輸出EXCEL報表
4.2.1 需要放到項目裏的包
jasperreports-1.0.1.jar
poi-2.0-final-20040126.jar
4.2.2 輸出excel要注意的:
(1) 輸出excel報表必須fields的邊界剛好填充滿整個頁面,不然會有大量的空白出現。
(2) 刪除記錄最下面的空行需要加上參數
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
(3) 刪除多餘的ColumnHeader需要加上參數
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
(4) 在ireport裏給fields加上border,那輸出的excel就會有很黑的邊框,跟excel默認的灰度邊框就會很不協調。但是如果不加border,在輸出的excel裏就不會顯示每個表格的邊框。
解決方法是:
第一步 在選中字段->右鍵->properties->Common->Transparent 打上勾。
第二步 在輸出的jsp頁面加上參數
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
4.2.3 jsp輸出EXCEL的例子
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel
<%
String rowid = "1";
Connection conn= DriverManager.getConnection("proxool.test");
//裝載jasper文件application
File exe_rpt = new File(application.getRealPath("/excel/test_excel.jasper"));
//rowid就是iReport的變量$P{rowid}的名稱
Map parameters = new HashMap();
parameters.put("rowid",rowid);
try{
// fill
JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
// excel輸出
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 刪除記錄最下面的空行
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 刪除多餘的ColumnHeader
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 顯示邊框
exporter.exportReport();
byte[] bytes = oStream.toByteArray();
if(bytes != null && bytes.length > 0) {
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes,0,bytes.length);
ouputStream.flush();
ouputStream.close();
}else{
out.print("bytes were null!");
}
conn.close();
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
}
%>
4.3 jsp輸出html報表
沒有意義,不寫。
5.1 下載地址
iReport的官方網站:http://ireport.sourceforge.net/
jasperreports的官方網站:http://jasperreports.sourceforge.net/
tTextAsian的官方下載地址:http://itextdocs.lowagie.com/downloads/iTextAsian.jar
jfreechart的官方下載地址:http://www.jfree.org/jfreechart/
jcommon的官方下載地址:http://www.jfree.org/jcommon/
poi的官方下載地址:http://www.apache.org/dyn/closer.cgi/jakarta/poi/