一、iReport與JasperReport簡介
1.1 簡介
JasperReport是報表的引擎部分,界面設計是用iReport。為什么選擇這兩個軟件呢?因為這兩個軟件都是開源的,即免費的(雖然某些文檔收費,但是磨滅不了我們使用它的理由)。
JasperReport是一個報表制作程序,用戶按照它制定的規(guī)則編寫一個XML文件,然后得到用戶需要輸出的格式文件。它支持輸出的文件格式包括PDF,HTML,XML,XLS,CSV等等。
用JasperReport做報表,可以分為兩種方式:
1、 直接利用程序定義一個報表
2、 寫一個xml文件來描述這個報表,通常需要借助于iReport
JasperReport做報表時用的都是底層的東西,如線條、靜態(tài)文本等,底層的好處就是強大、容易控制報表,但缺點就是編寫很麻煩。慶幸的是,我們有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/下載
本人用的產(chǎn)品版本:iReport 2.0.5-windows版本;JasperReport 2.0.5版本;JDK 1.5.0_4版本。
注:在新的iReport版本中,已經(jīng)包含了JasperReport的jar包,不需要下載JasperReport包了,但是,要更多的了解JasperReport,還是推薦下載完整的軟件包,以學習它的源代碼和例子。還有,新版本的iReport帶有字體包,不需另下。
2.2 安裝軟件
首先安裝JDK,一路NEXT即可。
其次,安裝iReport,由于新版本對windows支持較好,所以和JDK一樣,一路NEXT即可。
注:舊版本需要對環(huán)境變量進行配置,此篇文章介紹的版本以及更新的版本均不需要手動配置環(huán)境變量。
2.3 其他相關
您還需要準備一個數(shù)據(jù)源(如果需要做動態(tài)報表的話),大部分情況是一個數(shù)據(jù)庫。筆者使用的是Oracle 9i的數(shù)據(jù)庫。
三、iReport的基本使用
先看使用界面:
下面開始初步嘗試。
1. 新建報表
彈出對話框如下:
還有許多其他的選項,中文可以理解。有個XML編碼,可以手動輸入,也可保持默認,點擊”OK”創(chuàng)建新表完成。
注:iReport不會自動保存,需要手動保存,建議多保存。
2. 報表的結構
新建的報表如下:
一個報表的結構大致是幾個部分:title、pageHeader、columnHeader、detail、columnFooter、pageFooter、lastPageFooter、summary以及groupHeader、groupfooter。
·Title:每個報表一般會有一個名字,比如×××銷售報表,title就是擱置這個名稱的最好地方了,當然你也可以根據(jù)需要擱置在合適的地方。Title只在第一頁出現(xiàn)。
·pageHeader:報表的一些公共要素,比如頁碼、創(chuàng)建時間、創(chuàng)建人等信息放置在這里是比較好的選擇。
·columnHeader:無可非議的這里是放置列的名稱,記住不是列數(shù)據(jù)。
·detial:放置需要循環(huán)輸出的數(shù)據(jù),比如銷售記錄數(shù)據(jù)。
·columnFooter:放置列級別的統(tǒng)計計算值或是列的說明。
·pageFooter:放置頁級別的統(tǒng)計值或是頁的說明。
·lastPageFooter:最后一頁特殊的格式,可以放置總結等。
·Summary:可能需要對幾頁(你的報表可能有幾個頁組成)的統(tǒng)計值。比如50個銷售記錄共占用了3頁,那么放置這些統(tǒng)計記錄的統(tǒng)計值最好的地方就是summary。Summary只在最后一頁出現(xiàn)。
·groupHeader:每個表的內容可能需要根據(jù)某個屬性進行劃分顯示內容和計算內容,比如希望以月份為單位每組分開顯示銷售記錄,那么就可以定義一個組(組的定義參考后文),groupHeader就是放置組說明或是組標志最好的地方。
·Groupfooter:放置組的統(tǒng)計或是說明
3. 添加對象
可以通過工具欄的工具添加靜態(tài)對象與動態(tài)對象。點擊可以創(chuàng)建靜態(tài)對象,點擊可以創(chuàng)建動態(tài)對象。之后在報表的空白處單擊,如此即可把對象添加到報表,然后拖動對象的邊框,使它的大小合適,雙擊即可對對象中的文本進行快速編輯。
仔細觀察,會發(fā)現(xiàn)對象的邊框有兩種顏色,一為藍色,二為紅色,藍色為符合布局要求,紅色反之。
注:一個對象不能橫跨兩個區(qū)域,即不能既在columnHeader里又在detail里。
鼠標右擊對象,彈出如下菜單:
點擊”屬性”,編輯對象的屬性。
這里面有很多屬性,可以依據(jù)要求來更改其中的部分或所有。其中,重要的可能是關于PDF的,如下圖。
紅框框起來的部分要注意,當要輸出中文的時候,需要類似設置。新版本對邊框的更新,使我們操作起來更為方便。注意下面紅框里的部分,這可以對每一個邊進行分開的設置,人性化的為我們解決了大量問題。
注:JasperReport沒有現(xiàn)成的表格,最好的方法就是用一個一個對象的邊框堆積起來,組成一個表格。但是,對象的邊框不能覆蓋,否則HTML、EXCEL等不能正常輸出。
對于動態(tài)對象,屬性如下。
主要屬性如圖所示。在Pattern里,可以定義輸出的格式,在輸出時間和日期或者貨幣時尤為有用。上圖中的”stretch with overflow”表示當填充值超出定義的大小時,自動換行;”blank when null”表示當數(shù)據(jù)為null時不顯示數(shù)據(jù),這兩個在某些時候很有用處。
而在表達式一欄中,如果字體為藍色,則表示不正確,當輸入正確的時候,會呈現(xiàn)綠色,如圖。
4. 設置數(shù)據(jù)來源
首先,需要添加一個數(shù)據(jù)源,此處選用Oracle數(shù)據(jù)庫,步驟如下。
如下圖,點擊”連結/資料來源”。
彈出下面對話框,點擊”New”。(圖中已有數(shù)據(jù)源乃是筆者添加)
選擇一個數(shù)據(jù)來源,這里選擇第一個JDBC連接數(shù)據(jù)庫的方式,點擊”下一步”。
按照圖中的介紹填寫相關信息,并測試信息是否正確,然后保存。iReport可以添加保存多個數(shù)據(jù)源連接信息。
注:如提示找不到相關驅動,則需要將驅動的JAR包復制到iReport的lib文件夾下。
5. 變量、參數(shù)及字段
在使用iReport 的過程中會碰到很多與變量(Variables)、參數(shù)(Parameters)、字段(Fields)這些有關的內容,我們要介紹這些對象的使用和意義:
·字段(Fields):是數(shù)據(jù)源抽取出來的,希望在報表中出現(xiàn)的數(shù)據(jù)庫內容。比如一個ID的所有值,$F{ filedsName }。
·參數(shù)(Parameters):這是你的應用需要提供給報表的入口,比如你希望在報表被解釋的時候提供Where語句的條件值,那么就可以使用參數(shù)(Parameters),$P{ parameterName }。
·變量(Variables):這是報表中一些邏輯運算的表現(xiàn),比如統(tǒng)計值,$V{ variablesName }。
變量
可以通過以下方式添加、修改和刪除。
彈出如下對話框:
紅框里的是iReport自帶的供用戶使用的變量,用于計算數(shù)量和總值等。點擊”新增”,可以增加用戶自己的變量,如圖。
各個部分功能如標注所示。
參數(shù)
定義參數(shù)的按鈕就在定義變量的旁邊,如上節(jié),不贅述。
上圖中,紅框里的是系統(tǒng)內置的參數(shù),供用戶調用,其中包括一些常用的參數(shù),如連接、最大值等等。點擊”新增”按鈕后,出現(xiàn)如下頁面。
在新增參數(shù)對話框中輸入?yún)?shù)的名稱、數(shù)據(jù)類型、缺省值以及參數(shù)的描述信息等。需要注意的是,根據(jù)不同的參數(shù)類型,在設置參數(shù)的缺省值時要使值能與參數(shù)類型匹配,即字符型的參數(shù)在設置缺省值時要用””把值括起來,如果是數(shù)據(jù)值型的則不能加””。
參數(shù)的引用方式有兩種,,一種是$P{},另一種是$P!{},前者可以出現(xiàn)在任意的表達式位置,而后者則只能出現(xiàn)在SQL腳本里,用來替換查詢語句,用以按照不同的需求替換查詢語句。同時,在腳本里,也有些許區(qū)別:前者只能替換語句的部分字段,如SELECT * FROM bugs where name=$P{Name} order by proname, modulename,而對于$P!{},則可以直接在SQL腳本框里輸入$P!{SQL}。
字段
編輯字段的方式與變量、參數(shù)類似,打開”字段”界面。
在點擊”新增”后,出現(xiàn)如上頁面,根據(jù)情況填寫字段名稱、字段類型(一般與數(shù)據(jù)來源類型相匹配)和字段的描述等。這種是手動添加字段,另一種更為方便的方法是從數(shù)據(jù)源直接讀出,將在后面介紹。
字段用于動態(tài)對象里,即。它的主要功用在于動態(tài)連接數(shù)據(jù)源,完成數(shù)據(jù)源的讀出顯示,所以在有動態(tài)對象的報表里,執(zhí)行的時候一般采用”執(zhí)行報表(使用動態(tài)連接)”,如圖。
6. 動態(tài)數(shù)據(jù)源
從上圖中,選擇默認的動態(tài)連接。
彈出如下界面,各部分功能介紹如圖。
這便是上面所說的另一種更為方便的添加字段的方法,從數(shù)據(jù)源直接復制到字段里,方便、快捷。
如上圖所示,還有三種連接數(shù)據(jù)源的方式:JavaBean、DataSource、CSV。多種不同的方式給我們添加了很多便利。
7. 組
組是一個很重要的概念,一個報表可以多個組,每個組以一個關鍵字為標記,比如希望統(tǒng)計是根據(jù)項目(或是產(chǎn)品)進行統(tǒng)計的。那么可以設立一個項目標記的組。如圖。
組的參數(shù)設定可以看界面即可理解部分,其中最主要的是“Group expression”,這里必須輸入格式正確的并且存在的字段名稱,本文的“Name”是【字段】中的一個元素。依此類推,建立其他的組對象。每建立一個組,在報表的界面上都會出現(xiàn)該組對應的段,組的Header與Footer是對應出現(xiàn)的。如圖。
8. 風格化
如圖。
點擊”Styles”,彈出如下界面。
在這里,我們可以定義許多個常用的格式,按照個人喜好進行定義,定義后,在對象屬性的頁面上可以選擇使用哪種風格,所設置的屬性會自動繼承。如圖:
9. 界面介紹
在iReport的界面上,處于人性化的考慮,設置了很多快捷按鈕供用戶使用,如圖。
上圖包括文檔的基本操作,線條與圖形的繪畫,靜態(tài)與動態(tài)對象的添加,圖表圖像報表的插入,報表、欄等的屬性,也包括編譯、執(zhí)行等按鈕。
上圖包括字體字號,一些對象內部的基本排列操作和數(shù)據(jù)源設置等。
上圖包括對象的對齊、排列、規(guī)格化等操作。
所有這些快捷按鈕給用戶提供了很大的便利,熟悉之后,用起來會更加順手。
10.預覽
iReport支持多種輸出格式,其中包括PDF,HTML,XML,XLS,CSV等等。介紹一下如何進行預覽和輸出。
iReport默認是JRViewer輸出預覽,用戶可以在上述菜單中進行調整和選擇。
在這里,但是只在此設置輸出格式了,還沒有完成設置,還有一個必需的設置就是,為每一種設置選擇執(zhí)行“環(huán)境”,例如,如果你選擇以PDF 輸出,那么你需要為其指明Adobe Reader 的路徑,如圖選擇菜單Options/選項,則會彈出如下屬性頁:
選擇之后,保存即可,iReport會自動調用相關程序來完成輸出和預覽。
四、報表的輸出
正如前面所說,報表有很多種輸出方式,這里挑選一些常用的進行介紹。
在iReport中,我們可以對報表進行預覽,而此時,是iReport幫助我們完成了絕大部分的工作,我們并不需要輸入代碼來完成輸出,而這里我們所說的輸出是輸出到文件或者輸出到WEB頁面等。
我們將以輸出html格式為例子講述。有人會問:這html不是靜態(tài)頁面嗎?我說,的確是這樣的。不過,html有普遍適用性,我們可以把它插入到動態(tài)頁面里面去,比如說JSP或者ASP等。
動態(tài)頁面的技術細節(jié)不在這里贅述,這里我們只介紹jasperReport相關,下面我們以JSP相關技術為基底來敘述。
1) 讀取.jasper文件
通過iReport軟件,我們可以把已經(jīng)定義好的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) 建立數(shù)據(jù)源
前面介紹過,jasperReport支持多種數(shù)據(jù)來源,比如說:數(shù)據(jù)庫連接Connection、JavaBean、CVS數(shù)據(jù)源等等。不過jasperReport提供一種通用數(shù)據(jù)源類型JRDataSource,它很多子類實現(xiàn),即為多種數(shù)據(jù)來源類型。
這里,我們介紹兩種普遍數(shù)據(jù)源:數(shù)據(jù)庫Connection和JavaBean。
首先是Connection。通過數(shù)據(jù)庫的URL、用戶名、密碼和驅動類來進行數(shù)據(jù)庫的連接,返回Connection即可,當然,此種情況需要在iReport中定義SQL查詢語句。另一種方法是,直接從Connection中完成數(shù)據(jù)庫的查詢,返回結果集ResultSet,繼而把ResultSet封裝成JRDataSource的子類JRResultSetDataSource。兩種方式?jīng)]有孰優(yōu)孰劣,憑喜好使用即可。兩種方式代碼如下:
一、
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類,其中包含一個靜態(tài)的方法,返回Collection類型或者Array類型的JavaBean結果集。相比較Connection來說,JavaBean要麻煩許多,不過也要靈活許多,這才是靈活性的體現(xiàn)(因為有時候,查詢語句會很復雜,數(shù)據(jù)來源一樣會很復雜,而JavaBean無視這一切)。JavaBean代碼如下:
JRBeanCollectionDataSource dataSource;
Collection rows = NumFactory.generateCollection();
dataSource = new JRBeanCollectionDataSource(rows);
上面語句的功能應該很明顯了,不贅述。
4) 生成JasperPrint對象
當數(shù)據(jù)來源確定后,下一步是生成JasperPrint對象。簡單的說,JasperPrint對象就是jasperReport對象的動態(tài)填充,即把相關數(shù)據(jù)插入到報表當中。
JasperPrint rptPnt = JasperFillManager.fillReport(jasperReport, params, dataSource);
JasperFillManager類有許多的填充方法,基本囊括了各種參數(shù)的填充,包括Connection、DataSource等的填充。
5) 輸出
動態(tài)填充數(shù)據(jù)完成后,就可以進行輸出了。輸出時,有幾種方式:輸出到流,輸出到文件,也可以直接生成視圖等。
對于每種輸出格式,JasperReport都提供一個特定的Exporter,比如JRXlsExporter、JRHtmlExporter等等。這些Exporter中,可以定義相關的輸出格式,有一些是必須要定義的,比如:
exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);
當然,這是流輸出的例子。JRExporterParameter中有所有格式的通用屬性,而對于每種格式,有不同的ExporterParameter對象,對應著不同的參數(shù)。用戶所需要的參數(shù)定義完畢后,調用exportReport()方法輸出即可。
五、例子
下面是一個格式化的報表:
然后是運行之后的截圖:
六、獨立性與易集成性
前面可能把整個過程講述的很復雜,其實,在整個建立與輸出報表過程中,是一氣呵成的。iReport與JasperReport是緊密相關的,而除此之外,它們的獨立性非常好。
利用jasperReport+iReport生成并輸出報表,可以方便的嵌入“胖客戶端”以及WEB工程,以公安項目為例。
此項目是基于Struts結構的,瀏覽器端的請求是通過ActionServlet來傳遞的,依照項目要求,我們只要把已經(jīng)做好的jasperReport實例導入到項目里即可。導入方法可參考如下:
首先,把相關jar包導入到工程的lib文件夾下,搭建必需的環(huán)境;
其次,新建Action類,并將其對應的路徑等相關信息加入xml配置文件中;
然后,如同輸出html文件一樣,將輸出代碼拷貝到Action類中,實現(xiàn)流的輸出即可;
最后,將原實例中的相關處理類拷貝到項目中,調整包的路徑,使之正常運作即可。
這時,只要修改某些頁面的鏈接即可完成報表的輸出。
七、其他相關問題
如何使用圖片?
很容易,用Image控件就可以了. 在Image Express 里面可以用String來表示圖片的路徑, 或者用InputStream, File 對象.不過不管用File 還是String 對象, 都不得不用絕對路徑, 這顯然很不靈活.解決辦法是,穿入一個$P 的參數(shù),表示圖片所在的目錄,然后用$P 和文件名拼接出完整的絕對路徑. 或者通過代碼來控制,比如System.getProperty("user.dir")+"""report.jpg"就表示圖片的絕對路徑。更好的方法是用InputStream, 例如his.getClass().getResourceAsStream ("report.jpg") ,這時只要把圖片放在當前.jasper所在的目錄就可以了,不必考慮什么參數(shù),什么路徑。
動態(tài)控制某些Field 是否顯示
每個Static Text, Text Field 甚至整個Band 的屬性里面都有Print When Expression, 比如設成new boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么只有當參數(shù)display的值為yes 的時候才顯示。
使用Sub Report, 如何使用相對路徑
和使用圖片類似,最好使用InputStream 或者傳入?yún)?shù)。
Query里面如何使用參數(shù)
$P!{xxx} 或者$P{xxx} 后者只能用于類似PreparedStatement參數(shù)綁定, 而前者可替換Sql 的任意部分. 在需要動態(tài)排序的時候, 前者特別有用. 比如select a,b,c from t order by $P!{orderClause} 不管用$P 還是$P!, SQL最終是以PreparedStatement 方式執(zhí)行的, 不必太擔心性能問題注意:參數(shù)是不能嵌套的,比如$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的簡單封裝, 在第一張圖處理完后, 游標已經(jīng)到了eof 位置了, 在開始處理第二張圖的時候,就必然拋出游標耗盡的異常! 怎么辦?自己寫個JRDataSourceAdapter,把JRDataSource對象里面的值預先保存到一個Collection (相當于一個Offline的數(shù)據(jù)集), 然后把這個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 邊框在鼠標點中的時候顯示藍色,否則是綠色) 最后,記得設置參數(shù):
exporter.setParameter(JRXlsExporterParameter. IS_REMOVE_EMPTY_SPACE_BETWEEN _ROWS , Boolean.TRUE);
如何保留GridLine
首先, 設置參數(shù)exporter.setParameter (JRXlsExporterParameter. IS_WHITE_PAGE_BACKGROUND , Boolean.FALSE);然后,把每個Field 或者Static Text 框的''Transparent''屬性都勾上
如何使字段名只顯示一次
如果把字段名放在ColumnHead 區(qū)域, 那么輸出到Excel, 會每個Page 都顯示一遍. 在設計Report 時候, 一般會設定Page 大小. 然而對于Excel, 這個Page設定仍然存在,而且往往很討厭, 因為在Excel 里, 通常希望得到連續(xù)的數(shù)據(jù), 然而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 里面的數(shù)據(jù)是從第二行,第B列開始顯示的。
因為第一行和第A列分別是用來表示page top margin 和 page left margin的.對于Excel 來說, 純粹多余. 解決方法是把page margin 設成0. 不過如果這個report 還需要以PDF 等顯示, 那么設成0 就不好看了. 最好能動態(tài)的改變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開源包實現(xiàn)。Ireport對jfreechart的支持不算完美,只是實現(xiàn)了部分的圖表生成,但對于一般項目,也是足夠用的。
對于圖表的數(shù)據(jù)來源,和報表一樣,也有多種來源,并不局限于數(shù)據(jù)庫,而本人推薦的依然是javabean。用戶只要在定義好圖表的各項數(shù)據(jù)(比如:橫坐標數(shù)據(jù),縱坐標數(shù)據(jù),橫坐標標簽,縱坐標標簽,分類標準等等),jasperreport+jfreechart會自動進行數(shù)據(jù)的分類統(tǒng)計輸出,這點是很人性化的。
看過jasperreport的源代碼,發(fā)現(xiàn),圖表在HTML格式輸出的時候,首先是輸出一張圖片,或者放在具體目錄下,或者放在臨時的response里,然后進行調用、輸出展示。(如果選用后者的輸出方式,需要注意:1.x版本后的輸出需要對web.xml進行配置,配置一個servlet進行輸出。)這樣就造成了一個問題,就是當多用戶同時訪問頁面的時候,用戶看到的數(shù)據(jù)是正確的,但是圖片卻可能是別人產(chǎn)生的圖片!
這可能是由于HTML瀏覽器對圖片的引用時機不對,解決的方案是這樣的:由于HTML格式的輸出是字符形式的(PDF是二進制流形式的),所以我們選擇首先把整個圖表輸出到字符緩沖區(qū)中,然后進行一次性輸出,這樣,我們輔助瀏覽器完成對圖片引用時機的修正。當然,也可以這樣做:通過修改源代碼,把圖片輸出到不同的臨時目錄,這樣的話,想引用錯基本都不可能了J
在HTML輸出的時候,一定要記得設置編碼格式,通過exporter的CHARACTER_ENCODING屬性來設置。而且,在HTML中輸出的時候,可以不對報表進行分頁操作,即取消分頁。
還有,jfreechart默認輸出的圖片是進行抗鋸齒處理過的。對于圖形來說,這樣會讓圖像顯示的更圓潤,而對于文字來說,可能就會顯示變得模糊。解決方案:修改源代碼。可以修改jasperreport的源代碼,也可以修改jfreechart的源代碼,只需按照如下代碼進行改進即可:
jfreechart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
上面的代碼將圖片輸出的文本抗鋸齒關閉,而圖像依然有抗鋸齒處理,所以圖片相對好看。不過,有一點需要注意:字體盡量是宋體,字號最好在12到14之間,這樣能達到最好的顯示效果。
posted on 2008-11-09 09:55
Ke 閱讀(8195)
評論(0) 編輯 收藏 所屬分類:
iReport