天天看點

iReport與JasperReport

一、iReport與JasperReport簡介

1.1 簡介

JasperReport是報表的引擎部分,界面設計是用iReport。為什麼選擇這兩個軟體呢?因為這兩個軟體都是開源的,即免費的(雖然某些文檔收費,但是磨滅不了我們使用它的理由)。

JasperReport是一個報表制作程式,使用者按照它制定的規則編寫一個XML檔案,然後得到使用者需要輸出的格式檔案。它支援輸出的檔案格式包括PDF,HTML,XML,XLS,CSV等等。

用JasperReport做報表,可以分為兩種方式:

1、 直接利用程式定義一個報表

2、 寫一個xml檔案來描述這個報表,通常需要借助于iReport

JasperReport做報表時用的都是底層的東西,如線條、靜态文本等,底層的好處就是強大、容易控制報表,但缺點就是編寫很麻煩。慶幸的是,我們有iReport這個軟體,這個軟體完全是彌補JasperReport的不足,将底層編寫推向可視化,大大的友善了我們。

1.2 工作流程簡介

JasperReport的工作流程:首先有個xml檔案,從xml檔案編譯出.jasper類型的檔案,而以後我們真正要使用的就是編譯後的jasper檔案。

上圖為JasperReport的API示意圖,可作為學習的參考。由iReport輸出的檔案中,對WEB應用可能有用的是jasper檔案,當JAVA程式進行調用的時候,将把jasper檔案轉換成print類型,進而進一步到達其他格式的輸出(如上圖)。

二、安裝與配置

2.1下載下傳相關軟體

對于較古老的版本,這裡不做過多介紹,請參考本目錄下其他文獻。這裡提一下,古老版本需要額外下載下傳ANT(JAVA的build工具)以及iTextAsian.jar(用以支援中文的jar包)等。

iReport http://www.jasperforge.org/jaspersoft/opensource/business_intelligence/ireport/ 下載下傳

JasperReport http://www.jasperforge.org/jaspersoft/opensource/business_intelligence/jasperreports/ 下載下傳

JDK http://java.sun.com/ 下載下傳

本人用的産品版本:iReport 2.0.5-windows版本;JasperReport 2.0.5版本;JDK 1.5.0_4版本。

注:在新的iReport版本中,已經包含了JasperReport的jar包,不需要下載下傳JasperReport包了,但是,要更多的了解JasperReport,還是推薦下載下傳完整的軟體包,以學習它的源代碼和例子。還有,新版本的iReport帶有字型包,不需另下。

2.2 安裝軟體

首先安裝JDK,一路NEXT即可。

其次,安裝iReport,由于新版本對windows支援較好,是以和JDK一樣,一路NEXT即可。

注:舊版本需要對環境變量進行配置,此篇文章介紹的版本以及更新的版本均不需要手動配置環境變量。

2.3 其他相關

您還需要準備一個資料源(如果需要做動态報表的話),大部分情況是一個資料庫。筆者使用的是Oracle 9i的資料庫。

三、iReport的基本使用

先看使用界面:

下面開始初步嘗試。

1. 建立報表

彈出對話框如下:

還有許多其他的選項,中文可以了解。有個XML編碼,可以手動輸入,也可保持預設,點選”OK”建立新表完成。

注:iReport不會自動儲存,需要手動儲存,建議多儲存。

2. 報表的結構

建立的報表如下:

一個報表的結構大緻是幾個部分:title、pageHeader、columnHeader、detail、columnFooter、pageFooter、lastPageFooter、summary以及groupHeader、groupfooter。

•Title:每個報表一般會有一個名字,比如×××銷售報表,title就是擱置這個名稱的最好地方了,當然你也可以根據需要擱置在合适的地方。Title隻在第一頁出現。

•pageHeader:報表的一些公共要素,比如頁碼、建立時間、建立人等資訊放置在這裡是比較好的選擇。

