文章來(lái)源:http://blog.chinahr.com/blog/vincent860214/post/99218
Author: liuxiaohua mailto: vincent860214@126.com
一、iReport 是什么
iReport是一個(gè)能夠創(chuàng)建復(fù)雜報(bào)表的開源項(xiàng)目,并且它能調(diào)用JasperReports庫(kù)應(yīng)用于任何一種java應(yīng)用程序。本身是分布式的且由符合GNU通用公共許可的百分之百純java編寫。
由于它豐富的圖形界面,你能夠很快的創(chuàng)建出任何一種你想要的報(bào)表。iReport能夠讓我們提高技術(shù)方面的信心,比如它能降低學(xué)習(xí)JasperReports的XML語(yǔ)法的難度,而且能夠?yàn)槭炀毜募夹g(shù)人員節(jié)省大量的時(shí)間并能開發(fā)出非常精細(xì)的報(bào)表。
二、iReport 的下載與安裝
JasperReport 的下載地址:http://jasperreports.sourceforge.net/index.html
iReport的下載地址:http://sourceforge.net/projects/ireport
可能有幾種不同的分類
iReport-x.x.x.zip 這是官方的zip格式的二進(jìn)制文件。
iReport-x.x.x.tgz 這是官方的tar gz格式的二進(jìn)制文件。
iReport-x-x-x-src.zip 這是官方的包含源代碼的zip格式的二進(jìn)制文件。
x.x.x表明了iReport的版本號(hào)。每一種都包含必須使用的第三方的庫(kù)和程序及附加文件,例如模板和一些html格式的基礎(chǔ)教程。
三、iReport 的配置
iReport的初始化配置包括:設(shè)置所要查看運(yùn)行后的文檔的格式;選擇語(yǔ)言;設(shè)置編譯后的文件目錄。我們要配置 iReport 必須運(yùn)行剛剛安裝的 iReport。然后選擇菜單選項(xiàng)中工具選項(xiàng)(menu Options → Tools.)。
首先出現(xiàn)如下圖的界面(圖1.1)。此選項(xiàng)卡是一些簡(jiǎn)單常規(guī)的設(shè)置。
圖 1.1
這個(gè)選項(xiàng)卡(圖1.2)是用來(lái)設(shè)置編譯后的文件存儲(chǔ)目錄,默認(rèn)的目錄會(huì)在iReport的根目錄。一般情況下是要指定一個(gè)有效的目錄來(lái)保存編譯文件。這個(gè)目錄也可以是加載報(bào)表源時(shí)的目錄。筆者的文件存儲(chǔ)目錄是 D:"J2EE"iReport ,以后所有的報(bào)表文件都將被保存在這個(gè)目錄下。
圖 1.2
這個(gè)選項(xiàng)卡(圖1.3)設(shè)置 iReport 編譯后用來(lái)預(yù)覽報(bào)表的外部程序。筆者這里只設(shè)定了 IE,其它沒(méi)有設(shè)定的編譯之后 iReport 會(huì)為你生成一個(gè)對(duì)應(yīng)格式的文件保存在上面設(shè)置的默認(rèn)目錄下,但不會(huì)打開。
圖 1.3
四、創(chuàng)建 JDBC 連接
任何一種動(dòng)態(tài)報(bào)表都需要一個(gè)數(shù)據(jù)源,iReport 支持任何一款關(guān)系型數(shù)據(jù)庫(kù)作為數(shù)據(jù)源。
首先我們來(lái)看一下怎么建立一個(gè)數(shù)據(jù)源的連接。點(diǎn)菜單(圖1.4),出現(xiàn)一個(gè) Connections /Datasources 對(duì)話框。
圖 1.4
圖 1.5
筆者這里已經(jīng)創(chuàng)建了兩個(gè)數(shù)據(jù)源。如果你是第一次使用 iReport 工具來(lái)作報(bào)表的話,那么你就要首先來(lái)創(chuàng)建數(shù)據(jù)源的連接。點(diǎn)擊New 新建一個(gè)數(shù)據(jù)源連接。將出現(xiàn)(圖1.6)一個(gè) Connections properties 對(duì)話框。這里有很多種數(shù)據(jù)源類型,我們程序員常用的只有 Database JDBC connection、XML file data source、JavaBeans set data source、EJBQL connection 這幾種。其它的一般程序員很少用得到的。(呵呵…..這是筆者個(gè)人的看法)
圖 1.6
我們選擇 Database JDBC connection 后點(diǎn)擊 Next 出現(xiàn)一個(gè)數(shù)據(jù)源連接的配置屬性對(duì)話框(圖1.7)。以下是針對(duì)筆者的 Oracle 10 數(shù)據(jù)庫(kù)連接配置。
圖 1.7
配置好后我們需要測(cè)試一下是否連接成功。點(diǎn)擊 Test 進(jìn)行測(cè)試如出現(xiàn) Connectin test successful 則表示連接成功(圖1.8)。
注意:這里有一個(gè) Save password 復(fù)選框,如果你選種了此復(fù)選框,則它會(huì)將密碼保存到一個(gè) .txt 文件里面,如果你的密碼不想被暴露話的話,建議不要選此復(fù)選框。
圖 1.8
創(chuàng)建一個(gè)連接后此連接后,筆者的 iReport 就有三個(gè)數(shù)據(jù)源了(圖1.9)。
圖 1.9
注意:我們創(chuàng)建數(shù)據(jù)源連接時(shí)一定要有數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)的支持。iReport 只為我們符帶了一個(gè) MySQL 的驅(qū)動(dòng)包,并且不定符合你的 MySQL 數(shù)據(jù)庫(kù)的版本。所以我們連接任何一種關(guān)系型數(shù)據(jù)庫(kù)時(shí)都要將驅(qū)動(dòng)拷貝到 iReport 的安裝根目錄下的 lib 目錄里。
五、第一個(gè)簡(jiǎn)單的報(bào)表
第一個(gè)報(bào)表我們就采用 iReport 本身的報(bào)表精靈向?qū)?lái)創(chuàng)建一個(gè)簡(jiǎn)單的。iReport Wizard 是一個(gè)用來(lái)一步步創(chuàng)建報(bào)表的工具。點(diǎn)擊(圖2.0)菜單檔案à報(bào)表清靈,將出現(xiàn)一個(gè) iReport Wizard 對(duì)話框(圖2.1)。
圖2.0
iReport Wizard 工具可以根據(jù)你以往的模版進(jìn)行報(bào)表的創(chuàng)建。也可選擇你已經(jīng)配置好的數(shù)據(jù)庫(kù)連接作為此報(bào)表的數(shù)據(jù)源,然后編寫SQL語(yǔ)句或?qū)胍延械?/span>SQL文件。即使你不會(huì)寫SQL語(yǔ)句也可以做出一個(gè)漂亮的報(bào)表出來(lái),因?yàn)樗幸粋€(gè) Design… 按鈕(圖2.2),專門為一些不會(huì)寫SQL語(yǔ)句的人所設(shè)計(jì)的。
圖2.1
在此視圖中你可以選擇你要使用的表和表字段,并且它幫我們把表的關(guān)系給體現(xiàn)出來(lái)了。
圖 2.2
下一步需要選擇我們要在報(bào)表中顯示的字段(圖2.3)。
圖2.3
根據(jù)此向?qū)覀兛梢詣?chuàng)建四個(gè)組(事實(shí)它可以設(shè)置很多的組)。
圖2.4
向?qū)槲覀兲峁滋罪@示模版供我們選擇(圖2.5)。
圖2.5
最終它根據(jù)我們的設(shè)定生成了一份報(bào)表(圖2.6)。
圖2.6
所有的工作已經(jīng)全部完成,只需要執(zhí)行報(bào)表就可以了。點(diǎn)擊后面這個(gè)執(zhí)行動(dòng)態(tài)報(bào)表將出來(lái)下圖(圖2.7)的報(bào)表結(jié)果。
圖2.7
如何支持中文。
這個(gè)報(bào)表的所有數(shù)據(jù)都是英文的,如果您的數(shù)據(jù)有中文的話,那么您還需要進(jìn)行一步設(shè)定(圖2.8),要修改的地方有三個(gè),1.Font Name 改成中國(guó)的字體。2.PDF Font Name 改成 STSong-Light。3.PDF Encoding 改成 UniGB-UCS2-H (Chinese Simplified)。就OK啦。
圖2.8
上面我只做了一個(gè)簡(jiǎn)單的報(bào)表,其實(shí) iReport+JasperReport 最大的靚點(diǎn)就是設(shè)計(jì)可視化的圖表報(bào)表,下面是筆者做的一個(gè)簡(jiǎn)單的圖形報(bào)表(圖2.9)。
圖2.9
六、圖形報(bào)表(餅圖)
新建一個(gè)chatReport 報(bào)表
編寫SQL語(yǔ)句(圖3.0)。查詢每個(gè)部門有多少個(gè)職員。
圖3.0
選擇工具欄中插入餅圖的快捷鍵(圖3.1)
圖3.1
出現(xiàn)一個(gè)圖形報(bào)表選擇向?qū)АN覀冞x擇第二個(gè)三維餅圖(圖3.2)。
圖3.2
點(diǎn)擊OK之后,在報(bào)表的設(shè)計(jì)器中出現(xiàn)一個(gè)三維餅圖(圖3.3)。我們需要設(shè)置餅圖的一些屬性,通過(guò)右鍵 Chart Properties 來(lái)完成屬性的設(shè)定。
圖3.3
出現(xiàn)了 Chart Properties 對(duì)話框后,選擇 Chart Data 選項(xiàng)卡圖形報(bào)表的數(shù)據(jù),設(shè)置其數(shù)據(jù)來(lái)源。
對(duì)應(yīng)部門的職員的個(gè)數(shù) 部門名稱 圖3.4 關(guān)閉設(shè)計(jì)視圖。然后選擇我們要預(yù)覽的格式(圖3.5)。 圖3.5 注意:在生成PDF預(yù)覽時(shí),需要向 iReprot 的 lib 目錄下加入一個(gè) iTextAsian.jar 的亞州語(yǔ)言包,用于處理亞州語(yǔ)言的亂碼的問(wèn)題。iTextAsian.jar 現(xiàn)在很難下載得到了,如果你需要的話給我一個(gè)郵件,講明你所要的東西。 點(diǎn)擊工具欄的編譯運(yùn)行,最終執(zhí)行報(bào)表的效果(圖3.6)。 圖3.6 七、一勞永益的解決中文的問(wèn)題 前面提到過(guò)報(bào)表中的中文問(wèn)題,上面給出的解決方案比較麻煩需要對(duì)每個(gè)字段進(jìn)行設(shè)定,下面給出一個(gè)通用的設(shè)定,可以應(yīng)用到所有的字段,這樣我們只須做一次設(shè)定永久使用。 第一步:添加一個(gè)自定義的字體(圖3.7)。 圖 3.7 彈出一個(gè)添加自定義字體的對(duì)話框(圖3.8)。 圖3.8 點(diǎn)擊添加一個(gè)新的字體。要想中文不出現(xiàn)亂碼,則要跟我的配置一樣(圖3.9)。 圖3.9 配置已完生,以后在使用的時(shí)候只要選中字段然后右鍵屬性,在Font 選項(xiàng)卡中 Report Font 中選擇我的字體就OK了(圖4.0),不用像上面那樣子每次都要同時(shí)修改三個(gè)地方了。 圖4.0 八、應(yīng)用程序調(diào)用JasperReport 報(bào)表 應(yīng)用程序包結(jié)構(gòu)(圖4.1)。 圖4.1 Servlet 代碼:
iReport 工具的lib目錄下的.jar 全部拷貝到工程下面。 public void service(HttpServletRequest request, HttpServletResponse response) 記住此應(yīng)用程序需要添加一些庫(kù)支持。最簡(jiǎn)單的辦法就是把 運(yùn)行程序,打開瀏覽器。 http://localhost:8080/reportdemo/index.jsp出現(xiàn)此頁(yè)面(圖4.2)。 圖4.2 點(diǎn)擊生成報(bào)表。出現(xiàn)我們想要的報(bào)表(圖4.3)。 圖4.3 大功告成。。
throws ServletException, IOException {
try {
// 報(bào)表編譯之后生成的.jasper 文件的存放位置
File reportFile = new File(
request.getRealPath("jasperreport/employee.jasper"));
// 傳遞報(bào)表中用到的參數(shù)值
Map<String, String> parameters = new HashMap<String, String>();
// "name"是報(bào)表中定義過(guò)的一個(gè)參數(shù)名稱,其類型為String 型
// parameters.put("name", value);
byte[] bytes = JasperRunManager.runReportToPdf(
reportFile.getPath(), null, DBConnection.getConnection());
//生成PDF文件
response.setContentType("application/pdf");
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
System.out.println("出錯(cuò)");
e.printStackTrace();
}
}