iReport 和 Jasperreport整合開發web報表嚮導
一個星期下來,我針對專案中關於報表的一些需求點進行了嘗試,發現他們都可以解決,真實大快人心,於是今天把他們推薦給各位。
其實我們做報表用的只是Jasperreport,iReport是一個Jasperreport
目前幾乎還沒有中文的介紹他們整合開發的文章,儘管如此我也不準備非常詳細的介紹它們,在這裡我僅將我的一些經驗寫出來,不乏有些地方淺嘗輒止,如果想細緻的研究它們還請閱讀它們被套的英文文件。
Jasperreport的配套文件非常詳細,該文件是收費的,不過網上有流傳的電子版本,本人有幸得到一份,如果你需要可以到本人站點(http://plateau.sicool.com)獲得,在此感謝Jasperreport的為開源世界做出的貢獻。
相反iReport的文件不多,也許作者認為其足夠簡單
<?XML:NAMESPACE PREFIX = O />
好了,讓我們進入上述兩者整合開發報表的歷程……
1.首先你要得到它們最新的版本,你可以到下邊的地址下載
他們的配置也很簡單:
iReport解壓縮以後編輯目錄下的iReport.bat檔案即可,如下
@echo off set JAVA_HOME=C:/jdk14 set ANT_HOME=d:/ant set IREPORT_HOME=C:/Documenti/progetti/iReport/iReport2/ rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport |
是不是很簡單,你只要設定相應的一些路經就可以,這裡是採用ant來執行,當然如果你沒有安裝ant也不想安裝它,那麼也可以,不過這裡我買個官子,你們自己可以到解壓縮以後的目錄中找到相應的執行方法。呵呵,安裝ant吧J
Jasperreport不需要任何配置,你只需將下載以後的jar包放到classpath下即可。呵呵,說來簡單,可是如果沒有iReport來替我們幹“髒活”,那麼做報表的工作將是怎樣的痛苦~!
2.Jasperreport是如何工作的?
這裡我就往簡單裡說了。
首先要先有個xml檔案,然後編譯成jasper檔案(以.jasper結尾),我們真正要使用的是編譯以後的.jasper檔案,這很像我們熟悉的.jsp檔案,其實我們呼叫的是其編譯以後的servlet。
<?XML:NAMESPACE PREFIX = V />
(
不過靜態的報表沒有什麼意思,所以有句話說得好:
“A datasource + a jasper = a print”
它可以支援的輸出格式如下:PDF,HTML,XML,XLS,CVS等等。
因此,Jasperreport的原始輸入就是一個.xml文件,想象看一個簡單報表的xml檔案也有幾百行,在沒有iReport以前用它做報表是多麼痛苦。(令我不可思議的是,我一個同學公司曾經用jasperreport做報表,可是它們竟然沒有用過iReport,天!)
現在不用怕了,用iReport可以輕鬆的搞定這個XML,寫到這裡,我想起了struts_config.xml,也曾出現不少關於它的視覺化的編輯器,呵呵J
如果在iReport以前,如果你要做報表,你要華上很長時間來熟悉Jasperreport的文件,熟悉文件的一個用途就是編寫那個xml檔案,現在你只要他熟悉文件的時間來熟悉iReport就可以了。
3.IReport初探
先來看一下這個(rich and very simple to user GUI)吧:
如果以前你有過用vb或其他的開發工具開發報表的經驗的話,這個介面乍一看應該很熟悉的,如果碰巧你又熟悉java語言,哇,那麼你用iReport應該易如反掌啊,呵呵J
在上一篇文件裡我們初步介紹了iReport和Jasperreport,基本上我們已經對它們有了一個最初的認識,在今天這篇文件裡,我將深入的對iReport這個工具進行說明。
接著上篇文件的結尾,如果我們成功執行iReport的話,可以看到如下的主介面:
點選“新增” 按鈕可以建立一個新的空報表,考慮到生成後的XML檔案編輯的時候可以顯示中文,請在xml encoding選項上GB2312(沒有選項自己手動輸入),如下圖:
當設定玩必要的選項點選完成可以得到一個空白的報表,如下圖:
好了,輸入一段文字,很簡單,點選建立“靜態文字”按鈕 ,然後在報表任何一個工作區(如title,pageheader,detail,pagefooter summary等等)輸入,如輸入“今天天氣不錯!”
在屬性框頁可以對輸入的內容進行屬性控制,如字型,顏色,大小,以及其他的屬性,報表中任何的元素(靜態文字,線,框等等)都有自己的屬性頁,一般雙擊任何元素都可以彈出該元素的屬性頁,屬性頁如下圖:
完工,一個最簡單的報表就生成了,iReport配有執行環境,如下快捷按鈕:
左邊的按鈕是執行靜態報表(無需資料庫環境),右邊的是執行動態報表(這時需要設定資料庫連線,資料庫的連線載下面介紹)
那麼經過上遍的努力,很顯然我們將要執行的靜態報表,那麼點選左邊的按鈕就可以看到下面的pdf,如圖:
當然上遍的例子是最簡單,呵呵J
下面我將採用問答的方式進行逐步講解iReport的用法
1.如何連線資料庫?
2.如何定義變數、引數以及欄位?
3.如何定義字型以及如何使用自定義的字型(如黑體、楷體或者比較藝術化的子體)?
4.如何執行SQL指令碼進行查詢?
5.如何把做好的報表引入到應用程式中?
好了,針對上面的問題,我在下面的篇幅中給於解答並穿插介紹iReport中其它的功能選單。
1.如何連線資料庫?
靜態的報表其實很少的,我在前一篇文件中有提到過一句經典的話:
“A datasource + a jasper = a print”因此有必要首先介紹一下如何連線資料庫,其實很簡單
進入Datasource/Connections/Datasources選單或者點選 快捷按鈕,則出現下面屬性頁:
進行必要的資料庫連線屬性配置,然後點選test按鈕進行測試,如果提示測試成功,則儲存資料庫連線,即可。
2.如何定義變數、引數以及欄位?
變數、引數以及欄位的定義,在iReport裡是比較方便的,在選單view下可以看到一些控制點,如下圖:
|
Report properties 設定報表屬性 Report query 設定查詢語句的,這個在下面有介紹 Report fields設定欄位(資料庫) Report variables設定變數 Report parameters設定引數 Report fonts 設定字型 順便把下面的你個也說明一下 Bands,彈出報表工作區(如title detail等)的屬性頁 Report groups設定組 Element properties 元素屬性頁 Element browser 顯示報表所有元素的列表 |
設定很容易,但是在報表中引用這些變數、引數和欄位就有寫說頭了,呵呵J,讓我們一步一步慢慢來。
在iReport中引用的方式,如下表
元素 |
名稱 |
引用 |
變數 |
variablesName |
$V{ variablesName } |
引數 |
parameterName |
$P{ parameterName } |
欄位 |
filedsName |
$F{ filedsName } |
其實這些不說明好像不知道如何辦,一單說明了,它們也是很好用的也很簡單的。多用吧J
3.如何定義字型以及如何使用自定義的字型(如黑體、楷體或者比較藝術化的子體)?
因為考慮到使用亞洲字型,因此你需要下在額外的jar包iTextAsian.jar,如果iReport下載包中含有此jar包,此步驟可免。
目前在iReport中使用中文字型,好像只有宋體一種,如果想用其它的字型(如黑體、楷體等)需要另外的方法,這在下面介紹,下面介紹如何使用常用的中文字型“宋體”的設定方法,在問題2中我們看到引入字型的選項,點選“Report fonts”可以看到下面屬性頁:
好,如上邊的設定就已經設定好宋體,以後在報表的任何地方都可以引用該字型,如下面我們要把我們在上邊的例子中的元素“今天天氣不錯!”改為用宋體,如下:
這樣只要我們在Report font選項中選中songti 那麼下面的屬性自動繼承,呵呵,方便吧J
好,下面講述如何使用宋體以外的中文字型,如:黑體、楷體或其他的藝術化的字型。
也很簡單,不過好像目前iReport的功能不夠完美的緣故,還要手動修改xml檔案才可以達到要求,如下圖我們定義黑體:
首先不同的是在PDF font name選項中選中External TTF font…,按照常理,此時要在緊接著的選項中選擇黑體的ttf檔案SIMHEI.TTF,可是不知為什麼TrueType font的選項是空的,(當時我在學習的時候,這步操作讓我好勝鬱悶),天啊,該怎麼辦?!
後來我查看了相應的xml檔案,如下:(由於檔案較大,因此只擷取我們關心的)
<staticText> <reportElement mode="Opaque" x="13" y="42" width="239" height="53" forecolor="#000000" backcolor="#FFFFFF" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <textElement textAlignment="Left" verticalAlignment="Top" lineSpacing="Single"> <font fontName="黑體" pdfFontName="" size="36" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="true" pdfEncoding ="Identity-H" isStrikeThrough="false" /> </textElement> <text><![CDATA[黑體]]></text> </staticText> |
大家可以看到黑體的pdfFontName=””是空的,於是我嘗試把系統黑體的TTF檔案路徑(C:/WINNT/fonts/SIMHEI.TTF)寫到這個地方,哈哈,居然成功了。
於是我得到這樣一個結論,目前如果你在報表中使用其它的字型,首先要做上面圖中所做的屬性設定,然後手動把字型的TTF檔案寫到pdfFontName=””,雖然麻煩了點,不過這招挺管用,呵呵J
讓我們先回顧一下上一篇文件中已經闡述的問題:
1.如何連線資料庫?
2.如何定義變數、引數以及欄位?
3.如何定義字型以及如何使用自定義的字型(如黑體、楷體或者比較藝術化的子體)?
下面我們接著往下闡述餘下的兩個問題,在開始以前我補充兩個因該在上篇文件闡述而沒有闡述的地方。
第一個就是我忘記說明iReport怎樣把xml檔案編譯成jasper檔案,其實很簡單,點選“編譯”按鈕即可,其實在你點選兩種“執行 ”按鈕的是預設的操作就是先對xml檔案進行編譯。
第二個就是如何設定iReport的輸出格式,我們在前面曾說過iReport可以以很多種格式進行輸出,如PDF,HTML,XML,XLS,CVS等等,那麼我們該如何設定以何種方式輸出呢?
在選單Build中我們可以看出iReport的預設輸出格式為PDF,如圖:
|
PDF preview 預設輸出格 HTML preview 以網頁的格式輸出 剩下的就不說了,大家試一下就明白了,J |
但是隻在此設定輸出格式了,還沒有完成設定,還有一個必需的設定就是,為每一種設定選擇執行“環境”,例如,如果你選擇以PDF輸出,那麼你需要為其指明Acrobat Reader的路徑,如圖選擇選單Tools/Options,則會彈出如下屬性頁:
這裡還有一點我要說明的就是,在上邊途中External editor的設定是選擇編輯xml檔案的編輯器,這裡我一般用UltraEdit來編輯,你可能喜歡用其他的,譬如editplus等,那麼就把常用的xml編輯器輸入在這裡就可以隨心所欲的編輯xml檔案了,編輯xml檔案進入選單“Edit/edit XML source”,則會彈出你熟悉的編輯器來編輯該xml檔案,如圖:
還有最後一點要補充的就是,在上一篇文件中我引入非宋體的字型的pdfFontName的ttf檔案路徑都是絕對路徑(如:c:/winnt/fonts/simhei.ttf),其實這是不對的,應該把你在應用程式中的字型打包進來,這樣改絕對路徑為相對路徑(如 reportfonts/simhei.ttf),這樣就萬無一失了,呵呵J
好了,做完上邊的補充,讓我們接著前面的問題往下進行,先把下面要解決的問題列如下:
4.如何執行SQL指令碼進行查詢?
5.如何把做好的報表引入到應用程式中?
接下來讓我們一個問題一個問題的解決它J
4.如何執行SQL指令碼進行查詢?
我們大家都知道,從資料查詢必須要有查詢語句,特別綜合查詢的時候可能sql語句會複雜的多,那麼iReport是怎樣讓我們使用自己的查詢語句進行輸出的呢?我們在上一篇中曾提到過,呵呵J,希望你不會忘記,在選單view下有Reprot query項,點選則會彈出如下屬性頁:
點選上圖的“Save query to report”則會把這條SQL語句就會把這條查詢語句“引入”到報表中了,如果你此時檢視XML檔案,則會發現如下片斷:
<queryString><![CDATA[select * from users where name='Jplateau']]></queryString> |
此時我們還以上篇文章開始的例子入手,讓我們“加工”一下,如下圖:
假設我們已經設定好連線資料,那麼此時點選“執行”按鈕 則會得到如下效果:
呵呵,得到了我們期望的效果,這時,可能你要問,如果我要在sql語句中使用引數呢,那麼又該如何?其實我接下來馬上要說這個問題,如果我們要以名稱來進行模糊查詢,傳遞的引數為name,那麼期望的sql語句可能是下面這個樣子:
Select * from users where name like ‘%name%’ |
其實在iReport中也可以很容易實現,記得我們在上一篇文件中曾說過引數的使用方法,因此我不多說,我只把最終的sql語句寫給大家,相信大家一看就明白:
Select * from users where name like ‘%$P{name}%’ |
是不是很簡單?J
5.如何把做好的報表引入到應用程式中?
其實在問題4中,如果要執行帶引數的查詢報表的話,就會牽涉到問題5的,因此我在這裡還是要引用問題4種的例子。
此時我們就要引入一個jsp頁面,假設是pdf.jsp,那麼下面就是pdf.jsp的程式碼:
<%@ page import="dori.jasper.engine.*" %> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%@ page import="java.sql.*" %> <% File reportFile = new File(application.getRealPath("/reports/test.jasper")); Map parameters = new HashMap(); parameters.put("name", "p"); Connection conn=null //以下忽略得到資料庫連線過程 //…… //…… byte[] bytes = JasperRunManager.runReportToPdf( reportFile.getPath(), parameters, conn ); response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream ouputStream = response.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close(); %> |
還有一個必要的步驟就是把你下載的Jasperreport.jar放在你應用程式的lib下,
好了,啟動你的應用程式,執行dbf.jsp則會看到如下效果
怎麼樣,根據名稱的模糊查詢結果是符合我們的期望的,相信你已經掌握了上邊的方法了。
當然上邊我給出的例子都是最簡單的,而且報表的排版也比較隨意,相信一點,精美的報表可是細活啊,呵呵J,多練習吧。
總結
這篇系列文件總算寫完了,總覺得有點隨意的樣子,不過還是希望能給一點幫助,文件中不乏有些淺嘗輒止的地方,希望你不明白的地方或認為我闡述的不對的地方給我留言或寫信。