•columnHeader:無可非議的這裡是放置列的名稱,記住不是列資料。

•detial:放置需要循環輸出的資料,比如銷售記錄資料。

•columnFooter:放置列級别的統計計算值或是列的說明。

•pageFooter:放置頁級别的統計值或是頁的說明。

•lastPageFooter:最後一頁特殊的格式,可以放置總結等。

•Summary:可能需要對幾頁(你的報表可能有幾個頁組成)的統計值。比如50個銷售記錄共占用了3頁,那麼放置這些統計記錄的統計值最好的地方就是summary。Summary隻在最後一頁出現。

•groupHeader:每個表的内容可能需要根據某個屬性進行劃分顯示内容和計算内容,比如希望以月份為機關每組分開顯示銷售記錄,那麼就可以定義一個組(組的定義參考後文),groupHeader就是放置組說明或是組标志最好的地方。

•Groupfooter:放置組的統計或是說明

3. 添加對象

可以通過工具欄的工具添加靜态對象與動态對象。點選 可以建立靜态對象,點選 可以建立動态對象。之後在報表的空白處單擊,如此即可把對象添加到報表,然後拖動對象的邊框,使它的大小合适,輕按兩下即可對對象中的文本進行快速編輯。

仔細觀察,會發現對象的邊框有兩種顔色,一為藍色,二為紅色,藍色為符合布局要求,紅色反之。

注:一個對象不能橫跨兩個區域,即不能既在columnHeader裡又在detail裡。

滑鼠右擊對象,彈出如下菜單:

點選”屬性”,編輯對象的屬性。

這裡面有很多屬性,可以依據要求來更改其中的部分或所有。其中,重要的可能是關于PDF的,如下圖。

紅框框起來的部分要注意,當要輸出中文的時候,需要類似設定。新版本對邊框的更新,使我們操作起來更為友善。注意下面紅框裡的部分,這可以對每一個邊進行分開的設定,人性化的為我們解決了大量問題。

注:JasperReport沒有現成的表格,最好的方法就是用一個一個對象的邊框堆積起來,組成一個表格。但是,對象的邊框不能覆寫,否則HTML、EXCEL等不能正常輸出。

對于動态對象,屬性如下。

主要屬性如圖所示。在Pattern裡,可以定義輸出的格式,在輸出時間和日期或者貨币時尤為有用。上圖中的”stretch with overflow”表示當填充值超出定義的大小時,自動換行;”blank when null”表示當資料為null時不顯示資料,這兩個在某些時候很有用處。

而在表達式一欄中,如果字型為藍色,則表示不正确,當輸入正确的時候,會呈現綠色,如圖。

4. 設定資料來源

首先,需要添加一個資料源,此處選用Oracle資料庫,步驟如下。

如下圖,點選”連結/資料來源”。

彈出下面對話框,點選”New”。(圖中已有資料源乃是筆者添加)

選擇一個資料來源,這裡選擇第一個JDBC連接配接資料庫的方式,點選”下一步”。

按照圖中的介紹填寫相關資訊,并測試資訊是否正确,然後儲存。iReport可以添加儲存多個資料源連接配接資訊。

注:如提示找不到相關驅動,則需要将驅動的JAR包複制到iReport的lib檔案夾下。

5. 變量、參數及字段

在使用iReport 的過程中會碰到很多與變量(Variables)、參數(Parameters)、字段(Fields)這些有關的内容,我們要介紹這些對象的使用和意義:

•字段(Fields):是資料源抽取出來的,希望在報表中出現的資料庫内容。比如一個ID的所有值,$F{ filedsName }。

•參數(Parameters):這是你的應用需要提供給報表的入口,比如你希望在報表被解釋的時候提供Where語句的條件值,那麼就可以使用參數(Parameters),$P{ parameterName }。

•變量(Variables):這是報表中一些邏輯運算的表現,比如統計值,$V{ variablesName }。

