環境配置
1 正確安裝配置java的jdk
2 將ireport放到c:/ireport
3 將ant放到c:/ant(我用的是bea的ant路徑是D:/bea/weblogic81/server/ant)
4 將jasperreports-1.2.0.jar 放置到當前classpath中(沒有加,我使用的Ireport/lib下已經存在了)
5 將itext-1.3.1.jar放置到c:/ireport/lib(沒有加,我使用的Ireport/lib下已經存在了)
6 修改ireport/ireport.bat檔案,加入以下內容
set JAVA_HOME=C:/j2sdk1.4.2
set ANT_HOME=D:/bea/weblogic81/server/
set IREPORT_HOME=c:/ireport rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport
我修改的是:
set JAVA_HOME=C:/j2sdk1.4.2
set ANT_HOME=D:/bea/weblogic81/server/
set IREPORT_HOME=F:/backup/iReport-1.2.0 rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport
(不過對以上修改,感覺沒有什麼用處)
7 提供一個正常提供服務的資料庫
現在高版本的ireport是不需要進行配置,可以直接使用的.
瞭解製作報表用的包
1 jasperreports-1.0.1.jar jasperreports是iReport的核心內容,jsperreport是一個報表製作程式,用它的規則制定一個xml檔案,然後編譯產生一個.jsper檔案,這個.jsper檔案是我們真正使用的,它很象.jsp檔案,使用的是它編譯後的servlet. (http://jasperreports.sourceforge.net/)
2 itext-1.3.1.jar iText是一個開放源碼的Java類庫,是用來產生PDF檔案的。如果要在產生的pdf檔案顯示中文等亞洲字元,還必須下載itext的亞洲字元包iTextAsian.jar (http://itextdocs.lowagie.com/downloads/iTextAsian.jar)
3 jfreechart-1.0.0-rc1.jar jfreechart是一款免費的、功能強大的統計圖產生工具,可以直接產生PNG,JPG等各式的檔案。 (http://www.jfree.org/jfreechart/)
4 jcommon-1.0.0-rc1.jar JCommon是一組有用的classes集合.它已經用在JFreeChart,JFreeReport與其它項目上. 這個類庫包含了以下功能: 文本工具類(text utilities), 用來顯示關於應用程式資訊的使用者介面類, 布局定製管理器, 一個日期選擇面板, 序列化工具類, XML解析器支援類. (http://www.jfree.org/jcommon/)
5 poi-2.0-final-20040126.jar Apache的Jakata項目的POI子項目,目標是處理ole2對象。目前比較成熟的是HSSF介面,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv產生的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。直接調用poi包的不是ireport,而是jasperreport。 (http://www.apache.org/dyn/closer.cgi/jakarta/poi/)
使用介紹
1 啟動:點擊ireport/ireport.bat啟動
2 修改語言環境:tools-option-general中language中更改-apply
3 建立報表 file-new document 輸入名字-ok Portrait是縱向,Landscape是橫向。
4 串連資料來源 datasource-connection/datasource-new-connections porperties- 輸入名字-選擇jdbc Driver,jdbc url-輸入username和password,-test測試通過表明資料來源串連正確-save儲存 (注意:必須保證資料庫驅動在lib目錄下)
5 基本域說明
title域用來放報表的總標題
pageHeaher域顧名思義頁頭
columnHeader域是用來放static text的,也就是不迴圈的部分。
detail域是用來放text field的,也就是迴圈部分。
pageFooter域是用來放本頁的統計參數的。
summary域是用來放整個表的統計參數的。
可以直接調整每個域的長度,也可以通過Band properties來調整 (在我的項目中,只設定的title和detail,在title中顯示報表的總標題和所有parameters欄位,在detail中顯示需要迴圈的列表欄位)
6 在報表中添加欄位static text edit-insert element -static text 滑鼠拖拉添加在頁面中雙擊或者右鍵properties在static text Tab 中輸入欄位名字,如果顯示有亂碼,font-font name中選擇"中文GB2312" border 中可以設定表格邊線樣式
7 在報表中添加欄位text field edit-insert element -text field 滑鼠拖拉添加在頁面中雙擊或者右鍵properties在text field 中輸入欄位名字, 樣式如同$F{text_field_name},
f表示為field變數,是資料庫中抽取出來的,你想在報表中顯示的資料庫內容,
p為parameter參數,是應用需要提供給報表的入口,比如想在報表被解釋的時候提供where語句的條件值, 就可以用$P(parameterName)比如: select * from bugs where proname=$P{projectName} order by proname,modulename
v為變數(顯示字型顏色為綠色,表示格式正確) border 中可以設定表格邊線樣式
8 調整報表布局滑鼠拖動各個欄位,拼接想要的報表布局,如果滑鼠點擊欄位, 顯示為紅色,說明該欄位跨越了兩個域顯示為綠色,說明兩個欄位疊加顯示為藍色,說明該欄位位置正確
9 報表添加SQL查詢語句 資料來源->報表查詢(datasource-report query) 在Report SQL query裡填寫SQl語句。如果語句正確,在下面的field裡就會顯示正常的表欄位。 (可以從顯示的所有欄位中選取想用做field的欄位,點擊ok後,自動添加為field動態欄位)
10 為報表添加動態欄位預覽->報表欄位(view-Fields) 建立一個欄位,欄位名字必須和報表中Fields中添加名字一直,同時必須是sql結果集中存在的. (把fields裡的欄位直接拖到報表上也行)
11 為SQL語句添加參數 預覽->報表參數(view-parameters) 在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(整數)"。
12 添加報表變數 預覽->報表變數 $V{變數名}(沒有用到過!)
13 處理字型 選中欄位->右鍵->properties->font(雙擊也可以) Report font 選擇全域的字型(僅限於該報表) Font name 選擇在ireport裡面顯示的字型 Pdf font name 選擇在pdf裡面顯示的字型 Rotation 選擇內容是否旋轉(很有用的選項) PDF Encoding 中文要用UniGB-UCS2-H,外部字型要選Identity-H
14 設定該報表的全域字型 預覽->報表字型(view-font)
15 編譯jrxml 建立->編譯 (build-compile) 編譯後產生一個尾碼名為jasper的binary檔案,可以直接給程式調用。
web項目應用
1 jsp輸出PDF報表
需要放到項目裡的包 itext-1.3.1.jar iTextAsian.jar jasperreports-1.0.1.jar 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"%>
<%
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());
}
%>
}
jsp輸出EXCEL報表
需要放到項目裡的包 jasperreports-1.0.1.jar poi-2.0-final-20040126.jar
輸出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);
2 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());
}
%>
}
總結 ireport可以顯示圖表,餅圖,曲線圖等,也可以顯示符合報表
JasperReports介紹:
使用JasperReports產生報表是非常簡單的,僅僅使用net.sf.jasperreports.engine包中的幾個類即可完成報表的產生、預覽、列印、匯出等各個功能。
1. net.sf.jasperreports.engine.JasperCompileManager類。
使用這個類的幾個靜態方法即可完成對報表的編譯工作(具體參見api文檔)
編譯完成後可以JasperCompileManager有兩種處理方式:
1> 返回一個JasperReport對象
2> 在.jrxml檔案所在的目錄產生一個.jasper檔案
這兩種方式是由程式員自己選擇的。不過我比較傾向使用.jasper檔案,畢竟報表的結構不是每天都在改動,所以每次重新編譯報表並不是很划算。
2. net.sf.jasperreports.engine.JasperFillManager類
這個類的作用是用資料填充報表。它可以使用JasperReport對象也可以使用。jasper檔案做為報表範本。
它同樣有2中處理方式:
1> 返回一個JsaperPrint對象。
2> 在.jasper檔案所在目錄產生一個.jrprint檔案
這個類使用net.sf.jasperreports.engine.JRDataSource介面的實現做為資料來源。任何實現了JRDataSource的類均可做為資料來源使用
在net.sf.jasperreports.engine.data包中定義了一些資料來源,可根據自己的需要選擇。這裡我使用的是JRTableModelDataSource做為
資料來源(因為我的報表還要顯示在Table中)。
3. net.sf.jasperreports.engine.JasperPrintManager和net.sf.jasperreports.engine.JasperExportManager
者兩個類的作用是列印、匯出報表
他們使用 JasperPrint 和 .jrprint檔案做為輸入。
可以根據自己的需要使用裡面的方法。
例:
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
public class CompileReport {
public static void main(String args[]) {
try {
//編譯report.jrxml並在report.jrxml所在的目錄中產生report.jasper檔案
JasperCompileManager.compileReportToFile("report.jrxml");
//填充資料,這裡使用的是JREmptyDataSource
JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));
//預覽報表,false代表不是使用xml檔案。
JasperViewer view = new JasperViewer("reports.jrprint", false);
view.pack();
view.setVisible(true);
}
catch (Exception e) {
e.printStackTrace()
}
}
}
http://www.heci.net 賀詞網。]
JasperReports學習筆記
版本:jasperreports-0.6.7
學習資料來源:http://jasperreports.sourceforge.net
一、 需求(requirements)
JasperReports要用到的工具和類
1. JDK(java開發環境)
JDK 1.2.2 or higher
2. XML
JAXP 1.1 XML Parser(XML解析器)
Jakarta Commons Digester Component (version 1.1 or later)
http://jakarta.apache.org/commons/digester/
Jakarta Commons BeanUtils Component (version 1.1 or later)
http://jakarta.apache.org/commons/beanutils/
Jakarta Commons Collections Component (version 1.0 or later)
http://jakarta.apache.org/commons/collections/
Jakarta Commons Logging Component (version 1.0 or later)
http://jakarta.apache.org/commons/logging/
3. JDBC(串連資料庫用)
JDBC 2.0 Driver
4. PDF(轉換為PDF檔案用到)
iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares
(version 1.01 or later)
http://www.lowagie.com/iText/
5. XLS(轉換為excel檔案用)
Jakarta POI (version 2.0 or later)
http://jakarta.apache.org/poi/
二、快速瞭解(quick how to)
1. Main classes(主要的類)
用JasperReports 時,用到的主要類
net.sf.jasperreports.engine.JasperCompileManager
net.sf.jasperreports.engine.JasperFillManager
net.sf.jasperreports.engine.JasperPrintManager
net.sf.jasperreports.engine.JasperExportManager
這些類提供了很多靜態方法,用來編譯、填充、列印和匯出報表。詳細資料請參考JasperReports的javadoc文檔。
net.sf.jasperreports.view.JasperViewer
此類用來預覽產生的報表(generated reports.)。
net.sf.jasperreports.view.JasperDesignViewer
此類用來預覽報表設計(view the report design)。
2. 編譯報表設計Compiling a report design
xml檔案定義報表設計(report design)。編譯報表設計(report design)產生報表(generate reports)。網頁http://jasperreports.sourceforge.net/quick.how.to.html中介紹用net.sf.jasperreports.engine.JasperCompileManager類的靜態方法compileReportXXX()來編譯報表設計(report design)。但是JasperCompileManager不贊成使用此方法編譯報表設計(report design),推薦使用JasperCompileManager的方法compileReportXXX()來代替。
編譯報表設計(report design)時,jasperreports engine首先檢查模板,確定是否一致,然後轉換所有的報表運算式(report expressions),最後產生.jasper檔案。 要想使編譯工作儘可能靈活,你可以實現介面net.sf.jasperreports.engine.design.JRCompiler。
3.預覽報表設計 Viewing a report design
使用net.sf.jasperreports.view.JasperDesignViewer的程式來預覽。他的main()方法接受報表設計檔案名稱(xml)或者編譯後的.jasper檔案。
4. 填充報表 Filling a report
編譯報表設計(xml檔案)得到報表檔案(.jasper),再調用net.sf.jasperreports.engine.JasperFillManager類的方法fillReportXXX(),可以得到報表(JasperPrint)。
5. 預覽報表 Viewing a report
Generated reports can be viewed using the net.sf.jasperreports.view.JasperViewer application.
In its main() method, it receives the name of the file which contains the report to view.
我沒有測試成功。
6. Printing a report
Generated reports can be printed using the printReport(), printPage() or printPages() static methods exposed by the net.sf.jasperreports.engine.JasperPrintManager class.
7. Exporting to PDF, HTML, XLS, CSV or XML format
填充報表檔案(.jasper檔案)得到報表(JasperPrint)後,可以使用net.sf.jasperreports.engine.JasperExportManager類的方法exportReportXXX()匯出為各種格式的檔案PDF,HTML,XML。
After having filled a report, we can also export it in PDF, HTML or XML format using the exportReportXXX() methods of the net.sf.jasperreports.engine.JasperExportManager class.
三、JasperReports的工作流程:
根據上圖的流程,JasperReports做報表有一下步驟:
1、 報表設計,可以用ireport視覺化檢視來實現,產生xml檔案。完成後,可以直接到步驟3,直接編譯xml檔案。
2、 如果已經存在報表設計檔案(xml檔案),可以用net.sf.jasperreports.engine.xml.JRXmlLoader.load()方法載入報表設計,該方法返回JasperDesign對象,通過JasperDesign對象,可以修改報告設計,比如:添加、刪除欄位,添加、刪除變數,添加、刪除分組,等等。
3、 完成報表設計後,接下來就可以編譯報設計,編譯報表設計可以用類net.sf.jasperreports.engine.JasperCompileManager的compileReport()方法來實現,該方法可以編譯xml檔案或JasperDesign對象,產生JasperReport對象,JasperReport對象可序列化,能夠儲存為檔案(通常是.jasper檔案)。類net.sf.jasperreports.engine.JasperCompileManager還可以把報錶轉化為報表設計檔案(xml檔案)。得到JasperReport對象(可從.jasper檔案執行個體化一個JasperReport對象)後,給報表填充資料產生JasperPrint對象。JasperPrint對象可序列化,儲存為檔案。有了JasperPrint對象後,可以列印、瀏覽、轉換為其他格式的檔案,如:PDF,HTML,XML,XLS,CSV等等,這些操作就是我們想得到的最終結果。儘管JasperPrintManager類可以匯出為PDF,XML檔案,但是不贊成使用JasperPrintManager類來匯出,建議用JasperExportManager類來匯出PDF,HTML,XML檔案;要匯出XLS和CSV檔案,用專業的匯出類net.sf.jasperreports.engine.export.JRXlsExporter類和net.sf.jasperreports.engine.export.JRCsvExporter類
匯出為XLS的程式碼片段:
JRXlsExporter exporter = new JRXlsExporter();//建立執行個體
//設計參數
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, strDestFile);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.exportReport();//匯出
匯出為CSV檔案和XLS類似。