<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    泰仔在線

    java學(xué)習(xí),心情日記,繽紛時(shí)刻
    posts - 100, comments - 34, trackbacks - 0, articles - 0

    iReport制作報(bào)表

    Posted on 2008-04-08 11:59 泰仔在線 閱讀(9029) 評(píng)論(1)  編輯  收藏 所屬分類: Java 相關(guān)



            文章將會(huì)涉及3個(gè)方面的內(nèi)容:

    第一部分:使用iReport制作報(bào)表的詳細(xì)過(guò)程(Windows環(huán)境下)

    第二部分:使用Jasperreport作為報(bào)表控件開(kāi)發(fā)胖客戶端報(bào)表應(yīng)用

    第三部分:使用Jasperreport作為報(bào)表控件開(kāi)發(fā)Web報(bào)表應(yīng)用

    第一部分:使用iReport制作報(bào)表的詳細(xì)過(guò)程(Windows環(huán)境下)

    1、前言

    在網(wǎng)絡(luò)上可以搜索到很多使用iReport和Jasperreport配合實(shí)現(xiàn)各種報(bào)表任務(wù)的文章,但是我覺(jué)得很少有一篇(幾乎沒(méi)有)做一個(gè)比較詳細(xì)的介紹如何使用iReport制作報(bào)表的全過(guò)程,我所看過(guò)的文章的基本思想是覆蓋面廣,很多內(nèi)容都是提及即過(guò),并不是開(kāi)發(fā)人員都有時(shí)間為每個(gè)實(shí)踐花費(fèi)時(shí)間自己實(shí)現(xiàn),如果能有更詳細(xì)的資料,那豈不是一件樂(lè)事。出于這個(gè)念頭促使我寫(xiě)這篇文章,希望能對(duì)那些使用iReport和Jasperreport朋友有所幫助,特別是需要親身去實(shí)現(xiàn)報(bào)表的朋友,希望能給你們帶來(lái)一點(diǎn)幫助。本文不是對(duì)iReport的每個(gè)細(xì)節(jié)進(jìn)行介紹,關(guān)于iReport的每個(gè)細(xì)節(jié)可以參考iReport網(wǎng)站的資料,但是可能得花費(fèi)一些費(fèi)用。一般用戶沒(méi)有必要付出這些費(fèi)用,因?yàn)槲覀冴P(guān)心的是如何制作我們需要的報(bào)表,而不是去擴(kuò)展iReport,比如制作iReport的插件。

    2、準(zhǔn)備

    2.1、下載JDK

    地址:http://www.sun.com,選擇1.3以上版本(建議1.4.2以上版本),安裝JDK,默認(rèn)安裝即可;如果你的系統(tǒng)已經(jīng)有安裝過(guò)JDK或是有JRE即可省略這一步驟,驗(yàn)證JDK或是JRE是否可以默認(rèn)運(yùn)行,在命令行(CMD)打入X:>java 如果出現(xiàn):Usage:java………………………..開(kāi)頭的一堆信息既是通過(guò)驗(yàn)證。否則必須進(jìn)行配置,配置信息如下,在windows的環(huán)境變量設(shè)置:

    path:在最后面加入“;java的安裝目錄”

    JAVA_HOME :“java的安裝目錄”

    CLASSPATH:“java的安裝目錄\bin”

    重新驗(yàn)證JDK或是JRE是否可以在CMD任何位置運(yùn)行

    2.2、下載iReport

    地址:http://ireport.sourceforge.net/,選擇0.3.2版本(發(fā)稿之前為止建議使用的版本)解壓iReport在任意目錄,解壓后的文件里面有一個(gè)iReport.bat,通過(guò)雙擊,過(guò)大約30秒鐘如果可以彈出iReport的主窗體即表明你的系統(tǒng)已經(jīng)可以運(yùn)行iReport了,如果不能彈出主窗體,一般是第一步驟錯(cuò)誤,或是沒(méi)有完成。

    2.3、準(zhǔn)備數(shù)據(jù)庫(kù)

    iReport支持絕大部分?jǐn)?shù)據(jù)庫(kù),只要該數(shù)據(jù)庫(kù)能提供JDBC驅(qū)動(dòng)器。本文提供MySql數(shù)據(jù)庫(kù)作為例子,但是文章最后會(huì)提到如何配置Oracle的支持。關(guān)于數(shù)據(jù)庫(kù)的安裝和建立表不屬于本文的范圍,請(qǐng)參考其他資料。本文假設(shè)已經(jīng)安裝了MySql和在MySql已經(jīng)有一些表,并且確定表中已經(jīng)有數(shù)據(jù)了。

    *【特別提示】MySql的版本要求與iReport文件夾下的Lib目錄的使用MySql驅(qū)動(dòng)程序兼容,筆者建議到 http://dev.mysql.com/downloads/ 下載最新版本mysql的驅(qū)動(dòng)器,這樣就不會(huì)應(yīng)為JDBC驅(qū)動(dòng)器的問(wèn)題而當(dāng)心數(shù)據(jù)庫(kù)的支持問(wèn)題。

    2.4、啟動(dòng)MySql服務(wù)

    確定Mysql使用的的字符集是重要的問(wèn)題,特別是對(duì)需要中文報(bào)表的朋友,應(yīng)該特別注意這個(gè)問(wèn)題。

    2.5、確定商務(wù)邏輯

           也就是希望完成什么樣的報(bào)表任務(wù)。需要實(shí)現(xiàn)的報(bào)表的詳細(xì)描述,這是實(shí)現(xiàn)報(bào)表的業(yè)務(wù)條件,否則所有的任務(wù)絕大部分沒(méi)有意義。本文使用一個(gè)Bug記錄表為例,本文的例子是制作一個(gè)根據(jù)項(xiàng)目和項(xiàng)目中的模塊分組的Bug量統(tǒng)計(jì)。

    3、開(kāi)始配置基本信息

    3.1、配置界面使用的語(yǔ)言和報(bào)表輸出路徑

           第一次進(jìn)入系統(tǒng)是英文環(huán)境,可以通過(guò)【Tools】-【Options】開(kāi)啟配置iReport系統(tǒng)的基本信息對(duì)話框。在“Language”選項(xiàng)里面選擇你需要的界面語(yǔ)言,比如“中文-中國(guó)”。點(diǎn)擊【Apply】按鈕,系統(tǒng)既把整個(gè)界面中文化。

           在配置iReport系統(tǒng)的基本信息對(duì)話框中選擇【編譯】Label,之后決定你的報(bào)表輸出路徑,可以把“編譯在報(bào)表數(shù)據(jù)文件夾”選擇打勾,這樣報(bào)表的jrxml文件和jasper文件就放置同一文件夾。(在新建報(bào)表時(shí)會(huì)要求你把jrxml文件保存到指定的文件夾)

    【Options】選項(xiàng)中的一部分參數(shù)修改不能通過(guò)【Apply】按鈕直接起作用,比如“Look&Feel”,必須重新啟動(dòng)iReport才能起作用。不知道是不是iReport的Bug?!最后【存檔】。

    3.2、配置MySql的數(shù)據(jù)庫(kù)連接

           這就是報(bào)表與數(shù)據(jù)庫(kù)的接口。可以通過(guò)【資料來(lái)源】-【連接/資料來(lái)源】開(kāi)啟配置列表對(duì)話框,iReport會(huì)記錄以前使用的所有連接,除非你手工刪除這些連接,否則所有的連接都會(huì)存在連接/資料來(lái)源配置列表對(duì)話框中,不管是否確實(shí)可用。

           點(diǎn)擊【New】進(jìn)入配置新連接界面,如圖:

    填寫(xiě)JDBC連接需要的信息,iReport支持多種數(shù)據(jù)源連接,如圖:

    本文只是介紹DataBase JDBC Connection連接方式,這也是最常用的方式,特別是在嵌入式報(bào)表應(yīng)用。所有的信息填寫(xiě)并測(cè)試通過(guò)之后,最后就是保存信息。回到配置列表對(duì)話框,關(guān)閉對(duì)話框,完成MySql數(shù)據(jù)庫(kù)JDBC連接配置。

    提示:如果你需要報(bào)表提供中文內(nèi)容顯示可以在JDBC URL下工夫,比如輸入:

    jdbc:mysql://localhost/SUBRDB?user=****&password=****&useUnicode=true&characterEncoding=GB2312

    其中的****號(hào)替換成數(shù)據(jù)庫(kù)的用戶合密碼。

    3.3、新建一個(gè)空?qǐng)?bào)表的基本配置

    單擊工具欄的第一個(gè)工具“New Report”,新建一個(gè)報(bào)表,輸入報(bào)表名稱和定義報(bào)表的一些參數(shù),比如名稱輸入BugsRpt(例子是做一個(gè)項(xiàng)目的Bug量統(tǒng)計(jì)報(bào)表),單擊【More….】選擇標(biāo)簽,填寫(xiě)或是選擇XML編碼,這是關(guān)系到你的XML支持的字符集的選擇,請(qǐng)根據(jù)需要選擇,比如需要你的XML文件支持中文,那么可以輸入GB2312或是GBK,之后點(diǎn)擊【OK】按鈕,進(jìn)入報(bào)表的設(shè)計(jì)界面。

    *【特別提示】請(qǐng)?jiān)陂_(kāi)始任何工作之前保存報(bào)表,這時(shí)iReport提示保存報(bào)表的位置,選擇合適的位置之后輸入BugsRpt作為名稱。

    3.4、定義報(bào)表可能需要的字體類型及其屬性

           一個(gè)報(bào)表的內(nèi)容五花八門(mén),有表頭、欄位名、數(shù)據(jù)、其他變量信息等等,如果這些信息都是一致的字體和屬性(比如顏色),那么整個(gè)報(bào)表就死氣沉沉,顯得很粗糙了。我們可以在為報(bào)表添加每個(gè)元素時(shí)定義元素的屬性,但是那是一個(gè)多么費(fèi)時(shí)的工作,如果能預(yù)先定義一些屬性的組合,之后在創(chuàng)建每個(gè)元素時(shí)只需選擇這些組合的其中一個(gè)即可,省事又快速。

           單擊【預(yù)覽】-【報(bào)表字體】開(kāi)啟自定義組合對(duì)話框。單擊【New】進(jìn)入定義詳細(xì)對(duì)話框,如圖:按照?qǐng)D中的順序填寫(xiě)信息和步驟,依次定義“表頭”、“組”、“列”、“列內(nèi)容”、“統(tǒng)計(jì)計(jì)算”、“其他”等6中字體組合。注意PDF內(nèi)嵌字體的選擇,如果你需要報(bào)表時(shí)以PDF文件格式提供,那么對(duì)此需要作出選擇。

    4、理解幾個(gè)重要的概念

    4.1、iReport的輸出格式

    iReport的預(yù)覽輸出格式可以支持以下幾種:

    PDF、HTML、CSV、JAVA2D、Excel、純文字、JRViewer,其中最常用的是PDF、JRViewer。本文以JRViewer為例子。JRViewer是直接以C/S方式作為報(bào)表的輸出格式,在JFrame框架下輸出。Jasperreport提供默認(rèn)的JRViewer輸出類。

    4.2、報(bào)表的動(dòng)態(tài)對(duì)象變量、參數(shù)、字段

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

    ·字段(Fields):是數(shù)據(jù)庫(kù)抽取出來(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 }

    每種對(duì)象的定義格式如每個(gè)對(duì)象的后面說(shuō)明,比如定義一個(gè)變量(Variables),那么表達(dá)式就寫(xiě)成$V{ variablesName },報(bào)表中出現(xiàn)的就是這個(gè)變量的名稱。后文會(huì)詳細(xì)的介紹使用方法。

    4.3、編譯、靜態(tài)運(yùn)行、動(dòng)態(tài)運(yùn)行

    Jasperreport運(yùn)行時(shí)需要的就是一個(gè)jasper后綴的文件,編譯過(guò)程其實(shí)就是把jrxml后綴的文件生成jasper后綴的文件。(可以參考Jasperreport的運(yùn)行原理)

    靜態(tài)運(yùn)行和動(dòng)態(tài)運(yùn)行是相對(duì)的,后者帶數(shù)據(jù)源運(yùn)行,比如帶數(shù)據(jù)庫(kù)運(yùn)行。前者就是靜態(tài)文本運(yùn)行,和數(shù)據(jù)源無(wú)關(guān),如果報(bào)表中出現(xiàn)和數(shù)據(jù)源有關(guān)的對(duì)象,則以null顯示。

    4.4、報(bào)表結(jié)構(gòu)

           一個(gè)報(bào)表的結(jié)構(gòu)大致是幾個(gè)部分:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。

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

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

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

    ·Detial:放置需要循環(huán)的數(shù)據(jù),比如銷售記錄數(shù)據(jù)。

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

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

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

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

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

    5、向表添加對(duì)象

    5.1、添加靜態(tài)對(duì)象

    可以通過(guò)工具欄的工具添加靜態(tài)對(duì)象,比如文本,點(diǎn)擊【T】,之后在報(bào)表的空白處單擊,如此即可把靜態(tài)對(duì)象添加到報(bào)表,然后拖動(dòng)對(duì)象的邊框,使它的大小合適,雙擊對(duì)象彈出對(duì)象的屬性配置對(duì)話框,切換到【Font】Label,在“Report font”的ComBox選擇“表頭”字體,(表頭字體是前文提供的自定義屬性組合),再切換到【Static Text】Label,修改表頭的名字,比如“Bug統(tǒng)計(jì)報(bào)表”或是“銷售記錄統(tǒng)計(jì)表”等等與業(yè)務(wù)有關(guān)的內(nèi)容。添加圖片,請(qǐng)點(diǎn)擊【Image Tool】,之后的操作與Text類似。其他靜態(tài)對(duì)象操作步驟類似。

    5.2、使用連接

           還記得前文提供的(3.2節(jié))配置MySql數(shù)據(jù)庫(kù)連接嗎?這里我們將要使用前文配置的連接了。選擇菜單【建立】-【使用動(dòng)態(tài)連接】開(kāi)啟可選的動(dòng)態(tài)連接,選擇任何一個(gè)你需要的連接最后【OK】,保存報(bào)表,這樣你的報(bào)表就使用了這個(gè)連接了。

    *【特別提示】此連接必須與以后應(yīng)用程序使用的連接一致。

    5.3、創(chuàng)建SQL查詢語(yǔ)句

           SQL語(yǔ)句是對(duì)任何RDBMS起作用的語(yǔ)言,外部用戶需要使用這些語(yǔ)言管理維護(hù)數(shù)據(jù)庫(kù)中的數(shù)據(jù),同樣的,iReport也是需要這么做,我們需要提供查詢數(shù)據(jù)庫(kù)的語(yǔ)言-SQL語(yǔ)句,這樣,iReport即可通過(guò)此SQL語(yǔ)句獲取數(shù)據(jù),之后組織到報(bào)表中并顯示出來(lái),以滿足用戶的需要為目的。

           通過(guò)菜單【資料來(lái)源】-【報(bào)表查詢】開(kāi)啟SQL輸入對(duì)話框,并在【Report SQL Query】 Label中輸入SQL語(yǔ)句如圖:圖中的“Automatically Retrieve Fields”checkbox和“ReadFields”Button是確認(rèn)自動(dòng)獲取還是手動(dòng)獲取數(shù)據(jù)庫(kù)表的可用Fields。單擊【OK】,保存報(bào)表。

    5.4、創(chuàng)建字段動(dòng)態(tài)對(duì)象

    報(bào)表的動(dòng)態(tài)對(duì)象有變量、參數(shù)、字段,前文提及了他們的概念,這里將要一一講解如何使用。

    字段也就是數(shù)據(jù)庫(kù)中的字段,通過(guò)菜單【預(yù)覽】-【報(bào)表字段】開(kāi)啟字段的列表(工具條上可以找到相應(yīng)的工具),可以拖放任意字段到報(bào)表的任何位置,比如拖動(dòng)一部分Bug的內(nèi)容字段到detial段(內(nèi)容無(wú)關(guān)緊要,只要知道原理)。

    5.5、創(chuàng)建組

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

    組的參數(shù)設(shè)定可以看界面即可理解部分,其中最主要的是“Group expression”,這是必須輸入格式正確的并且存在的字段名稱,本文的“proname”是【字段】中的一個(gè)元素。依此類推,建立其他的組對(duì)象。每建立一個(gè)組,在報(bào)表的界面上都會(huì)出現(xiàn)該組對(duì)應(yīng)的段,如圖:至于他們的意義和容納的內(nèi)容參考“4.4報(bào)表結(jié)構(gòu)”,他們是首尾對(duì)應(yīng)出現(xiàn)的。(Header和Footer)

    5.6、添加參數(shù)和使用參數(shù)

    我們重申參數(shù)作用,一般是需要外界提供參數(shù)給報(bào)表的入口,比如SQL語(yǔ)句的where條件的表達(dá)式。通過(guò)【預(yù)覽】-【報(bào)表參數(shù)】開(kāi)啟報(bào)表參數(shù)列表對(duì)話框(工具條上可以找到相應(yīng)的工具)。如圖:輸入名稱及其他參數(shù)。【ok】,保存報(bào)表。

    那么如何使用呢?打開(kāi)SQL語(yǔ)句對(duì)話框,參考“5.3創(chuàng)建SQL查詢語(yǔ)句”,這時(shí)候的SQL語(yǔ)句應(yīng)該是:

    SELECT *

    FROM bugs  where proname=$P{ProjectName} order by proname,modulename

    注意其中的紅體字部分,就是把剛才定義的變量運(yùn)用到SQL語(yǔ)句了。這樣當(dāng)應(yīng)用提供參數(shù)時(shí),只要指定提供給這個(gè)參數(shù),那么報(bào)表解釋引擎即可替換這些變量然后再執(zhí)行SQL語(yǔ)句,在第二部分提到編程時(shí),會(huì)提供參數(shù)設(shè)定代碼。

    5.7、添加變量和使用變量

    變量的定義類似參數(shù),通過(guò)【預(yù)覽】-【報(bào)表變量】開(kāi)啟報(bào)表變量列表對(duì)話框(工具條上可以找到相應(yīng)的工具),如圖,圖中定義的變量的作用是:定義一個(gè)Bug的計(jì)數(shù)器,數(shù)據(jù)類型是java.lang.Integer,使用Count函數(shù)進(jìn)行統(tǒng)計(jì)字段tester,作用范圍是模塊組,也就是統(tǒng)計(jì)模塊的Bug量。其中的tester可以改成其他非組對(duì)象,比如proname是組對(duì)象,就不要用作這里的統(tǒng)計(jì)參數(shù)。以上提供的是自定義變量,其實(shí)iReport系統(tǒng)還有提供一些內(nèi)嵌(Buildin)的變量,比如頁(yè)碼,行記錄數(shù)等,視需要而使用。

    6、最后的報(bào)表

    6.1、完成后的報(bào)表

    6.2、預(yù)覽報(bào)表

    點(diǎn)擊動(dòng)態(tài)運(yùn)行報(bào)表,出現(xiàn)如圖內(nèi)容:

    7、總結(jié)

    第一部分只是介紹了如何制作一個(gè)動(dòng)態(tài)數(shù)據(jù)報(bào)表,其實(shí)iReport還有提供很多的特性供開(kāi)發(fā)人員使用,比如柱狀圖、餅圖、及各種形狀的圖形等,滿足企業(yè)絕大部分應(yīng)用的需求。希望你能繼續(xù)研究并充分利用。    

        關(guān)于使用Oracle數(shù)據(jù)庫(kù)作為數(shù)據(jù)源的內(nèi)容:提供與使用的Oracle版本對(duì)應(yīng)的JDBC驅(qū)動(dòng),把驅(qū)動(dòng)放置在iReport的lib目錄,配置數(shù)據(jù)庫(kù)的JDBC連接時(shí)如圖:其它操作基本沒(méi)有區(qū)別。

    8、補(bǔ)充內(nèi)容

    8.1、實(shí)現(xiàn)表格

    可以在Detial中加入必要線條實(shí)現(xiàn)表格,配合columnFooter、columnHeader、Detial這3個(gè)位置實(shí)現(xiàn),您可以試試畫(huà)線的位置!

    第二部分:使用Jasperreport作為報(bào)表控件開(kāi)發(fā)胖客戶端報(bào)表應(yīng)用

    1、概述

    我們對(duì)第一部分的內(nèi)容做個(gè)簡(jiǎn)要的回憶,第一部分主要是介紹使用iReport如何制作一個(gè)數(shù)據(jù)報(bào)表,我認(rèn)為文章比較詳細(xì)的介紹“如何從零到滿足大部分需求報(bào)表出現(xiàn)”。但是文中沒(méi)有涉及Jasperreport的任何內(nèi)容,目的是讓你純粹的理解如何做報(bào)表,因?yàn)樽鰣?bào)表和把報(bào)表內(nèi)嵌到應(yīng)用程序編程是可以分工的,便于整合也便于分解。

    我們知道iReport是一個(gè)Jasperreport的前端開(kāi)發(fā)工具,iReport用來(lái)制作和預(yù)覽報(bào)表,為應(yīng)用使用報(bào)表提供足夠的前端支持。現(xiàn)在簡(jiǎn)要的介紹Jasperreport是如何工作的,這樣你可以更好的理解iReport是如何幫助Jasperreport實(shí)現(xiàn)前端的工作,其實(shí)這些工作在我們看來(lái)就是“臟活”,為什么呢?看看下面的資料就知道了。

            通過(guò)上圖你大概已經(jīng)明白Jasperreport的工作原理了。首先是要有一個(gè)XML文件(一般是以jrxml后綴),那么這個(gè)XML文件從那里來(lái)呢?做什么用呢? 這個(gè)XML文件就是報(bào)表的定義文件,整個(gè)報(bào)表的每一個(gè)細(xì)節(jié)都在這個(gè)XML文件之中定義,一個(gè)簡(jiǎn)單報(bào)表的xml文件就有幾百行,你可以手工編輯這個(gè)XML文件(一行一行,一段一段的編輯吧――這就是所謂的“臟活”)。如果是手工制作這個(gè)XML文件,單從效率上考慮就不允許,特別是現(xiàn)在很多應(yīng)用系統(tǒng)的開(kāi)發(fā)時(shí)間變得越來(lái)越緊張,總是會(huì)在時(shí)間上出問(wèn)題。節(jié)省時(shí)間最好的辦法就是充分的利用自動(dòng)化工具,詹姆斯.馬丁的軟件工程思想也是反復(fù)的強(qiáng)調(diào)過(guò)程的自動(dòng)化,如何做到自動(dòng)化呢?就是充分的利用自動(dòng)化工具集成到開(kāi)發(fā)流程,說(shuō)了一大堆不就是為了說(shuō)要用iReport來(lái)做報(bào)表嗎!這是我們第一部分已經(jīng)完成的工作,但是這里重要的是理解Jasperreport的工作原理。

    2、結(jié)合Jbuilder開(kāi)發(fā)胖客戶端報(bào)表應(yīng)用

    2.1、建立Application

    參考Jbuilder有關(guān)資料。只要是普通Window窗口應(yīng)用即可。

    2.2、引入JasperReports需要的庫(kù)文件

    通過(guò)jbuilder9【Tool】-【configure Libraries】-按最左邊的【New】-輸入一個(gè)名稱,比如Report-【add】按鈕,導(dǎo)航到iReport的lib目錄,把lib目錄里面的所有文件引入。如圖:

    按兩次OK回到Jbuilder的開(kāi)發(fā)界面。

    2.3、向工程添加Report系列庫(kù)文件

    通過(guò)右擊工程,選擇【properties】-【paths】Label-【Required Libraries】Label-【Add】按鈕-選擇“Report”-按兩次OK回到Jbuilder的開(kāi)發(fā)界面。這樣就添加完成了需要的庫(kù)文件了。這么做是比較理想的,但是報(bào)表運(yùn)行時(shí)可能不需要iReport的lib下所有的jar文件。

    2.4、在主界面上添加需要的組件

    在主Frame添加一個(gè)Button和一個(gè)Label以及一個(gè)TextBox,當(dāng)然你也可以通過(guò)創(chuàng)建菜單連接,如圖:

    這個(gè)窗體時(shí)用來(lái)做測(cè)試用的,實(shí)際的界面可能很復(fù)雜,其中的TextBox就是為報(bào)表的變量做準(zhǔn)備的。這里填寫(xiě)的值就是要傳遞給報(bào)表的變量,也就是第一部分定義的帶$P{}符號(hào)的變量,程序會(huì)把他們對(duì)應(yīng)起來(lái)。Button的單擊事件代碼如下:

    /**

       * RptDialog對(duì)話框是用來(lái)承載報(bào)表的顯示。

       * @param e

       */

      void jButton1_actionPerformed(ActionEvent e) {

            //請(qǐng)創(chuàng)建一個(gè)對(duì)話框類RptDialog

         RptDialog dlg = new RptDialog(this.jGroupID.getText());

         Dimension dlgSize = dlg.getPreferredSize();

         Dimension frmSize = getSize();

         Point loc = getLocation();

         dlg.setLocation( (frmSize.width - dlgSize.width) / 2 + loc.x,

                         (frmSize.height - dlgSize.height) / 2 + loc.y);

         dlg.setModal(true);

         dlg.pack();

         dlg.show();

      }

    RptDialog是接下來(lái)制作的一個(gè)Dialog對(duì)象,通過(guò)Jbuilder新建一個(gè)Dialog對(duì)象并命名RptDialog。RptDialog的代碼如下:

    import java.awt.*;

    import javax.swing.*;

    import dori.jasper.engine.*;

    import dori.jasper.view.*;

    import dori.jasper.engine.util.JRLoader;

    import java.sql.Connection;

    import java.io.File;

    import java.util.Map;

    import java.util.HashMap;

    import mytest.trac.CommectionDB;

    /**

     * <p>Title: RptDialog </p>

     * <p>Description: 報(bào)表承載對(duì)話框</p>

     * <p>Copyright: Copyright (c) 2004</p>

     * <p>Company: *****</p>

     * @author 李克喜

     * @version 1.0

     */

    public class RptDialog extends JDialog {

      JPanel ReportPan = new JPanel();

      BorderLayout borderLayout1 = new BorderLayout();

      //Bug項(xiàng)目名稱

      String proname = "";

      //顯示報(bào)表需要的控件

      JRViewer jrview;

      public RptDialog(String GroupID) {

        proname = GroupID;

        try {

          jbInit();

          pack();

        }

        catch (Exception ex) {

          ex.printStackTrace();

        }

      }

      private void jbInit() throws Exception {

        ReportPan.setLayout(borderLayout1);

        getContentPane().add(ReportPan);

        //裝載報(bào)表,在Jbuilder工程的目錄創(chuàng)建一個(gè)Reports文件夾,并把報(bào)表的jasper文件擱置在該文件夾。

        String reportPath = System.getProperty("user.dir") + "\\Reports\\ BugsRpt.jasper";

        JasperReport jasperReport =

    (JasperReport) JRLoader.loadObjectFromLocation(reportPath);

        //創(chuàng)建數(shù)據(jù)庫(kù)的連接,參考java的JDBC編程資料創(chuàng)建連接方式

        CommectionDB conndb = new CommectionDB();

        //注意:這個(gè)連接要求與制作報(bào)表時(shí)使用的連接一致

        Connection conn = conndb.getDbConnection();

        //報(bào)表配置參數(shù),前文提過(guò)的SQL語(yǔ)句的Where條件參數(shù)就是與這里對(duì)應(yīng)。

      //條件的值可能是通過(guò)多種方式得到的,比如上一個(gè)頁(yè)面?zhèn)鬟f過(guò)來(lái)的

        Map parameters = new HashMap();   

        //ProjectName就是iReport的變量$P{ProjectName}的名稱,參考第一部分的5.6添加參數(shù)和使用參

    proname就是從界面上獲取的值。

     parameters.put("ProjectName ", proname);  

     JasperPrint jasperPrint =

               JasperFillManager.fillReport(

               jasperReport,

               parameters,

               conn

        );

       //裝載過(guò)程,注意其中的紅體字部分

       jrview = new dori.jasper.view.JRViewer(jasperPrint);

       ReportPan.setLayout(borderLayout1);

       ReportPan.setPreferredSize(new Dimension(800, 600));

       getContentPane().add(ReportPan, BorderLayout.CENTER);

       ReportPan.add(jrview,null);

      }

    }

    到這里,所有需要設(shè)置和編程的工作基本完成了。

    3、運(yùn)行

    確定數(shù)據(jù)庫(kù)已經(jīng)啟動(dòng)了,在JBuilder運(yùn)行應(yīng)用程序。在TextBox輸入有意義的組值,比如“BugWin系統(tǒng)”,這是我的測(cè)試值,實(shí)際情況是根據(jù)你的需要來(lái)確定的。單擊Button,系統(tǒng)會(huì)彈出對(duì)話框,運(yùn)行結(jié)果和第一部分6.2、預(yù)覽報(bào)表結(jié)果一致。

    4、總結(jié)

    隨著技術(shù)的進(jìn)步,應(yīng)用環(huán)境的不斷變化,胖客戶端的應(yīng)用可能會(huì)逐漸退出主流,但是它的存在是必要的。所以我要寫(xiě)胖客戶端的應(yīng)用方面的報(bào)表使用技術(shù)。文中簡(jiǎn)要明了的介紹了如何使用Jasperreport編程報(bào)表程序。希望對(duì)你有一點(diǎn)幫助。

    第三部分:使用Jasperreport作為報(bào)表控件開(kāi)發(fā)Web報(bào)表應(yīng)用

    1、概述

    如何實(shí)現(xiàn)發(fā)Web報(bào)表有很多的選擇,自定義CSS+HTML或是XSLT+XML或是其他控件,特別是支持圖表的控件,比如:jfreechart。本文作為Web報(bào)表的一種實(shí)現(xiàn)方式,建議你使用Jasperreport作為報(bào)表控件,第一、二部分已經(jīng)對(duì)制作報(bào)表和開(kāi)發(fā)胖客戶端報(bào)表應(yīng)用做了介紹,其實(shí)有很多的文章可以參考實(shí)現(xiàn)第三部分的內(nèi)容,不止是我寫(xiě)的這篇文章。

    2、數(shù)據(jù)連接建立

    參考http://blog.csdn.net/jemlee2002/archive/2004/09/28/JJEM.aspx,這里有詳細(xì)的介紹數(shù)據(jù)庫(kù)的連接過(guò)程。

    3、拷貝必要的jar文件到Web應(yīng)用的WEB-INF\lib目錄

    每個(gè)Web應(yīng)用都會(huì)有WEB-INF目錄,但是lib是不一定有的,如果沒(méi)有就創(chuàng)建它,本文需要的jar庫(kù)文件有3個(gè):

    jasperreports-0.5.3.jar :jasperreports執(zhí)行時(shí)需要的API

    iTextAsian.jar :亞洲字符集支持

    itext-1.02b.jar :其他字符集支持

    如果你的報(bào)表全英文或是不需要支持亞洲字符集,那么iTextAsian.jar、可以不要。

    4、創(chuàng)建repotrs目錄并導(dǎo)入.jasper文件

    在Web應(yīng)用中根目錄下創(chuàng)建repotrs目錄,其實(shí)這是一種建議,沒(méi)有必要完全按照這樣做,你可以根據(jù)你的業(yè)務(wù)需要?jiǎng)?chuàng)建N個(gè)目錄或是層次目錄。

    把.jasper文件拷貝到repotrs目錄下,比如例子中的BusinessRpt.jasper文件。

    5、例子程序

    Test.jsp文件的內(nèi)容:

    <%@ page session="false" %>

    <%@ page import="dori.jasper.engine.*" %>

    <%@ page import="javax.naming.*"%>

    <%@ page import="java.sql.*"%>

    <%@ page import="javax.sql.*"%>

    <%@ page import="java.util.*" %>

    <%@ page import="java.io.*" %>

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

    <title></title>

    <%   

       DataSource ds 
    = null;

       
    try{

            InitialContext ctx
    =new InitialContext();

            ds
    =(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");

            Connection conn 
    = ds.getConnection();

            
    //裝載jasper文件

            File business_rpt 
    = new File(application.getRealPath("/reports/BusinessRpt.jasper"));

            
    //配置參數(shù),可以參考《第二部分:使用Jasperreport作為報(bào)表控件開(kāi)發(fā)胖客戶端報(bào)表應(yīng)用》

            
    // http://blog.csdn.net/jemlee2002/archive/2004/10/08/JJem3.aspx

            
    //ProjectName就是iReport的變量$P{ProjectName}的名稱,

            
    //參考第一部分的5.6添加參數(shù)和使用參數(shù)

            
    //proname就是從界面上獲取的值。

    Map parameters 
    = new HashMap();

            parameters.put(
    "ProjectName ", proname); 

            
    // JasperRunManager是一個(gè)輸出控制管理類,下文會(huì)提及部分內(nèi)容

            JasperRunManager.runReportToHtmlFile(business_rpt.getPath(),parameters,conn);

           
    //如果創(chuàng)建報(bào)表成功,則轉(zhuǎn)向該報(bào)表,其實(shí)可以把報(bào)表套在框架內(nèi),這樣實(shí)現(xiàn)比較有意義的報(bào)表格式。

            response.sendRedirect(
    "/reports/BusinessRpt.html");

       }
    catch(Exception ex){

           out.print(
    "出現(xiàn)例外,信息是:"+ex.getMessage());

           ex.printStackTrace();

       }


    %>

    </head>

    <body>

    </body>

    </html>

    6、關(guān)于JasperRunManager

    JasperRunManager有很多的靜態(tài)方法,控制輸出的格式,比如輸出格式是pdf或是html等,建議瀏覽JasperRunManager的一些方法,這樣對(duì)開(kāi)發(fā)報(bào)表輸出有幫助。

    7、輸出內(nèi)容

    例子中輸出格式是以HTML文件格式,所以web服務(wù)器可以直接解釋并顯示,效果不錯(cuò)。

    8、總結(jié)

    終于把3個(gè)部分的內(nèi)容全部寫(xiě)完,到這里我可以休息一小會(huì)兒了,就像一休大師說(shuō)得:“休息,休息……”.


            轉(zhuǎn)載自:  iReport制作報(bào)表

    Feedback

    # re: iReport制作報(bào)表  回復(fù)  更多評(píng)論   

    2012-11-28 15:09 by jemlee2002
    哥哥。。這沒(méi)寫(xiě)明出處哦!
    主站蜘蛛池模板: 999久久久免费精品国产| 一区二区三区在线观看免费| 国产午夜亚洲精品| 亚洲av一本岛在线播放| 亚洲三级在线免费观看| 亚洲视频一区二区三区四区| 免费黄网站在线观看| 成人久久免费网站| 无码一区二区三区免费| 91精品免费高清在线| 无码人妻精品中文字幕免费东京热| free哆啪啪免费永久| 毛片免费视频播放| 国产成人免费手机在线观看视频| 无码国产亚洲日韩国精品视频一区二区三区 | 美女被羞羞网站免费下载| 免费人成网站永久| a在线观看免费网址大全| 久久综合九色综合97免费下载 | 337p日本欧洲亚洲大胆人人| 深夜a级毛片免费无码| a级黄色毛片免费播放视频| 污污网站免费观看| 成视频年人黄网站免费视频| 日韩一区二区在线免费观看| 亚洲精品视频免费观看| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲综合激情九月婷婷| 最新亚洲成av人免费看| 亚洲综合自拍成人| 亚洲综合小说另类图片动图| 免费人成动漫在线播放r18| 日韩精品在线免费观看| 三年片在线观看免费大全| 免费v片在线观看| 亚洲va久久久噜噜噜久久| 色偷偷亚洲女人天堂观看欧| 国产成人亚洲精品91专区高清 | 亚洲嫩模在线观看| 亚洲人成网站影音先锋播放| 亚洲色大情网站www|