變量

可以通過以下方式添加、修改和删除。

彈出如下對話框:

紅框裡的是iReport自帶的供使用者使用的變量,用于計算數量和總值等。點選”新增”,可以增加使用者自己的變量,如圖。

各個部分功能如标注所示。

參數

定義參數的按鈕就在定義變量的旁邊,如上節,不贅述。

上圖中,紅框裡的是系統内置的參數,供使用者調用,其中包括一些常用的參數,如連接配接、最大值等等。點選”新增”按鈕後,出現如下頁面。

在新增參數對話框中輸入參數的名稱、資料類型、預設值以及參數的描述資訊等。需要注意的是,根據不同的參數類型,在設定參數的預設值時要使值能與參數類型比對,即字元型的參數在設定預設值時要用””把值括起來,如果是資料值型的則不能加””。

參數的引用方式有兩種,,一種是$P{},另一種是$P!{},前者可以出現在任意的表達式位置,而後者則隻能出現在SQL腳本裡,用來替換查詢語句,用以按照不同的需求替換查詢語句。同時,在腳本裡,也有些許差別:前者隻能替換語句的部分字段,如SELECT * FROM bugs where name=$P{Name} order by proname, modulename,而對于$P!{},則可以直接在SQL腳本框裡輸入$P!{SQL}。

字段

編輯字段的方式與變量、參數類似,打開”字段”界面。

在點選”新增”後,出現如上頁面,根據情況填寫字段名稱、字段類型(一般與資料來源類型相比對)和字段的描述等。這種是手動添加字段,另一種更為友善的方法是從資料源直接讀出,将在後面介紹。

字段用于動态對象裡,即 。它的主要功用在于動态連接配接資料源,完成資料源的讀出顯示,是以在有動态對象的報表裡,執行的時候一般采用”執行報表(使用動态連接配接)”,如圖。

6. 動态資料源

從上圖中,選擇預設的動态連接配接。

彈出如下界面,各部分功能介紹如圖。

這便是上面所說的另一種更為友善的添加字段的方法,從資料源直接複制到字段裡,友善、快捷。

如上圖所示,還有三種連接配接資料源的方式:JavaBean、DataSource、CSV。多種不同的方式給我們添加了很多便利。

7. 組

組是一個很重要的概念,一個報表可以多個組,每個組以一個關鍵字為标記,比如希望統計是根據項目(或是産品)進行統計的。那麼可以設立一個項目标記的組。如圖。

組的參數設定可以看界面即可了解部分,其中最主要的是“Group expression”,這裡必須輸入格式正确的并且存在的字段名稱,本文的“Name”是【字段】中的一個元素。依此類推,建立其他的組對象。每建立一個組,在報表的界面上都會出現該組對應的段,組的Header與Footer是對應出現的。如圖。

8. 風格化

如圖。

點選”Styles”,彈出如下界面。

在這裡,我們可以定義許多個常用的格式,按照個人喜好進行定義,定義後,在對象屬性的頁面上可以選擇使用哪種風格,所設定的屬性會自動繼承。如圖:

9. 界面介紹

在iReport的界面上,處于人性化的考慮,設定了很多快捷按鈕供使用者使用,如圖。

上圖包括文檔的基本操作,線條與圖形的繪畫,靜态與動态對象的添加,圖表圖像報表的插入,報表、欄等的屬性,也包括編譯、執行等按鈕。

上圖包括字型字号,一些對象内部的基本排列操作和資料源設定等。

上圖包括對象的對齊、排列、規格化等操作。

所有這些快捷按鈕給使用者提供了很大的便利,熟悉之後,用起來會更加順手。

10. 預覽

iReport支援多種輸出格式,其中包括PDF,HTML,XML,XLS,CSV等等。介紹一下如何進行預覽和輸出。

iReport預設是JRViewer輸出預覽,使用者可以在上述菜單中進行調整和選擇。

