這幾天在弄ireport+jasperreports的報表,終于弄得差不多了····
下面就把我這幾天做的一些東西記錄下來····
其中提出一些特別要注意的地方(我就是在那幾個地方浪費(fèi)了些時間)···
1、先介紹一下ireport及asperreports吧····
Jasperreport是一個報表制作程序,用戶需要按照它制定的規(guī)則編寫一個XML文件,
然后得到用戶需要輸出的格式文件。它支持輸出的文件格式包括PDF,HTML,XML,XLS,CVS等等。
而iReport就是一個制作Jasperreport的XML文件的可視化開發(fā)工具。
2、下載ireport和jasperreports···
jasperreport下載地址:(我下的是jasperreports-0.6.8)
http://jasperreports.sourceforge.net
ireport下載地址:(我下的是iReport0.5.0)
http://ireport.sourceforge.net
3、下載了ireport將它解壓縮以后運(yùn)行iReport.bat文件,過大約30秒如果能出現(xiàn)ireport的主窗體
則表明你的系統(tǒng)已經(jīng)可以運(yùn)行ireport了,但是我的不行,所以我編輯目錄下的iReport.bat文件,
代碼如下····
@echo off
set JAVA_HOME=C:\j2sdk1.4.0_03
set ANT_HOME=C:\ant
set IREPORT_HOME=C:\Documenti\progetti\iReport\iReport2\
rem %ANT_HOME%\bin\ant javadocs
%ANT_HOME%\bin\ant iReport
----------------
這里是采用ant來運(yùn)行的,所以還需要下載一個ant···
如果你沒有安裝ant的話也可以找到noAnt文件夾下的startup.bat文件即可運(yùn)行···
4、數(shù)據(jù)庫···
我是用的mysql數(shù)據(jù)庫,之前配置數(shù)據(jù)庫的JDBC驅(qū)動器一直不成功原因是我下的mysql的jdbc驅(qū)動太老了,
和ireport的不兼容····
建議到
http://dev.mysql.com/downloads/
下載最新版本···
5、配置數(shù)據(jù)庫連接····
這個是報表與數(shù)據(jù)庫的接口,通過<資料來源>--<連接/資料來源>開啟配置對話框,ireport會記錄以前使用的
所有連接,除非你手工刪除這些連接,否則連接將一直存在···
配置新連接界面如下:
?
提示:如果你需要報表提供中文內(nèi)容顯示可以在JDBC URL下工夫,比如輸入:
jdbc:mysql://localhost/xiaoya?user=root&password=root&useUnicode=true&characterEncoding=GB2312
6、中文問題····
解決pdf中文問題需要下載itextasian.jar和itext-1.3.jar,將其下載后放到ireport/lib下即可··
要在這里提一下的是之前我也下載了這兩個東東放到指定的位置了可還是亂碼,后來還是解決了··
解決方法:
在iReport中新建一個TextField的時候會自動把pdf字體設(shè)為CP1252,這個是需要修改的,
否則pdf輸出會報錯說找不到字體,我就被這個捆饒了很久,修改如圖:
7、理解幾個重要的概念····
? a、iReport的輸出格式····
??? iReport的預(yù)覽輸出格式可以支持以下幾種:
??? PDF、HTML、CSV、JAVA2D、Excel、純文字、JRViewer,其中最常用的是PDF、JRViewer。
??? 本文以JRViewer為例子。JRViewer是直接以C/S方式作為報表的輸出格式,在JFrame框架下輸出。Jasperreport提供默認(rèn)的JRViewer輸出類。
? b、報表的動態(tài)對象變量、參數(shù)、字段····
??? 在使用iReport的過程中會碰到很多與變量(Variables)、參數(shù)(Parameters)、字段(Fields)這些有關(guān)的內(nèi)容,我們要介紹這些對象的使用和意義:
?? ·字段(Fields):是數(shù)據(jù)庫抽取出來的,希望在報表中出現(xiàn)的數(shù)據(jù)庫內(nèi)容。
???? 比如一個ID的所有值。$F{ filedsName }
?? ·參數(shù)(Parameters):這是你的應(yīng)用需要提供給報表的入口,
???? 比如你希望在報表被解釋的時候提供Where語句的條件值,
???? 那么就可以使用參數(shù)(Parameters)。$P{ parameterName }
?? ·變量(Variables):這是報表中一些邏輯運(yùn)算的表現(xiàn),比如統(tǒng)計值。$V{ variablesName }
???? 每種對象的定義格式如每個對象的后面說明,比如定義一個變量(Variables),
???? 那么表達(dá)式就寫成$V{ variablesName },報表中出現(xiàn)的就是這個變量的名稱。
?? c、編譯、靜態(tài)運(yùn)行、動態(tài)運(yùn)行···
???? Jasperreport運(yùn)行時需要的就是一個jasper后綴的文件,編譯過程其實就是把jrxml后綴的文件生成jasper后綴的文件。(可以參考Jasperreport的運(yùn)行原理)?靜態(tài)運(yùn)行和動態(tài)運(yùn)行是相對的,后者帶數(shù)據(jù)源運(yùn)行,比如帶數(shù)據(jù)庫運(yùn)行。前者就是靜態(tài)文本運(yùn)行,和數(shù)據(jù)源無關(guān),如果報表中出現(xiàn)和數(shù)據(jù)源有關(guān)的對象,則以null顯示。
?? d、報表的結(jié)構(gòu)···
?????? 一個報表的結(jié)構(gòu)大致是幾個部分:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。
???? ·Title:每個報表一般會有一個名字,比如×××銷售報表,title就是擱置這個名稱的最好地方了,當(dāng)然你也可以根據(jù)需要擱置在合適的地方。
???? ·pageHeader:報表的一些公共要素,比如頁碼、創(chuàng)建時間、創(chuàng)建人等信息放置在這里是比較好的選擇。
???? ·columnHeader:無可非議的這里是放置列的名稱,記住不是列數(shù)據(jù)。
???? ·Detial:放置需要循環(huán)的數(shù)據(jù),比如銷售記錄數(shù)據(jù)。
???? ·columnFooter:放置列級別的統(tǒng)計計算值或是列的說明。
???? ·pageFooter:放置頁級別的統(tǒng)計值或是頁的說明。
???? ·Summary:可能需要對幾頁(你的報表可能有幾個頁組成)的統(tǒng)計值。比如50個銷售記錄共占用了3頁,那么放置這些統(tǒng)計記錄的統(tǒng)計值最好的地方就是summary。
???? ·groupHeader:每個表的內(nèi)容可能需要根據(jù)某個屬性進(jìn)行劃分顯示內(nèi)容和計算內(nèi)容,比如希望以月份為單位每組分開顯示銷售記錄,那么就可以定義一個組(組的定義參考后文),groupHeader就是放置組說明或是組標(biāo)志最好的地方。
???? ·Groupfooter:放置組的統(tǒng)計或是說明
8、建立一個新的報表·····
? a、新建一個空報表的基本配置
??? 單擊工具欄的第一個工具“New Report”,新建一個報表,輸入報表名稱和定義報表的一些參數(shù),比如名稱輸入(例子是做一個項目的Bug量統(tǒng)計報表)單擊【More….】選擇標(biāo)簽,填寫或是選擇XML編碼,這是關(guān)系到你的XML支持的字符集的選擇,請根據(jù)需要選擇,比如需要你的XML文件支持中文,那么可以輸入或是GBK,之后點(diǎn)擊【OK】按鈕,進(jìn)入報表的設(shè)計界面。
? b、定義報表可能需要的字體類型及其屬性
??? 一個報表的內(nèi)容五花八門,有表頭、欄位名、數(shù)據(jù)、其他變量信息等等,如果這些信息都是一致的字體和屬性(比如顏色),那么整個報表就死氣沉沉,顯得很粗糙了。我們可以在為報表添加每個元素時定義元素的屬性,但是那是一個多么費(fèi)時的工作,如果能預(yù)先定義一些屬性的組合,之后在創(chuàng)建每個元素時只需選擇這些組合的其中一個即可,省事又快速。
??? 單擊【預(yù)覽】-【報表字體】開啟自定義組合對話框。單擊【New】進(jìn)入定義詳細(xì)對話框,如圖:
??? 按照圖中的順序填寫信息和步驟,依次定義“表頭”、“組”、“列”、“列內(nèi)容”、“統(tǒng)計計算”、“其他”等6中字體組合。
??? 注意PDF內(nèi)嵌字體的選擇,如果你需要報表時以PDF文件格式提供,那么對此需要作出選擇。
?
9、向表添加對象····
? a、添加靜態(tài)對象···
?? 可以通過工具欄的工具添加靜態(tài)對象,比如文本,點(diǎn)擊【T】,之后在報表的空白處單擊,如此即可把靜態(tài)對象添加到報表,然后拖動對象的邊框,使它的大小合適,雙擊對象彈出對象的屬性配置對話框,切換到【Font】Label,在“Report font”的ComBox選擇“表頭”字體,(表頭字體是前文提供的自定義屬性組合),再切換到【Static Text】Label,修改表頭的名字,比如“Bug統(tǒng)計報表”或是“銷售記錄統(tǒng)計表”等等與業(yè)務(wù)有關(guān)的內(nèi)容。添加圖片,請點(diǎn)擊【Image Tool】,之后的操作與Text類似。其他靜態(tài)對象操作步驟類似。
? b、使用連接···
??? 還記得前文提供的(3.2節(jié))配置MySql數(shù)據(jù)庫連接嗎?這里我們將要使用前文配置的連接了。選擇菜單【建立】-【使用動態(tài)連接】開啟可選的動態(tài)連接,?選擇任何一個你需要的連接最后【OK】,保存報表,這樣你的報表就使用了這個連接了。
?? *【特別提示】此連接必須與以后應(yīng)用程序使用的連接一致。
? c、創(chuàng)建SQL查詢語句····
??? SQL語句是對任何RDBMS起作用的語言,外部用戶需要使用這些語言管理維護(hù)數(shù)據(jù)庫中的數(shù)據(jù),同樣的,iReport也是需要這么做,我們需要提供查詢數(shù)據(jù)庫的語言-SQL語句,這樣,iReport即可通過此SQL語句獲取數(shù)據(jù),之后組織到報表中并顯示出來,以滿足用戶的需要為目的。
??? 通過菜單【資料來源】-【報表查詢】開啟SQL輸入對話框,并在【Report SQL Query】 Label中輸入SQL語句如圖:圖中的“Automatically Retrieve Fields”checkbox和“ReadFields”Button是確認(rèn)自動獲取還是手動獲取數(shù)據(jù)庫表的可用Fields。單擊【OK】,保存報表。
??
??
d、創(chuàng)建字段動態(tài)對象·····
??? 報表的動態(tài)對象有變量、參數(shù)、字段,前文提及了他們的概念,這里將要一一講解如何使用。字段也就是數(shù)據(jù)庫中的字段,通過菜單【預(yù)覽】-【報表字段】開啟字段的列表(工具條上可以找到相應(yīng)的工具),可以拖放任意字段到報表的任何位置,比如拖動一部分Bug的內(nèi)容字段到detial段(內(nèi)容無關(guān)緊要,只要知道原理)。
? e、創(chuàng)建組···
???? 組是一個很重要的概念,一個報表可以多個組,每個組以一個關(guān)鍵字為標(biāo)記,比如希望Bug統(tǒng)計是根據(jù)項目(或是產(chǎn)品)進(jìn)行統(tǒng)計的。那么可以設(shè)立一個項目標(biāo)記的組。如圖:
?
???
???
組的參數(shù)設(shè)定可以看界面即可理解部分,其中最主要的是“Group expression”,這是必須輸入格式正確的并且存在的字段名稱,本文的“proname”是【字段】中的一個元素。依此類推,建立其他的組對象。
??? 每建立一個組,在報表的界面上都會出現(xiàn)該組對應(yīng)的段,如圖:他們是首尾對應(yīng)出現(xiàn)的。(Header和Footer)
??? 
?
? f、添加參數(shù)和使用參數(shù)····
??? 我們重申參數(shù)作用,一般是需要外界提供參數(shù)給報表的入口,比如SQL語句的where條件的表達(dá)式。通過【預(yù)覽】-【報表參數(shù)】開啟報表參數(shù)列表對話框(工具條上可以找到相應(yīng)的工具)。如圖:輸入名稱及其他參數(shù)。【ok】,保存報表。
???
??? 那么如何使用呢?打開SQL語句對話框,參考“5.3創(chuàng)建SQL查詢語句”,這時候的SQL語句應(yīng)該是:SELECT * FROM bugs? where proname=$P{ProjectName} order by proname,modulename
??? 注意其中的紅體字部分,就是把剛才定義的變量運(yùn)用到SQL語句了。這樣當(dāng)應(yīng)用提供參數(shù)時,只要指定提供給這個參數(shù),那么報表解釋引擎即可替換這些變量然后再執(zhí)行SQL語句,在第二部分提到編程時,會提供參數(shù)設(shè)定代碼。
?
? g、添加變量和使用變量····
???? 變量的定義類似參數(shù),通過【預(yù)覽】-【報表變量】開啟報表變量列表對話框(工具條上可以找到相應(yīng)的工具),如圖,圖中定義的變量的作用是:定義一個Bug的計數(shù)器,數(shù)據(jù)類型是java.lang.Integer,使用Count函數(shù)進(jìn)行統(tǒng)計字段tester,作用范圍是模塊組,也就是統(tǒng)計模塊的Bug量。其中的tester可以改成其他非組對象,比如proname是組對象,就不要用作這里的統(tǒng)計參數(shù)。以上提供的是自定義變量,其實iReport系統(tǒng)還有提供一些內(nèi)嵌(Buildin)的變量,比如頁碼,行記錄數(shù)等,視需要而使用。
?? 
?
? 10、最后的報表····
??? a、完成后的報表···
???? 
??? b、預(yù)覽報表···
???? 點(diǎn)擊動態(tài)運(yùn)行報表,出現(xiàn)如圖內(nèi)容:
?????
? 11、在jsp中調(diào)用報表·····
??? 解決這個問題也用了我差不多2天時間:(,但總算是搞定了·····
??? 下面分別介紹以pdf格式和以html格式顯示報表····
?? a、pdf格式ireport_pdf.jsp····
?? <%@ page import="net.sf.jasperreports.engine.*" %>
??? <%@ page import="java.util.*" %>
??? <%@ page import="java.io.*" %>
??? <%@ page import="java.sql.*" %>
??? <%
????? //報表編譯之后生成的.jasper 文件的存放位置
????? File reportFile = new File(application.getRealPath("ireport/xueji.jasper"));
????? //這個是用來聯(lián)接我的mysql 的JDBC URL
????? String url="jdbc:mysql://localhost:3306/xueji?useUnicode=true&characterEncoding=gb2312";
????? Class.forName("org.gjt.mm.mysql.Driver").newInstance();
????? //傳遞報表中用到的參數(shù)值
????? Map parameters = new HashMap();
???? //"Name"是報表中定義過的一個參數(shù)名稱,其類型為String 型
???? parameters.put("banji", new String(" c1"));
???? System.out.println("---------conn-------------");
???? //連接到數(shù)據(jù)庫
???? Connection conn = DriverManager.getConnection(url,"root","root");
???? System.out.println("---------Jasper begin-------------");
???? //在控制臺顯示一下報表文件的物理路徑
???? System.out.println(reportFile.getPath());
???? byte[] bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,conn);
???? System.out.println("---------Jasper end-------------");
???? response.setContentType("application/pdf");
???? response.setContentLength(bytes.length);
???? ServletOutputStream ouputStream = response.getOutputStream();
???? ouputStream.write(bytes, 0, bytes.length);
???? ouputStream.flush();
???? ouputStream.close();
?? %>
???b、html格式ireport_html.jsp····
?
??
??
??
??
??
??
?? <%
??? File reportFile = new File(application.getRealPath("/ireport/xueji.jasper"));
??? JasperReport jasperReport = (JasperReport)JRLoader.loadObject(reportFile.getPath());
??? Map parameters = new HashMap();
??? parameters.put("baiji", "c1");
?? //parameters.put("BaseDir", reportFile.getParentFile());???
?? //JRBeanArrayDataSource jrDataSource = new JRBeanArrayDataSource(objects);//objects為要打印的實體數(shù)組;
??? Class.forName("org.gjt.mm.mysql.Driver");
??? Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/xueji","root","root");
??? JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
?????????
??? JRHtmlExporter exporter = new JRHtmlExporter();
??? StringBuffer sbuffer = new StringBuffer();
??? Map imagesMap = new HashMap();
??? session.setAttribute("IMAGES_MAP", imagesMap);
???
??? exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
??? exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
??? //exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
??? //exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/ireport/ireport_html.Image?image=");
??? //exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "
");
??? exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
??? exporter.exportReport();
??? //out.flush();
??? conn.close();
?? % >
注意:以html格式調(diào)用主要要注意//exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
????????????????????????????? //exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "images目錄的路徑?image=");
????????????????????????????? 在生成html預(yù)覽的時候會生成一個px文件,而這個images_uri的路徑就是那個px的路徑,建議不用,就用下面
????????????????????????????? 的語句就可以了····
????????????????????????????? exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);???
而這個語句則是處理分頁用的····??????????????????????????????
//exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "
");
需要注意的地方····
必須在tomcat5以上版本中運(yùn)行····
在運(yùn)行的時候還要將jasperreports/lib下的包全部拷到tomcat下你所放文件目錄下的win-inf/lib下···
特別要注意的是看看ireport/lib下的包與jasperreports/lib的包是否兼容···
之前我的一直有問題就是因為我的發(fā)布環(huán)境是jasperreports-0.6.7.jar而運(yùn)行環(huán)境是jasperreports-0.6.8.jar···
這樣也會出現(xiàn)錯誤的····
參考資料····
感謝···
http://www-128.ibm.com/developerworks/cn/java/j-ireport/?ca=dwcn-newsletter-java
http://blog.csdn.net/jemlee2002/archive/2004/10/05/125107.aspx