隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(lèi)(467)

          文章檔案(423)

          相冊(cè)

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827222
          • 排名 - 49

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          文章來(lái)源:ttp://blog.163.com/liushuo216@126/blog/static/1814432020087534517426/

          一、iReportJasperReport簡(jiǎn)介

          1.1   簡(jiǎn)介

          JasperReport是報(bào)表的引擎部分,界面設(shè)計(jì)是用iReport。為什么選擇這兩個(gè)軟件呢?因?yàn)檫@兩個(gè)軟件都是開(kāi)源的,即免費(fèi)的(雖然某些文檔收費(fèi),但是磨滅不了我們使用它的理由)

          JasperReport是一個(gè)報(bào)表制作程序,用戶(hù)按照它制定的規(guī)則編寫(xiě)一個(gè)XML文件,然后得到用戶(hù)需要輸出的格式文件。它支持輸出的文件格式包括PDFHTMLXMLXLSCSV等等。

          JasperReport做報(bào)表,可以分為兩種方式:

          1、 直接利用程序定義一個(gè)報(bào)表

          2、 寫(xiě)一個(gè)xml文件來(lái)描述這個(gè)報(bào)表,通常需要借助于iReport

          JasperReport做報(bào)表時(shí)用的都是底層的東西,如線(xiàn)條、靜態(tài)文本等,底層的好處就是強(qiáng)大、容易控制報(bào)表,但缺點(diǎn)就是編寫(xiě)很麻煩。慶幸的是,我們有iReport這個(gè)軟件,這個(gè)軟件完全是彌補(bǔ)JasperReport的不足,將底層編寫(xiě)推向可視化,大大的方便了我們。

          1.2   工作流程簡(jiǎn)介

          JasperReport的工作流程:首先有個(gè)xml文件,從xml文件編譯出.jasper類(lèi)型的文件,而以后我們真正要使用的就是編譯后的jasper文件。

          上圖為JasperReportAPI示意圖,可作為學(xué)習(xí)的參考。由iReport輸出的文件中,對(duì)WEB應(yīng)用可能有用的是jasper文件,當(dāng)JAVA程序進(jìn)行調(diào)用的時(shí)候,將把jasper文件轉(zhuǎn)換成print類(lèi)型,從而進(jìn)一步到達(dá)其他格式的輸出(如上圖)

          二、安裝與配置

          2.1下載相關(guān)軟件

          對(duì)于較古老的版本,這里不做過(guò)多介紹,請(qǐng)參考本目錄下其他文獻(xiàn)。這里提一下,古老版本需要額外下載ANT(JAVAbuild工具)以及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)包含了JasperReportjar包,不需要下載JasperReport包了,但是,要更多的了解JasperReport,還是推薦下載完整的軟件包,以學(xué)習(xí)它的源代碼和例子。還有,新版本的iReport帶有字體包,不需另下。

          2.2 安裝軟件

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

          其次,安裝iReport,由于新版本對(duì)windows支持較好,所以和JDK一樣,一路NEXT即可。

          注:舊版本需要對(duì)環(huán)境變量進(jìn)行配置,此篇文章介紹的版本以及更新的版本均不需要手動(dòng)配置環(huán)境變量。

          2.3 其他相關(guān)

          您還需要準(zhǔn)備一個(gè)數(shù)據(jù)源(如果需要做動(dòng)態(tài)報(bào)表的話(huà)),大部分情況是一個(gè)數(shù)據(jù)庫(kù)。筆者使用的是Oracle 9i的數(shù)據(jù)庫(kù)。


          三、iReport的基本使用

          先看使用界面:

          下面開(kāi)始初步嘗試。

          1.      新建報(bào)表

          彈出對(duì)話(huà)框如下:

           

          還有許多其他的選項(xiàng),中文可以理解。有個(gè)XML編碼,可以手動(dòng)輸入,也可保持默認(rèn),點(diǎn)擊”OK”創(chuàng)建新表完成。

          注:iReport不會(huì)自動(dòng)保存,需要手動(dòng)保存,建議多保存。

          2.      報(bào)表的結(jié)構(gòu)

          新建的報(bào)表如下:

          一個(gè)報(bào)表的結(jié)構(gòu)大致是幾個(gè)部分:titlepageHeadercolumnHeaderdetailcolumnFooterpageFooterlastPageFootersummary以及groupHeadergroupfooter

          ·Title:每個(gè)報(bào)表一般會(huì)有一個(gè)名字,比如×××銷(xiāo)售報(bào)表,title就是擱置這個(gè)名稱(chēng)的最好地方了,當(dāng)然你也可以根據(jù)需要擱置在合適的地方。Title只在第一頁(yè)出現(xiàn)。

          ·pageHeader:報(bào)表的一些公共要素,比如頁(yè)碼、創(chuàng)建時(shí)間、創(chuàng)建人等信息放置在這里是比較好的選擇。

          ·columnHeader:無(wú)可非議的這里是放置列的名稱(chēng),記住不是列數(shù)據(jù)。

          ·detial:放置需要循環(huán)輸出的數(shù)據(jù),比如銷(xiāo)售記錄數(shù)據(jù)。

          ·columnFooter:放置列級(jí)別的統(tǒng)計(jì)計(jì)算值或是列的說(shuō)明。

          ·pageFooter:放置頁(yè)級(jí)別的統(tǒng)計(jì)值或是頁(yè)的說(shuō)明。

          ·lastPageFooter:最后一頁(yè)特殊的格式,可以放置總結(jié)等。

          ·Summary:可能需要對(duì)幾頁(yè)(你的報(bào)表可能有幾個(gè)頁(yè)組成)的統(tǒng)計(jì)值。比如50個(gè)銷(xiāo)售記錄共占用了3頁(yè),那么放置這些統(tǒng)計(jì)記錄的統(tǒng)計(jì)值最好的地方就是summarySummary只在最后一頁(yè)出現(xiàn)。

          ·groupHeader:每個(gè)表的內(nèi)容可能需要根據(jù)某個(gè)屬性進(jìn)行劃分顯示內(nèi)容和計(jì)算內(nèi)容,比如希望以月份為單位每組分開(kāi)顯示銷(xiāo)售記錄,那么就可以定義一個(gè)組(組的定義參考后文),groupHeader就是放置組說(shuō)明或是組標(biāo)志最好的地方。

          ·Groupfooter:放置組的統(tǒng)計(jì)或是說(shuō)明

          3.      添加對(duì)象

          可以通過(guò)工具欄的工具添加靜態(tài)對(duì)象與動(dòng)態(tài)對(duì)象。點(diǎn)擊可以創(chuàng)建靜態(tài)對(duì)象,點(diǎn)擊可以創(chuàng)建動(dòng)態(tài)對(duì)象。之后在報(bào)表的空白處單擊,如此即可把對(duì)象添加到報(bào)表,然后拖動(dòng)對(duì)象的邊框,使它的大小合適,雙擊即可對(duì)對(duì)象中的文本進(jìn)行快速編輯。

          仔細(xì)觀(guān)察,會(huì)發(fā)現(xiàn)對(duì)象的邊框有兩種顏色,一為藍(lán)色,二為紅色,藍(lán)色為符合布局要求,紅色反之。

          注:一個(gè)對(duì)象不能橫跨兩個(gè)區(qū)域,即不能既在columnHeader里又在detail里。

          鼠標(biāo)右擊對(duì)象,彈出如下菜單:

          點(diǎn)擊屬性,編輯對(duì)象的屬性。

          這里面有很多屬性,可以依據(jù)要求來(lái)更改其中的部分或所有。其中,重要的可能是關(guān)于PDF的,如下圖。

          紅框框起來(lái)的部分要注意,當(dāng)要輸出中文的時(shí)候,需要類(lèi)似設(shè)置。新版本對(duì)邊框的更新,使我們操作起來(lái)更為方便。注意下面紅框里的部分,這可以對(duì)每一個(gè)邊進(jìn)行分開(kāi)的設(shè)置,人性化的為我們解決了大量問(wèn)題。

          注:JasperReport沒(méi)有現(xiàn)成的表格,最好的方法就是用一個(gè)一個(gè)對(duì)象的邊框堆積起來(lái),組成一個(gè)表格。但是,對(duì)象的邊框不能覆蓋,否則HTMLEXCEL等不能正常輸出。

          對(duì)于動(dòng)態(tài)對(duì)象,屬性如下。

          主要屬性如圖所示。在Pattern里,可以定義輸出的格式,在輸出時(shí)間和日期或者貨幣時(shí)尤為有用。上圖中的”stretch with overflow”表示當(dāng)填充值超出定義的大小時(shí),自動(dòng)換行;”blank when null”表示當(dāng)數(shù)據(jù)為null時(shí)不顯示數(shù)據(jù),這兩個(gè)在某些時(shí)候很有用處。

          而在表達(dá)式一欄中,如果字體為藍(lán)色,則表示不正確,當(dāng)輸入正確的時(shí)候,會(huì)呈現(xiàn)綠色,如圖。

          4.      設(shè)置數(shù)據(jù)來(lái)源

          首先,需要添加一個(gè)數(shù)據(jù)源,此處選用Oracle數(shù)據(jù)庫(kù),步驟如下。

          如下圖,點(diǎn)擊連結(jié)/資料來(lái)源

          彈出下面對(duì)話(huà)框,點(diǎn)擊”New”(圖中已有數(shù)據(jù)源乃是筆者添加)

          選擇一個(gè)數(shù)據(jù)來(lái)源,這里選擇第一個(gè)JDBC連接數(shù)據(jù)庫(kù)的方式,點(diǎn)擊下一步

          按照?qǐng)D中的介紹填寫(xiě)相關(guān)信息,并測(cè)試信息是否正確,然后保存。iReport可以添加保存多個(gè)數(shù)據(jù)源連接信息。

          注:如提示找不到相關(guān)驅(qū)動(dòng),則需要將驅(qū)動(dòng)的JAR包復(fù)制到iReportlib文件夾下。

          5.      變量、參數(shù)及字段

          在使用iReport 的過(guò)程中會(huì)碰到很多與變量(Variables)、參數(shù)(Parameters)、字段(Fields)這些有關(guān)的內(nèi)容,我們要介紹這些對(duì)象的使用和意義:

          ·字段(Fields):是數(shù)據(jù)源抽取出來(lái)的,希望在報(bào)表中出現(xiàn)的數(shù)據(jù)庫(kù)內(nèi)容。比如一個(gè)ID的所有值,$F{ filedsName }

          ·參數(shù)(Parameters):這是你的應(yīng)用需要提供給報(bào)表的入口,比如你希望在報(bào)表被解釋的時(shí)候提供Where語(yǔ)句的條件值,那么就可以使用參數(shù)(Parameters),$P{ parameterName }

          ·變量(Variables):這是報(bào)表中一些邏輯運(yùn)算的表現(xiàn),比如統(tǒng)計(jì)值,$V{ variablesName }

                      變量

          可以通過(guò)以下方式添加、修改和刪除。

          彈出如下對(duì)話(huà)框:

          紅框里的是iReport自帶的供用戶(hù)使用的變量,用于計(jì)算數(shù)量和總值等。點(diǎn)擊新增,可以增加用戶(hù)自己的變量,如圖。

          各個(gè)部分功能如標(biāo)注所示。

                      參數(shù)

          定義參數(shù)的按鈕就在定義變量的旁邊,如上節(jié),不贅述。

          上圖中,紅框里的是系統(tǒng)內(nèi)置的參數(shù),供用戶(hù)調(diào)用,其中包括一些常用的參數(shù),如連接、最大值等等。點(diǎn)擊新增按鈕后,出現(xiàn)如下頁(yè)面。

          在新增參數(shù)對(duì)話(huà)框中輸入?yún)?shù)的名稱(chēng)、數(shù)據(jù)類(lèi)型、缺省值以及參數(shù)的描述信息等。需要注意的是,根據(jù)不同的參數(shù)類(lèi)型,在設(shè)置參數(shù)的缺省值時(shí)要使值能與參數(shù)類(lèi)型匹配,即字符型的參數(shù)在設(shè)置缺省值時(shí)要用””把值括起來(lái),如果是數(shù)據(jù)值型的則不能加””

          參數(shù)的引用方式有兩種,,一種是$P{},另一種是$P!{},前者可以出現(xiàn)在任意的表達(dá)式位置,而后者則只能出現(xiàn)在SQL腳本里,用來(lái)替換查詢(xún)語(yǔ)句,用以按照不同的需求替換查詢(xún)語(yǔ)句。同時(shí),在腳本里,也有些許區(qū)別:前者只能替換語(yǔ)句的部分字段,如SELECT * FROM bugs where name=$P{Name} order by proname, modulename,而對(duì)于$P!{},則可以直接在SQL腳本框里輸入$P!{SQL}

                      字段

          編輯字段的方式與變量、參數(shù)類(lèi)似,打開(kāi)字段界面。

          在點(diǎn)擊新增后,出現(xiàn)如上頁(yè)面,根據(jù)情況填寫(xiě)字段名稱(chēng)、字段類(lèi)型(一般與數(shù)據(jù)來(lái)源類(lèi)型相匹配)和字段的描述等。這種是手動(dòng)添加字段,另一種更為方便的方法是從數(shù)據(jù)源直接讀出,將在后面介紹。

          字段用于動(dòng)態(tài)對(duì)象里,即。它的主要功用在于動(dòng)態(tài)連接數(shù)據(jù)源,完成數(shù)據(jù)源的讀出顯示,所以在有動(dòng)態(tài)對(duì)象的報(bào)表里,執(zhí)行的時(shí)候一般采用執(zhí)行報(bào)表(使用動(dòng)態(tài)連接)”,如圖。

          6.      動(dòng)態(tài)數(shù)據(jù)源

          從上圖中,選擇默認(rèn)的動(dòng)態(tài)連接。

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

          這便是上面所說(shuō)的另一種更為方便的添加字段的方法,從數(shù)據(jù)源直接復(fù)制到字段里,方便、快捷。

          如上圖所示,還有三種連接數(shù)據(jù)源的方式:JavaBeanDataSourceCSV。多種不同的方式給我們添加了很多便利。

          7.     

          組是一個(gè)很重要的概念,一個(gè)報(bào)表可以多個(gè)組,每個(gè)組以一個(gè)關(guān)鍵字為標(biāo)記,比如希望統(tǒng)計(jì)是根據(jù)項(xiàng)目(或是產(chǎn)品)進(jìn)行統(tǒng)計(jì)的。那么可以設(shè)立一個(gè)項(xiàng)目標(biāo)記的組。如圖。

          組的參數(shù)設(shè)定可以看界面即可理解部分,其中最主要的是“Group expression”,這里必須輸入格式正確的并且存在的字段名稱(chēng),本文的“Name”是【字段】中的一個(gè)元素。依此類(lèi)推,建立其他的組對(duì)象。每建立一個(gè)組,在報(bào)表的界面上都會(huì)出現(xiàn)該組對(duì)應(yīng)的段,組的HeaderFooter是對(duì)應(yīng)出現(xiàn)的。如圖。

          8.      風(fēng)格化

          如圖。

          點(diǎn)擊”Styles”,彈出如下界面。

          在這里,我們可以定義許多個(gè)常用的格式,按照個(gè)人喜好進(jìn)行定義,定義后,在對(duì)象屬性的頁(yè)面上可以選擇使用哪種風(fēng)格,所設(shè)置的屬性會(huì)自動(dòng)繼承。如圖:

          9.      界面介紹

          iReport的界面上,處于人性化的考慮,設(shè)置了很多快捷按鈕供用戶(hù)使用,如圖。

          上圖包括文檔的基本操作,線(xiàn)條與圖形的繪畫(huà),靜態(tài)與動(dòng)態(tài)對(duì)象的添加,圖表圖像報(bào)表的插入,報(bào)表、欄等的屬性,也包括編譯、執(zhí)行等按鈕。

          上圖包括字體字號(hào),一些對(duì)象內(nèi)部的基本排列操作和數(shù)據(jù)源設(shè)置等。

          上圖包括對(duì)象的對(duì)齊、排列、規(guī)格化等操作。

          所有這些快捷按鈕給用戶(hù)提供了很大的便利,熟悉之后,用起來(lái)會(huì)更加順手。

          10.預(yù)覽

          iReport支持多種輸出格式,其中包括PDF,HTML,XML,XLS,CSV等等。介紹一下如何進(jìn)行預(yù)覽和輸出。

          iReport默認(rèn)是JRViewer輸出預(yù)覽,用戶(hù)可以在上述菜單中進(jìn)行調(diào)整和選擇。

          在這里,但是只在此設(shè)置輸出格式了,還沒(méi)有完成設(shè)置,還有一個(gè)必需的設(shè)置就是,為每一種設(shè)置選擇執(zhí)行環(huán)境,例如,如果你選擇以PDF 輸出,那么你需要為其指明Adobe Reader 的路徑,如圖選擇菜單Options/選項(xiàng),則會(huì)彈出如下屬性頁(yè):

          選擇之后,保存即可,iReport會(huì)自動(dòng)調(diào)用相關(guān)程序來(lái)完成輸出和預(yù)覽。

          四、報(bào)表的輸出

          正如前面所說(shuō),報(bào)表有很多種輸出方式,這里挑選一些常用的進(jìn)行介紹。

          iReport中,我們可以對(duì)報(bào)表進(jìn)行預(yù)覽,而此時(shí),是iReport幫助我們完成了絕大部分的工作,我們并不需要輸入代碼來(lái)完成輸出,而這里我們所說(shuō)的輸出是輸出到文件或者輸出到WEB頁(yè)面等。

          我們將以輸出html格式為例子講述。有人會(huì)問(wèn):這html不是靜態(tài)頁(yè)面嗎?我說(shuō),的確是這樣的。不過(guò),html有普遍適用性,我們可以把它插入到動(dòng)態(tài)頁(yè)面里面去,比如說(shuō)JSP或者ASP等。

          動(dòng)態(tài)頁(yè)面的技術(shù)細(xì)節(jié)不在這里贅述,這里我們只介紹jasperReport相關(guān),下面我們以JSP相關(guān)技術(shù)為基底來(lái)敘述。

          1)        讀取.jasper文件

          通過(guò)iReport軟件,我們可以把已經(jīng)定義好的XML編譯成.jasper文件,供以后使用。本人把.jasper文件放置在站點(diǎn)根目錄下的reports文件夾內(nèi),讀取文件的代碼如下:

          ServletContext servletContext = this.getServletContext();

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

          2)        轉(zhuǎn)換成JasperReport類(lèi)型

          查找到.jasper文件的絕對(duì)路徑后,可以對(duì)其進(jìn)行讀取,有很多種方式可以讀取,不過(guò)筆者推薦如下方式(這也是官方例子中推薦并使用的)

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

          3)        建立數(shù)據(jù)源

          前面介紹過(guò),jasperReport支持多種數(shù)據(jù)來(lái)源,比如說(shuō):數(shù)據(jù)庫(kù)連接ConnectionJavaBeanCVS數(shù)據(jù)源等等。不過(guò)jasperReport提供一種通用數(shù)據(jù)源類(lèi)型JRDataSource,它很多子類(lèi)實(shí)現(xiàn),即為多種數(shù)據(jù)來(lái)源類(lèi)型。

          這里,我們介紹兩種普遍數(shù)據(jù)源:數(shù)據(jù)庫(kù)ConnectionJavaBean

          首先是Connection。通過(guò)數(shù)據(jù)庫(kù)的URL、用戶(hù)名、密碼和驅(qū)動(dòng)類(lèi)來(lái)進(jìn)行數(shù)據(jù)庫(kù)的連接,返回Connection即可,當(dāng)然,此種情況需要在iReport中定義SQL查詢(xún)語(yǔ)句。另一種方法是,直接從Connection中完成數(shù)據(jù)庫(kù)的查詢(xún),返回結(jié)果集ResultSet,繼而把ResultSet封裝成JRDataSource的子類(lèi)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);

          對(duì)于JavaBean來(lái)說(shuō)。需要定義標(biāo)準(zhǔn)的JavaBean格式,即它的每一個(gè)屬性都要有對(duì)應(yīng)的getter/setter方法,而且,需要定義一個(gè)Factory類(lèi),其中包含一個(gè)靜態(tài)的方法,返回Collection類(lèi)型或者Array類(lèi)型的JavaBean結(jié)果集。相比較Connection來(lái)說(shuō),JavaBean要麻煩許多,不過(guò)也要靈活許多,這才是靈活性的體現(xiàn)(因?yàn)橛袝r(shí)候,查詢(xún)語(yǔ)句會(huì)很復(fù)雜,數(shù)據(jù)來(lái)源一樣會(huì)很復(fù)雜,而JavaBean無(wú)視這一切)JavaBean代碼如下:

          JRBeanCollectionDataSource dataSource;

                  Collection rows = NumFactory.generateCollection();

                  dataSource = new JRBeanCollectionDataSource(rows);

          上面語(yǔ)句的功能應(yīng)該很明顯了,不贅述。

          4)        生成JasperPrint對(duì)象

          當(dāng)數(shù)據(jù)來(lái)源確定后,下一步是生成JasperPrint對(duì)象。簡(jiǎn)單的說(shuō),JasperPrint對(duì)象就是jasperReport對(duì)象的動(dòng)態(tài)填充,即把相關(guān)數(shù)據(jù)插入到報(bào)表當(dāng)中。

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

          JasperFillManager類(lèi)有許多的填充方法,基本囊括了各種參數(shù)的填充,包括ConnectionDataSource等的填充。

          5)        輸出

          動(dòng)態(tài)填充數(shù)據(jù)完成后,就可以進(jìn)行輸出了。輸出時(shí),有幾種方式:輸出到流,輸出到文件,也可以直接生成視圖等。

          對(duì)于每種輸出格式,JasperReport都提供一個(gè)特定的Exporter,比如JRXlsExporterJRHtmlExporter等等。這些Exporter中,可以定義相關(guān)的輸出格式,有一些是必須要定義的,比如:

          exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);

                  exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);

          當(dāng)然,這是流輸出的例子。JRExporterParameter中有所有格式的通用屬性,而對(duì)于每種格式,有不同的ExporterParameter對(duì)象,對(duì)應(yīng)著不同的參數(shù)。用戶(hù)所需要的參數(shù)定義完畢后,調(diào)用exportReport()方法輸出即可。

          五、例子

          下面是一個(gè)格式化的報(bào)表:

          然后是運(yùn)行之后的截圖:

          六、獨(dú)立性與易集成性

          前面可能把整個(gè)過(guò)程講述的很復(fù)雜,其實(shí),在整個(gè)建立與輸出報(bào)表過(guò)程中,是一氣呵成的。iReportJasperReport是緊密相關(guān)的,而除此之外,它們的獨(dú)立性非常好。

          利用jasperReport+iReport生成并輸出報(bào)表,可以方便的嵌入“胖客戶(hù)端”以及WEB工程,以公安項(xiàng)目為例。

          此項(xiàng)目是基于Struts結(jié)構(gòu)的,瀏覽器端的請(qǐng)求是通過(guò)ActionServlet來(lái)傳遞的,依照項(xiàng)目要求,我們只要把已經(jīng)做好的jasperReport實(shí)例導(dǎo)入到項(xiàng)目里即可。導(dǎo)入方法可參考如下:

          首先,把相關(guān)jar包導(dǎo)入到工程的lib文件夾下,搭建必需的環(huán)境;

          其次,新建Action類(lèi),并將其對(duì)應(yīng)的路徑等相關(guān)信息加入xml配置文件中;

          然后,如同輸出html文件一樣,將輸出代碼拷貝到Action類(lèi)中,實(shí)現(xiàn)流的輸出即可;

          最后,將原實(shí)例中的相關(guān)處理類(lèi)拷貝到項(xiàng)目中,調(diào)整包的路徑,使之正常運(yùn)作即可。

          這時(shí),只要修改某些頁(yè)面的鏈接即可完成報(bào)表的輸出。

          七、其他相關(guān)問(wèn)題

          如何使用圖片?

          很容,Image控件就可以了. Image Express 里面可以用String來(lái)表示圖路徑, 或者用InputStream, File 對(duì).不過(guò)不File 還是String 對(duì), 都不得不用對(duì)路徑, 這顯然很不靈活.決辦法,穿入一個(gè)$P 的參數(shù),表示圖所在的目,然后用$P 和文件名拼接出完對(duì)路徑. 或者過(guò)代碼來(lái)控制,比如System.getProperty("user.dir")+"""report.jpg"就表示圖對(duì)路徑好的方是用InputStream, his.getClass().getResourceAsStream ("report.jpg") ,這時(shí)片放在當(dāng)前.jasper所在的就可以了,不必考慮么參數(shù),路徑

          動(dòng)態(tài)控制Field 是否顯示

          個(gè)Static Text, Text Field 甚至整個(gè)Band 的屬性里面都有Print When Expression, 比如設(shè)成new boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么有當(dāng)參數(shù)displayyes 的時(shí)候顯示。

          使Sub Report, 如何使用相對(duì)路徑

          使用圖片類(lèi)似,最好使InputStream 或者傳入?yún)?shù)。

          Query里面如何使用參數(shù)

          $P!{xxx} 或者$P{xxx} 后者能用于類(lèi)似PreparedStatement參數(shù), 而前者可替換Sql 的任意部分. 在需要?jiǎng)討B(tài)排序的時(shí)候, 前者特別有用. 比如select a,b,c from t order by $P!{orderClause} $P 還是$P!, SQL是以PreparedStatement 式執(zhí)行的, 不必太擔(dān)心性能問(wèn)題注意:參數(shù)是不能嵌套,比如$P{a} =''$P{b}'' , $P{b}=''value'', 不要$P{a}被替換''value''

          如何使用圖表(Graph)

          JasperReport 沒(méi)有圖表功能, 有顯示Image 的功能,iReport 里有個(gè)Graph 向?qū)?/span>, 其實(shí)質(zhì)過(guò)jFreeChart 生成Image. 另外, 更直接的做法一個(gè)Image控件, Image Express Class 設(shè)置成java.awt.Image, Image Expression 過(guò)自定義的類(lèi)返回java.awt.Image對(duì).

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

          如果顯示多個(gè)圖表

          在一報(bào)表上顯示一個(gè)圖表和顯示多個(gè)圖表是不同的. 設(shè)Query selectname,price,qty from xxx, 圖顯示name-price, 第二張圖顯示name-qty, 如果還是按上面的方, 第二張本顯示不出來(lái)! 因?yàn)閭魅氲氖?/span>JRDataSource, JRDataSource僅僅是對(duì)ResultSet的簡(jiǎn)單, 處理完后, 游標(biāo)已經(jīng)到了eof 置了, 在開(kāi)始處理第二張圖的時(shí)候,就必然游標(biāo)耗盡異常! ?自己寫(xiě)個(gè)JRDataSourceAdapter,JRDataSource對(duì)里面的預(yù)先保存到一個(gè)Collection (相當(dāng)于一個(gè)Offline的數(shù)據(jù)), 然后這個(gè)Collection傳個(gè)getImage. 體是, 建一個(gè)Variable mydate, 類(lèi)型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 是自己寫(xiě)的一個(gè)Adapter. 然后在Image Expression 里面成如GraphProvider.getImage(mydata,title, other params...), 當(dāng)然得修改getImage

          ExportExcel的問(wèn)題

          如何去掉報(bào)表頭

          不需要的Band 刪除(高度設(shè)為0). 如果僅僅export Excel 的時(shí)候不需要報(bào)表, 而輸出到PDF 然需要保, 那么使print when expression, 見(jiàn)前面

          如何讓Excel 看起來(lái)整齊

          不要有空白方,首先所有的Field 設(shè)成一樣高, 對(duì)! 所在Band 高度也設(shè)成和Field 樣高, Field Band. 然后調(diào)整Field 寬度, 讓每個(gè)Field 都相,沒(méi)有空.(如果設(shè)置正確,所有的Field 邊框在鼠標(biāo)點(diǎn)中的時(shí)候顯示藍(lán)色,否則是) 最后,得設(shè)置參數(shù)

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

          如何保留GridLine

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

          如何使字段名只顯示一次

          如果把字段名放在ColumnHead 區(qū)域, 那么輸出到Excel, 會(huì)每個(gè)Page 都顯示一遍. 在設(shè)計(jì)Report 時(shí)候, 一般會(huì)設(shè)定Page 大小. 然而對(duì)于Excel, 這個(gè)Page設(shè)定仍然存在,而且往往很討厭, 因?yàn)樵?/span>Excel , 通常希望得到連續(xù)的數(shù)據(jù), 然而Jasper 仍然會(huì)''自作多情''進(jìn)行分頁(yè). 比如說(shuō), 設(shè)計(jì)JasperReport 的時(shí)候, 設(shè)定page sizeLetter, Portrait, 那么輸出到Excel 的時(shí)候每隔大約30 (具體取決于Field 的高度), page header, column header, column foot, page foot 會(huì)被重復(fù)一次,而且還附帶一個(gè)高度為0 Excel Row, 表示Page Break 的地方. 把字段名放在title band , 可以解決字段名重復(fù)的問(wèn)題, 當(dāng)然page header也不要顯示了. 如果需要, 可以把title bandprint when expression設(shè)成只有輸出Excel的時(shí)候才顯示為什么Excel 里面的數(shù)據(jù)是從第二行,B列開(kāi)始顯示的。

          因?yàn)榈谝恍泻偷?/span>A列分別是用來(lái)表示page top margin page left margin.對(duì)于Excel 來(lái)說(shuō), 純粹多余. 解決方法是把page margin 設(shè)成0. 不過(guò)如果這個(gè)report 還需要以PDF 等顯示, 那么設(shè)成0 就不好看了. 最好能動(dòng)態(tài)的改變pagemargin. 當(dāng)然,這個(gè)改變只能在外部(調(diào)用eport 的地方) 進(jìn)行, 在設(shè)計(jì)Report 的時(shí)候是無(wú)能為力的. 不幸的是, JasperReport 類(lèi)居然沒(méi)有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 中隱藏的行

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

          java.lang.reflect.Field pageHeight=

          JRBaseReport.class.getDeclaredField("pageHeight");

          pageHeight.setAccessible(true);

          pageHeight.setInt(myRpt, Integer.MAX_VALUE);

          八、HTMLBar3D圖表輸出心得

          圖表在ireport中是利用其他開(kāi)源包生成的圖片插入而生成,本人使用的版本是使用jfreechart1.0.0開(kāi)源包實(shí)現(xiàn)。Ireport對(duì)jfreechart的支持不算完美,只是實(shí)現(xiàn)了部分的圖表生成,但對(duì)于一般項(xiàng)目,也是足夠用的。

          對(duì)于圖表的數(shù)據(jù)來(lái)源,和報(bào)表一樣,也有多種來(lái)源,并不局限于數(shù)據(jù)庫(kù),而本人推薦的依然是javabean。用戶(hù)只要在定義好圖表的各項(xiàng)數(shù)據(jù)(比如:橫坐標(biāo)數(shù)據(jù),縱坐標(biāo)數(shù)據(jù),橫坐標(biāo)標(biāo)簽,縱坐標(biāo)標(biāo)簽,分類(lèi)標(biāo)準(zhǔn)等等)jasperreport+jfreechart會(huì)自動(dòng)進(jìn)行數(shù)據(jù)的分類(lèi)統(tǒng)計(jì)輸出,這點(diǎn)是很人性化的。

          看過(guò)jasperreport的源代碼,發(fā)現(xiàn),圖表在HTML格式輸出的時(shí)候,首先是輸出一張圖片,或者放在具體目錄下,或者放在臨時(shí)的response里,然后進(jìn)行調(diào)用、輸出展示。(如果選用后者的輸出方式,需要注意:1.x版本后的輸出需要對(duì)web.xml進(jìn)行配置,配置一個(gè)servlet進(jìn)行輸出)這樣就造成了一個(gè)問(wèn)題,就是當(dāng)多用戶(hù)同時(shí)訪(fǎng)問(wèn)頁(yè)面的時(shí)候,用戶(hù)看到的數(shù)據(jù)是正確的,但是圖片卻可能是別人產(chǎn)生的圖片!

          這可能是由于HTML瀏覽器對(duì)圖片的引用時(shí)機(jī)不對(duì),解決的方案是這樣的:由于HTML格式的輸出是字符形式的(PDF是二進(jìn)制流形式的),所以我們選擇首先把整個(gè)圖表輸出到字符緩沖區(qū)中,然后進(jìn)行一次性輸出,這樣,我們輔助瀏覽器完成對(duì)圖片引用時(shí)機(jī)的修正。當(dāng)然,也可以這樣做:通過(guò)修改源代碼,把圖片輸出到不同的臨時(shí)目錄,這樣的話(huà),想引用錯(cuò)基本都不可能了J

          HTML輸出的時(shí)候,一定要記得設(shè)置編碼格式,通過(guò)exporterCHARACTER_ENCODING屬性來(lái)設(shè)置。而且,在HTML中輸出的時(shí)候,可以不對(duì)報(bào)表進(jìn)行分頁(yè)操作,即取消分頁(yè)。

          還有,jfreechart默認(rèn)輸出的圖片是進(jìn)行抗鋸齒處理過(guò)的。對(duì)于圖形來(lái)說(shuō),這樣會(huì)讓圖像顯示的更圓潤(rùn),而對(duì)于文字來(lái)說(shuō),可能就會(huì)顯示變得模糊。解決方案:修改源代碼。可以修改jasperreport的源代碼,也可以修改jfreechart的源代碼,只需按照如下代碼進(jìn)行改進(jìn)即可:

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

          上面的代碼將圖片輸出的文本抗鋸齒關(guān)閉,而圖像依然有抗鋸齒處理,所以圖片相對(duì)好看。不過(guò),有一點(diǎn)需要注意:字體盡量是宋體,字號(hào)最好在1214之間,這樣能達(dá)到最好的顯示效果。



          posted on 2008-11-09 09:55 Ke 閱讀(8203) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): iReport
          主站蜘蛛池模板: 五原县| 崇明县| 唐河县| 同江市| 长治县| 石棉县| 任丘市| 奉节县| 杂多县| 东海县| 奉新县| 平南县| 广南县| 礼泉县| 尉犁县| 香港| 乐平市| 安康市| 广南县| 怀宁县| 凤庆县| 上蔡县| 云和县| 清苑县| 正安县| 鄱阳县| 同德县| 襄城县| 徐水县| 苍梧县| 锡林浩特市| 昌邑市| 巧家县| 金门县| 青神县| 阿图什市| 隆子县| 海原县| 舞阳县| 平邑县| 临沧市|