在這裡,但是隻在此設定輸出格式了,還沒有完成設定,還有一個必需的設定就是,為每一種設定選擇執行“環境”,例如,如果你選擇以PDF 輸出,那麼你需要為其指明Adobe Reader 的路徑,如圖選擇菜單Options/選項,則會彈出如下屬性頁:

選擇之後,儲存即可,iReport會自動調用相關程式來完成輸出和預覽。

四、報表的輸出

正如前面所說,報表有很多種輸出方式,這裡挑選一些常用的進行介紹。

在iReport中,我們可以對報表進行預覽,而此時,是iReport幫助我們完成了絕大部分的工作,我們并不需要輸入代碼來完成輸出,而這裡我們所說的輸出是輸出到檔案或者輸出到WEB頁面等。

我們将以輸出html格式為例子講述。有人會問:這html不是靜态頁面嗎?我說,的确是這樣的。不過,html有普遍适用性,我們可以把它插入到動态頁面裡面去,比如說JSP或者ASP等。

動态頁面的技術細節不在這裡贅述,這裡我們隻介紹jasperReport相關,下面我們以JSP相關技術為基底來叙述。

1) 讀取.jasper檔案

通過iReport軟體,我們可以把已經定義好的XML編譯成.jasper檔案,供以後使用。本人把.jasper檔案放置在站點根目錄下的reports檔案夾内,讀取檔案的代碼如下:

ServletContext servletContext = this.getServletContext();

String realPath = servletContext.getRealPath("/report/done.jasper");

2) 轉換成JasperReport類型

查找到.jasper檔案的絕對路徑後,可以對其進行讀取,有很多種方式可以讀取,不過筆者推薦如下方式(這也是官方例子中推薦并使用的):

JasperReport jasperReport = (JasperReport)JRLoader.loadObject(realPath);

3) 建立資料源

前面介紹過,jasperReport支援多種資料來源,比如說:資料庫連接配接Connection、JavaBean、CVS資料源等等。不過jasperReport提供一種通用資料源類型JRDataSource,它很多子類實作,即為多種資料來源類型。

這裡,我們介紹兩種普遍資料源:資料庫Connection和JavaBean。

首先是Connection。通過資料庫的URL、使用者名、密碼和驅動類來進行資料庫的連接配接,傳回Connection即可,當然,此種情況需要在iReport中定義SQL查詢語句。另一種方法是,直接從Connection中完成資料庫的查詢,傳回結果集ResultSet,繼而把ResultSet封裝成JRDataSource的子類JRResultSetDataSource。兩種方式沒有孰優孰劣,憑喜好使用即可。兩種方式代碼如下:

一、

Class.forName("******Driver");

conn = DriverManager. getConnection ("***Driver:// localhost:***; DatabaseName =***; user=***; password=***");

二、

ResultSet set = statement.executeQuery();//=new ResultSet();

JRResultSetDataSource source = new JRResultSetDataSource(set);

對于JavaBean來說。需要定義标準的JavaBean格式,即它的每一個屬性都要有對應的getter/setter方法,而且,需要定義一個Factory類,其中包含一個靜态的方法,傳回Collection類型或者Array類型的JavaBean結果集。相比較Connection來說,JavaBean要麻煩許多,不過也要靈活許多,這才是靈活性的展現(因為有時候,查詢語句會很複雜,資料來源一樣會很複雜,而JavaBean無視這一切)。JavaBean代碼如下:

JRBeanCollectionDataSource dataSource;

Collection rows = NumFactory.generateCollection();

dataSource = new JRBeanCollectionDataSource(rows);

上面語句的功能應該很明顯了,不贅述。

4) 生成JasperPrint對象

當資料來源确定後,下一步是生成JasperPrint對象。簡單的說,JasperPrint對象就是jasperReport對象的動态填充,即把相關資料插入到報表當中。

JasperPrint rptPnt = JasperFillManager.fillReport(jasperReport, params, dataSource);

