JasperReport
2.1 簡介
JasperReport 是產生報表的核心部分,首先要先有個xml文件,然後根據jasperreports.dtd編譯成jasper文件(以.jasper結尾),我們真正 要使用的是編譯以後的.jasper文件。xml文件的內容包括對報表樣式的定義,數據來源,參數等等,它可以支持的輸出格 式:PDF,HTML,XML,XLS,CVS等。
在沒有iReport之前,需要花費大量的時間去熟悉JasperReport的文檔以及自己去寫定義報表的xml,現在你一定對iReport的作用有些瞭解吧
2.2 工作流程介紹
如果我們已經用iReport已經將xml編譯爲.japser文件後,上圖中編譯部分的工作就可以省略,JasperFillManager根據 定義的數據源和報表模版填充jasperPrint,有數據的報表就在這個部分填充的。如果我們要導出到不同類型的檔案,則需要通過 JasperExportMananger,也可以自己寫一個類,但是要實現net.sf.jasperreports.engine. JRExporter這個接口。JaserReport提供的exporter再下面一節介紹。
2.3 重要的Class和Interface詳細介紹
Ø Class net.sf.jasperreports.engine.JasperReport
這個類的對象通過net.sf.jasperreports.engine.util.JRLoader從.jasper文件中獲取,爲用數據填充 和產生報表做準備,當用數據填充報表的時候,運行時求各種各樣報表表達式的值。對象中包含了報表的各種元素,例如報表的大小,顯示位置,顯示的欄位,圖片 信息等等。
Ø Class net.sf.jasperreports.engine.util.JRLoader
所有JasperReports 主要的功能,象報表編輯,報表填充及導出,經常用到序列化的對象,net.sf.jasperreports.engine.util.JRLoader可以幫助從文件或者URLs或者輸入流中裝載這些被序列化的對象。
Ø Class net.sf.jasperreports.engine.JasperPrint
這個類的對象是通過填充類根據net.sf.jasperreports.engine.JasperReport的對象用數據填充後的結果,這樣可以被很直觀的被別的類引用,將報表輸出到網絡或者文件
Ø Interface net.sf.jasperreports.engine.JRDataSource
JasperReports是一個非常靈活的報表工具,在數據來源方面更是體現了這一點,程序員可以自己定義不同類型的數據源,前提是實現這個接 口,我們的數據源就可以千變萬化,數據源可以是XML,CSV,TEXT,Object List 等等,在後面的章節詳細描述如何實現該接口
Ø Class net.sf.jasperreports.engine.export.JExcelApiExporter
報表產生到一個EXCEL文檔,如果報表裏面有圖形,一定要用這個exporter
Ø Class net.sf.jasperreports.engine.export.JRCsvExporter
報表產生到一個CVS文檔
Ø Class net.sf.jasperreports.engine.export.JRGraphics2Dexporter
報表輸出到Graphics2D,Java2D應用的時候纔會用到
Ø Class net.sf.jasperreports.engine.export.JRHtmlExporter
報表產生到一個HTML文檔
Ø Class net.sf.jasperreports.engine.export.JRPdfExporter
報表產生到一個PDF文檔
Ø Class net.sf.jasperreports.engine.export.JRRtfExporter
報表產生到一個RTF文檔
Ø Class net.sf.jasperreports.engine.export.JRTextExporter
報表產生到一個TXT文檔
Ø Class net.sf.jasperreports.engine.export.JRXlsExporter
報表產生到EXCEL文檔,用這個exporter,報表中的圖形將不被輸出
Ø Class net.sf.jasperreports.engine.export.JRTextExporter
報表產生到XML文檔
2.4 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
2.5 JasperReport內置的常用參數說明
這些參數是放到java.util.Map,在填充報表的時候使用
Ø REPORT_CONNECTION
這個參數是java.sql.Connection對象,在用Report Query的時候調用
Ø REPORT_DATASOURCE
這個參數是實現了接口net.sf.jasperreports.engine.JRDataSource的對象,在填充報表的時候調用
Ø IS_IGNORE_PAGINATION
這個參數是java.lang.Boolean對象,報表是否忽略分頁
Ø REPORT_MAX_COUNT
這個參數是java.lang.Integer對象,報表顯示的最大記錄數
Ø DRAWING_SUPPLIER
這個參數是實現了接口org.jfree.chart.plot.DrawingSupplier對象,定義自己的填充色
這個參數不是原來JasperReport定義的,是後來加上的
2.6 JasperReport內置的常用變量說明
Ø PAGE_NUMBER
當前頁面的頁碼,即第幾頁
Ø REPORT_COUNT
整個報表填充完成後,總的記錄數
Ø PAGE_COUNT
當前頁面的記錄數
Ø COLUMN_COUNT
當前記錄的行數,每個頁面的計數會復位後重新計算。
2.7 如何實現接口JRDataSource
當調用填充報表過程的時候,負責填充的類會通過這個接口獲取到相應的數據,jasperreport提供了幾個實現了這個接口的類:
Ø net.sf.jasperreports.engine.JRResultSetDataSource
這個是通過JDBC訪問關係數據庫得到的數據源
Ø net.sf.jasperreports.engine.data.JRTableModelDataSource
這個是調用Java Swing tables得到的數據源
Ø net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
這個是調用collections得到的數據源
我們要定義自己的DataSource,需要實現下面兩個方法:
² public boolean next() throws JRException;
報表填充數據的時候,填充每一條記錄之前都會調用這個方法,將指針移動到下一條數據,如果有下一條數據返回true,否則返回false。
² public Object getFieldValue(JRField jrField) throws JRException;
當填充報表的每一個欄位的時候,會調用這個方法獲取填充的值。JrField是報表裏面定義顯示欄位的對象。在iReport工具裏面可以定義jrField的名字類型以及description
2.8 JasperReport如何繪製圖形報表
JasperReport本身是不繪製圖形報表的,JasperReport是通過調用JFreeChart產生的image顯示到報表的頁面裏,所以我們還需要再瞭解JFreeChart,我們將再後面的章節介紹JFreeChart。
3 iReport
3.1 簡介
iReport 就是一個可視化的報表製作工具,代替原來人工書寫定義報表的xml,我們可以用iReport做下面的一些工作:
n 用iReport可以畫出我們需要的報表的模版,例如在某個位置顯示甚麼內容,顯示風格的定義等等
n 定義需要傳給jasperReport的參數,例如前面一章將提到的內置參數,也可以自定義需要傳遞的參數
n iReport的提供的功能可以預覽報表
n 將報表模版的xml編譯爲.jasper文件,供jasperreport調用生成我們需要的報表
n 除了可以使用前面一章提到的內置變量,我們也可以定義自己的變量
3.2 報表模版佈局
3.2.1 區域位置介紹
一般情況下規則如下:
n title
這個區域的資料整個報表只顯示一次
n pageHeader
這個區域的資料每一頁的頂部顯示一次
n columnHeader
這個區域的資料每一頁的頂部顯示一次,位置在pageHeader的後面
n detail
這個區域的資料有多少筆記錄就顯示多少次
n columnFooter
這個區域的資料每一頁的底部只顯示一次,位置在pageFooter,lastPageFooter的前面
n pageFooter
這個區域的資料每一頁的底部只顯示一次,如果有定義lastPageFooter,則最後一頁不顯示
n lastPageFooter
這個區域的資料在報表最後一頁的底部只顯示一次
n summary
這個區域的資料在最後一條記錄後面顯示,位置在columnFooter, pageFooter,lastPageFooter的前面
3.2.2 如何設置區域
點擊工具欄的 ,會彈出下面的窗口,在Band height處輸入高度後,點Apply按鈕就可以了。
3.3 如何定義Fields,Parameters,Variables
報表的顯示數據基本由這三個部分組成。
Fields指的是定義的數據源中對象的屬性
Parameters指的是在調用填充報表的對象前,將所需要的參數放到Map對象裏
Variables指的是按一定的邏輯通過調用Fields或者Parameters或者Variables組織一個計算表達式
點擊工具欄 ,彈出一個對象屬性的窗口
Ø Fields
點擊新增按鈕增加一個field,field包括3個特性:
name:唯一標識
Class type:表示field是哪個類的對象例如:java.lang.Integer等等,不能爲基本變量類型如int,double等
Description:field的描述,在特定應用時會用到,例如自己定義的xml數據源,可能需要從不同的Node獲取資料,這個時候需要通過description來識別,在後面的具體制作報表的時候可以看到這點。
JasperReport會通過這幾個屬性產生一個JRField的對象。
在報表模版裏書寫的標識爲$F{field name}
Ø Variables
我們可以看到裏面已經有一些變量了,這些就是在JasperReport提到的它的內置變量。
點擊新增按鈕,彈出的窗口中包括定義Variable name,Variable class type, Calculation type,Variable expression,Initial value expression等等。
Variable name :變量的名字可以和Fields或者Parameters的名字相同,但是不能和其他的變量名字一樣
Variable class type:表示變量是哪個類的對象,例如java.lang.Integer等等,不能爲基本變量類型如int,double等
Calculation type:常用的包括count,sum, average等等
Variable expression:可以是之前的$F{field name},也可以是自己或者其它的變量
Initial value expression:類型一定要和選擇的Variable class type一致
在報表模版裏書寫的標識爲$V{variable name}
Ø Parameters
我們可以看到裏面已經有一些參數的定義了,這些就是在JasperReport提到的它的內置參數。
點擊新增按鈕,彈出的窗口中包括定義Parameter name,Parameter class type, Parameter default value,Parameter description等等
Parameter name:參數名稱,其實就是Map的key,所以參數名稱不能重複
Parameter class type:表示參數是那個類的對象,即Map中key對應的對象類型
Parameter default value:表示參數爲空的時候,賦與的一個值,類型必須和選擇的Parameter class type一致
Parameter description:描述欄位,保留欄位
在報表模版裏書寫的標識爲$P{parameter name}
3.4 報表模版主要元件
所有元件在正確的區域內時,當鼠標點擊該元件,邊框顏色均爲藍色
如果不在正確的區域時,當鼠標點擊該元件,邊框顏色爲紅色
如果多個元件重疊,當鼠標點擊該元件,邊框顏色爲綠色
所有元件基本有共同的幾個屬性,右鍵點擊元件從彈出的菜單中選擇properties,彈出一個屬性窗口:
Common裏面包括:綁定的區域信息,絕對位置和大小,前景色,背景色等等。
Print when expression表示滿足甚麼條件的時候顯示,表達式必須返回一個Boolean的對象
Font裏面包括:字體大小,文字位置,文字字體等等,如果是中文或者是亞洲其他語言,當輸出爲PDF格式時候,需要設定Font是:
Language
PDF Font Name
Simplified Chinese
STSong-Light
Traditional Chinese
MHei-Medium
MSung-Light
Japanese
HeiseiKakuGo-W5
HeiseiMin-W3
Korean
HYGoThic-Medium
HYSMyeongJo-Medium
Border裏面包括:邊框的線條顏色,粗細,框內文字距離邊框的距離等等
3.4.1 直線
點擊工具欄 ,可以在報表的任意區域畫一條直線
3.4.2 靜態的文字
點擊工具欄 ,可以在任意區域畫一個文本框, 在它的屬性窗口輸入想要顯示的文字
3.4.3 文字字段
點擊工具欄 ,可以在任意區域畫一個文本框,在屬性框輸入要顯示的Field, Variable,Parameter
Textfield Expression Class:必須和定義的類型一致,目前只支持下面的類型:
java.lang.Boolean
java.lang.Byte
java.util.Date
java.sql.Timestamp
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Short
java.math.BigDecimal
java.lang.String
Evaluation time:賦值時間一般選擇now
Stretch with overflow:當文字超出邊框時是否自動延長
Banlk when null:當內容爲空指針的時候是否顯示空格
Pattern:顯示的式樣,如果爲Number類型或者日期類型時可以建立特定的顯示式樣
Textfield expression:表達式可以爲$F{field},$V{variable},$P{parameter}
3.4.4 圖象
點擊工具欄 ,可以在任意區域插入圖象,在屬性窗口輸入圖象的來源
Image Expression:圖象來源的表達式,一般情況下選擇Image Expression Class爲java.lang.String時,表達式爲圖象的絕對路徑,可以通過$F{field},$P{parameter}來傳遞,也可以通過 Find按鈕找到本地需要顯示的圖象路徑。
Image Expression Class:圖象來源的對象類型,根據不同的類型,Image Expression就要傳遞該類型的對象
3.4.5 子報表
點擊工具欄的 ,可以在detail,summary區域插入子報表,下面是子報表的屬性:
u 窗口1
Paramters Map Expression:這個是傳遞給子報表的參數表,類型一定是java.util.Map,子報表的參數還可以通過別的方式傳遞,在下面窗口2中有描述。
Connetion / Datasouce Expression:這個是子報表的數據源,一般情況下是用JRDataSource,這裏寫的$P{MY_DATA_SOURCE},表示子報表數據源是通過父報表參數傳遞的,因此要在參數表那裏定義。
u 窗口2
Subreport Expression Class:子報表的類型,通常選擇如圖中所示的類型,這個參數也是通過父報表的參數來傳遞,因此要在參數中定義它。
SubReport parameters:子報表的參數,這個地方的參數和窗口1的Paramters Map功能一樣,提供參數給子報表,區別是這個地方可以將父報表的一些具體的資料通過map傳遞給子報表。
3.4.6 圖形報表
點擊工具欄的 ,可以在任何區域插入它,具體的圖形報表製作將在後面的章節詳細描述。
3.5 編譯報表
當我們畫好報表模版後,保存到硬盤上的只是xml 檔案,因此需要編譯爲.jasper的檔案,
點擊工具欄的 ,如果我們畫好的報表沒有問題,將產生一個.jasper的檔案,如果有錯誤,將在iReport的下方信息窗口顯示出錯的信息,爲我們糾正錯誤提供幫助。
4 JFreeChart
4.1 簡介
主要用來開發各種各樣的圖形報表,這些圖形報表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分佈圖、混合圖、甘特圖以及一些儀 錶盤等等。在這些不同式樣的圖形報表上可以滿足目前商業系統的要求。JFreeChart是一種基於JAVA 2D的圖形報表開發技術。JFreeChart可用於Servlet、JSP、Applet、Java Appication環境中,通過JDBC可動態顯示任何數據庫數據,結合Itext可以輸出至PDF文檔。
4.2 幾個重要的Class和Interface介紹
Ø Class org.jfree.chart.ChartFactory
這個類負責產生各種圖形的org.jfree.chart.JFreeChart的對象,JasperReport通過調用org.jfree.chart.ChartFactory的方法獲取到相應圖形的org.jfree.chart.JfreeChar的對象。
Ø Class org.jfree.chart.JFreeChart
這個類實現了Java 2D APIs,它的目的是在Java 2D graphics device上繪出想要的圖像
Ø Interface org.jfree.data.category.CategoryDataset
用於圖形生成所要的數據集對象,實現這個接口的Dataset主要用於3D數據,例如Bar,Group Bar,Line,StackedBar 等等
Ø Interface org.jfree.data.category.PieDataset
用於圖形生成所要的數據集對象,實現這個接口的Dataset主要用於2D數據,例如Pie
Ø Interface org.jfree.chart.plot.DrawingSupplier
java.awt.Paint及java.awt.Stroke 對象的提供者,可以通過實現它自己定義Chart的顏色
Ø Abstract Class org.jfree.chart.plot.Plot
這個抽象類以及所有子類做爲org.jfree.chart.JFreeChart的代理,在Java 2D graphics device繪出座標以及數據區域的圖像
Ø Abstract Class org.jfree.chart.renderer.AbstractRenderer
這個抽象類以及所有子類主要用在3D數據時在Java 2D graphics device繪出每個區域的顏色,每個區域輪廓的顏色,每個區域上的數值
4.3 JasperReport如何調用JFreeChart產生圖形報表
JasperReport在用數據填充報表時,根據圖形報表的類型,生成對應的JFreeChart的Dataset對象,再調用 org.jfree.chart.ChartFactory產生出對應的org.jfree.chart.JFreeChart對象。獲取到該對象 後,JasperReport在exporter裏建立一個java.awt.image.BufferedImage對象,
BufferedImage返回一個java.awt.Graphics2D對象,再將它傳入給之前JFreeChart對象,最後調用JFreeChart對象的draw方法將圖形輸出到BufferedImage對象,供給Exporter使用。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/feidragon319/archive/2008/02/19/2107215.aspx