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