JasperFillManager類有許多的填充方法,基本囊括了各種參數的填充,包括Connection、DataSource等的填充。

5) 輸出

動态填充資料完成後,就可以進行輸出了。輸出時,有幾種方式:輸出到流,輸出到檔案,也可以直接生成視圖等。

對于每種輸出格式,JasperReport都提供一個特定的Exporter,比如JRXlsExporter、JRHtmlExporter等等。這些Exporter中,可以定義相關的輸出格式,有一些是必須要定義的,比如:

exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);

exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);

當然,這是流輸出的例子。JRExporterParameter中有所有格式的通用屬性,而對于每種格式,有不同的ExporterParameter對象,對應着不同的參數。使用者所需要的參數定義完畢後,調用exportReport()方法輸出即可。

五、例子

下面是一個格式化的報表:

然後是運作之後的截圖:

六、獨立性與易內建性

前面可能把整個過程講述的很複雜,其實,在整個建立與輸出報表過程中,是一氣呵成的。iReport與JasperReport是緊密相關的,而除此之外,它們的獨立性非常好。

利用jasperReport+iReport生成并輸出報表,可以友善的嵌入“胖用戶端”以及WEB工程,以公安項目為例。

此項目是基于Struts結構的,浏覽器端的請求是通過ActionServlet來傳遞的,依照項目要求,我們隻要把已經做好的jasperReport執行個體導入到項目裡即可。導入方法可參考如下:

首先,把相關jar包導入到工程的lib檔案夾下,搭建必需的環境;

其次,建立Action類,并将其對應的路徑等相關資訊加入xml配置檔案中;

然後,如同輸出html檔案一樣,将輸出代碼拷貝到Action類中,實作流的輸出即可;

最後,将原執行個體中的相關處理類拷貝到項目中,調整包的路徑,使之正常運作即可。

這時,隻要修改某些頁面的連結即可完成報表的輸出。

七、其他相關問題

如何使用圖檔?

很容易,用Image控件就可以了. 在Image Express 裡面可以用String來表示圖檔的路徑, 或者用InputStream, File 對象.不過不管用File 還是String 對象, 都不得不用絕對路徑, 這顯然很不靈活.解決辦法是,穿入一個$P 的參數,表示圖檔所在的目錄,然後用$P 和檔案名拼接出完整的絕對路徑. 或者通過代碼來控制, 比如System.getProperty("user.dir")+"\\report.jpg"就表示圖檔的絕對路徑。更好的方法是用InputStream, 例如his.getClass().getResourceAsStream ("report.jpg") ,這時隻要把圖檔放在目前.jasper所在的 目錄就可以了,不必考慮什麼參數,什麼路徑。

動态控制某些Field 是否顯示

每個Static Text, Text Field 甚至整個Band 的屬性裡面都有Print When Expression, 比如設成new boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那麼隻有當參數display的值為yes 的時候才顯示。

使用Sub Report, 如何使用相對路徑

和使用圖檔類似,最好使用InputStream 或者傳入參數。

Query裡面如何使用參數

$P!{xxx} 或者 $P{xxx} 後者隻能用于類似PreparedStatement參數綁定, 而前者可替換Sql 的任意部分. 在需要動态排序的時候, 前者特别有用. 比如select a,b,c from t order by $P!{orderClause} 不管用$P 還是$P!, SQL最終是以PreparedStatement 方式執行的, 不必太擔心性能問題 注意:參數是不能嵌套的,比如$P{a} =''$P{b}'' , $P{b}=''value'', 不要指望$P{a}能被替換成''value''

如何使用圖表(Graph)

JasperReport 本身沒有圖表功能, 隻有顯示Image 的功能,iReport 裡有個Graph 向導, 其實質是通過jFreeChart 生成Image. 另外, 更直接的做法是放一個Image控件, Image Express Class 設定成java.awt.Image, 在Image Expression 裡通過自定義的類傳回java.awt.Image對象.

例如GraphProvider.getImage($P{REPORT_DATASOURCE},title, subtitle.....);GraphProvider是自己的類, public static Image getImage(JRDataSource, ....)

如果顯示多個圖表

在一張報表上顯示一個圖表和顯示多個圖表是不同的. 假設Query 是selectname,price,qty from xxx, 第一張圖顯示name-price, 第二張圖顯示name-qty, 如果還是按上面的方法, 第二張圖根本顯示不出來! 為什麼 因為傳入的是JRDataSource, 而JRDataSource僅僅是對ResultSet的簡單封裝, 在第一張圖處理完後, 遊标已經到了eof 位置了, 在開始處理第二張圖的時候,就必然抛出遊标耗盡的異常! 怎麼辦?自己寫個JRDataSourceAdapter,把JRDataSource對象裡面的值預先儲存到一個Collection (相當于一個Offline的資料集), 然後把這個Collection傳個getImage方法. 具體是, 建一個Variable mydate, 類型是java.util.Map, Calculation Type- System,Initial Value Expression 是JRDataSourceAdapter.JRDataSource2Map($P{REPORT_DATA_SOURCE}, new String[]{"NAME","PRICE","QTY"},

new Class[]{java.lang.String.class,java.lang.Double.class,java.lang.Double.class}); JRDataSource2Map 是自己寫的一個Adapter. 然後在Image 的Expression 裡面換成如GraphProvider.getImage(mydata,title, other params...), 當然得修改getImage方法

Export到Excel的問題

如何去掉報表頭

直接把不需要的Band 删除(把其高度設為0). 如果僅僅是export 到Excel 的時候不需要報表頭, 而輸出到PDF 等仍然需要保留, 那麼使用print when expression, 見前面

如何讓Excel 看起來整齊

不要有空白地方,首先把所有的Field 設成一樣高, 對齊! 把所在Band 的高度也設成和Field 一樣高, 讓Field 正好放入Band. 然後調整Field 的寬度, 讓每個Field 都相鄰,沒有空隙.(如果設定正确,所有的Field 邊框在滑鼠點中的時候顯示藍色,否則是綠色) 最後,記得設定參數:

exporter.setParameter(JRXlsExporterParameter. IS_REMOVE_EMPTY_SPACE_BETWEEN _ROWS , Boolean.TRUE);

如何保留GridLine

首先, 設定參數exporter.setParameter (JRXlsExporterParameter. IS_WHITE_PAGE_BACKGROUND , Boolean.FALSE);然後,把每個Field 或者Static Text 框的''Transparent''屬性都勾上

如何使字段名隻顯示一次

如果把字段名放在ColumnHead 區域, 那麼輸出到Excel, 會每個Page 都顯示一遍. 在設計Report 時候, 一般會設定Page 大小. 然而對于Excel, 這個Page設定仍然存在,而且往往很讨厭, 因為在Excel 裡, 通常希望得到連續的資料, 然而Jasper 仍然會''自作多情''進行分頁. 比如說, 設計JasperReport 的時候, 設定page size為Letter, Portrait, 那麼輸出到Excel 的時候每隔大約30 行(具體取決于Field 的高度), page header, column header, column foot, page foot 會被重複一次,而且還附帶一個高度為0 的Excel Row, 表示Page Break 的地方. 把字段名放在title band 裡, 可以解決字段名重複的問題, 當然page header也不要顯示了. 如果需要, 可以把title band的print when expression設成隻有輸出Excel的時候才顯示為什麼Excel 裡面的資料是從第二行,第B列開始顯示的。

因為第一行和第A列分别是用來表示page top margin 和 page left margin的.對于Excel 來說, 純粹多餘. 解決方法是把page margin 設成0. 不過如果這個report 還需要以PDF 等顯示, 那麼設成0 就不好看了. 最好能動态的改變pagemargin. 當然,這個改變隻能在外部(調用eport 的地方) 進行, 在設計Report 的時候是無能為力的. 不幸的是, JasperReport 類居然沒有setMargin 的方法,隻有getter.折中的方法隻能是reflect 了. 代碼示意如下:

//use reflect to set the private field of JRBaseReport

java.lang.reflect.Field margin =

JRBaseReport.class.getDeclaredField("leftMargin");

margin.setAccessible(true);

margin.setInt(jasperReport,0);

margin =

JRBaseReport.class.getDeclaredField("topMargin");

margin.setAccessible(true);

margin.setInt(jasperReport,0);

margin =

JRBaseReport.class.getDeclaredField("bottomMargin");

margin.setAccessible(true);

margin.setInt(jasperReport, 0);

如何去掉Excel 中隐藏的行

如前說述, 由于page break 的關系, Excel 中每隔幾十行,就有一個高度為0 的row, 即使把page botom margin設為0, 把page footer去掉都沒有辦法. 唯一的解決辦法是把page height 設為很大. 同上面一樣, 不得不使用reflect:

java.lang.reflect.Field pageHeight=

JRBaseReport.class.getDeclaredField("pageHeight");

pageHeight.setAccessible(true);

pageHeight.setInt(myRpt, Integer.MAX_VALUE);

八、HTML的Bar3D圖表輸出心得

圖表在ireport中是利用其他開源包生成的圖檔插入而生成,本人使用的版本是使用jfreechart1.0.0開源包實作。Ireport對jfreechart的支援不算完美,隻是實作了部分的圖表生成,但對于一般項目,也是足夠用的。

對于圖表的資料來源,和報表一樣,也有多種來源,并不局限于資料庫,而本人推薦的依然是javabean。使用者隻要在定義好圖表的各項資料(比如:橫坐标資料,縱坐标資料,橫坐标标簽,縱坐标标簽,分類标準等等),jasperreport+jfreechart會自動進行資料的分類統計輸出,這點是很人性化的。

看過jasperreport的源代碼,發現,圖表在HTML格式輸出的時候,首先是輸出一張圖檔,或者放在具體目錄下,或者放在臨時的response裡,然後進行調用、輸出展示。(如果選用後者的輸出方式,需要注意:1.x版本後的輸出需要對web.xml進行配置,配置一個servlet進行輸出。)這樣就造成了一個問題,就是當多使用者同時通路頁面的時候,使用者看到的資料是正确的,但是圖檔卻可能是别人産生的圖檔!

這可能是由于HTML浏覽器對圖檔的引用時機不對,解決的方案是這樣的:由于HTML格式的輸出是字元形式的(PDF是二進制流形式的),是以我們選擇首先把整個圖表輸出到字元緩沖區中,然後進行一次性輸出,這樣,我們輔助浏覽器完成對圖檔引用時機的修正。當然,也可以這樣做:通過修改源代碼,把圖檔輸出到不同的臨時目錄,這樣的話,想引用錯基本都不可能了J

在HTML輸出的時候,一定要記得設定編碼格式,通過exporter的CHARACTER_ENCODING屬性來設定。而且,在HTML中輸出的時候,可以不對報表進行分頁操作,即取消分頁。

還有,jfreechart預設輸出的圖檔是進行抗鋸齒處理過的。對于圖形來說,這樣會讓圖像顯示的更圓潤,而對于文字來說,可能就會顯示變得模糊。解決方案:修改源代碼。可以修改jasperreport的源代碼,也可以修改jfreechart的源代碼,隻需按照如下代碼進行改進即可:

jfreechart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

上面的代碼将圖檔輸出的文本抗鋸齒關閉,而圖像依然有抗鋸齒處理,是以圖檔相對好看。不過,有一點需要注意:字型盡量是宋體,字号最好在12到14之間,這樣能達到最好的顯示效果。