這幾天在弄ireport+jasperreports的報表,終于弄得差不多了····
下面就把我這幾天做的一些東西記錄下來(lái)····
其中提出一些特別要注意的地方(我就是在那幾個(gè)地方浪費了些時(shí)間)···
1、先介紹一下ireport及asperreports吧····
Jasperreport是一個(gè)報表制作程序,用戶(hù)需要按照它制定的規則編寫(xiě)一個(gè)XML文件,
然后得到用戶(hù)需要輸出的格式文件。它支持輸出的文件格式包括PDF,HTML,XML,XLS,CVS等等。
而iReport就是一個(gè)制作Jasperreport的XML文件的可視化開(kāi)發(fā)工具。
2、下載ireport和jasperreports···
jasperreport下載地址:(我下的是jasperreports-0.6.8)http://jasperreports.sourceforge.net
ireport下載地址:(我下的是iReport0.5.0)http://ireport.sourceforge.net
3、下載了ireport將它解壓縮以后運行iReport.bat文件,過(guò)大約30秒如果能出現ireport的主窗體
則表明你的系統已經(jīng)可以運行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來(lái)運行的,所以還需要下載一個(gè)ant···
如果你沒(méi)有安裝ant的話(huà)也可以找到noAnt文件夾下的startup.bat文件即可運行···
4、數據庫···
我是用的mysql數據庫,之前配置數據庫的JDBC驅動(dòng)器一直不成功原因是我下的mysql的jdbc驅動(dòng)太老了,
和ireport的不兼容····
建議到http://dev.mysql.com/downloads/下載最新版本···
5、配置數據庫連接····
這個(gè)是報表與數據庫的接口,通過(guò)<資料來(lái)源>--<連接/資料來(lái)源>開(kāi)啟配置對話(huà)框,ireport會(huì )記錄以前使用的
所有連接,除非你手工刪除這些連接,否則連接將一直存在···
配置新連接界面如下:

6、中文問(wèn)題····
解決pdf中文問(wèn)題需要下載itextasian.jar和itext-1.3.jar,將其下載后放到ireport/lib下即可··
要在這里提一下的是之前我也下載了這兩個(gè)東東放到指定的位置了可還是亂碼,后來(lái)還是解決了··
解決方法:
在iReport中新建一個(gè)TextField的時(shí)候會(huì )自動(dòng)把pdf字體設為CP1252,這個(gè)是需要修改的,
否則pdf輸出會(huì )報錯說(shuō)找不到字體,我就被這個(gè)捆饒了很久,修改如圖:

7、理解幾個(gè)重要的概念····
a、iReport的輸出格式····
iReport的預覽輸出格式可以支持以下幾種:
PDF、HTML、CSV、JAVA2D、Excel、純文字、JRViewer,其中最常用的是PDF、JRViewer。
本文以JRViewer為例子。JRViewer是直接以C/S方式作為報表的輸出格式,在JFrame框架下輸出。Jasperreport提供默認的JRViewer輸出類(lèi)。
b、報表的動(dòng)態(tài)對象變量、參數、字段····
在使用iReport的過(guò)程中會(huì )碰到很多與變量(Variables)、參數(Parameters)、字段(Fields)這些有關(guān)的內容,我們要介紹這些對象的使用和意義:
·字段(Fields):是數據庫抽取出來(lái)的,希望在報表中出現的數據庫內容。
比如一個(gè)ID的所有值。$F{ filedsName }
·參數(Parameters):這是你的應用需要提供給報表的入口,
比如你希望在報表被解釋的時(shí)候提供Where語(yǔ)句的條件值,
那么就可以使用參數(Parameters)。$P{ parameterName }
·變量(Variables):這是報表中一些邏輯運算的表現,比如統計值。$V{ variablesName }
每種對象的定義格式如每個(gè)對象的后面說(shuō)明,比如定義一個(gè)變量(Variables),
那么表達式就寫(xiě)成$V{ variablesName },報表中出現的就是這個(gè)變量的名稱(chēng)。
c、編譯、靜態(tài)運行、動(dòng)態(tài)運行···
Jasperreport運行時(shí)需要的就是一個(gè)jasper后綴的文件,編譯過(guò)程其實(shí)就是把jrxml后綴的文件生成jasper后綴的文件。(可以參考Jasperreport的運行原理) 靜態(tài)運行和動(dòng)態(tài)運行是相對的,后者帶數據源運行,比如帶數據庫運行。前者就是靜態(tài)文本運行,和數據源無(wú)關(guān),如果報表中出現和數據源有關(guān)的對象,則以null顯示。
d、報表的結構···
一個(gè)報表的結構大致是幾個(gè)部分:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。
·Title:每個(gè)報表一般會(huì )有一個(gè)名字,比如×××銷(xiāo)售報表,title就是擱置這個(gè)名稱(chēng)的最好地方了,當然你也可以根據需要擱置在合適的地方。
·pageHeader:報表的一些公共要素,比如頁(yè)碼、創(chuàng )建時(shí)間、創(chuàng )建人等信息放置在這里是比較好的選擇。
·columnHeader:無(wú)可非議的這里是放置列的名稱(chēng),記住不是列數據。
·Detial:放置需要循環(huán)的數據,比如銷(xiāo)售記錄數據。
·columnFooter:放置列級別的統計計算值或是列的說(shuō)明。
·pageFooter:放置頁(yè)級別的統計值或是頁(yè)的說(shuō)明。
·Summary:可能需要對幾頁(yè)(你的報表可能有幾個(gè)頁(yè)組成)的統計值。比如50個(gè)銷(xiāo)售記錄共占用了3頁(yè),那么放置這些統計記錄的統計值最好的地方就是summary。
·groupHeader:每個(gè)表的內容可能需要根據某個(gè)屬性進(jìn)行劃分顯示內容和計算內容,比如希望以月份為單位每組分開(kāi)顯示銷(xiāo)售記錄,那么就可以定義一個(gè)組(組的定義參考后文),groupHeader就是放置組說(shuō)明或是組標志最好的地方。
·Groupfooter:放置組的統計或是說(shuō)明
8、建立一個(gè)新的報表·····
a、新建一個(gè)空報表的基本配置
單擊工具欄的第一個(gè)工具“New Report”,新建一個(gè)報表,輸入報表名稱(chēng)和定義報表的一些參數,比如名稱(chēng)輸入(例子是做一個(gè)項目的Bug量統計報表)單擊【More….】選擇標簽,填寫(xiě)或是選擇XML編碼,這是關(guān)系到你的XML支持的字符集的選擇,請根據需要選擇,比如需要你的XML文件支持中文,那么可以輸入或是GBK,之后點(diǎn)擊【OK】按鈕,進(jìn)入報表的設計界面。
b、定義報表可能需要的字體類(lèi)型及其屬性
一個(gè)報表的內容五花八門(mén),有表頭、欄位名、數據、其他變量信息等等,如果這些信息都是一致的字體和屬性(比如顏色),那么整個(gè)報表就死氣沉沉,顯得很粗糙了。我們可以在為報表添加每個(gè)元素時(shí)定義元素的屬性,但是那是一個(gè)多么費時(shí)的工作,如果能預先定義一些屬性的組合,之后在創(chuàng )建每個(gè)元素時(shí)只需選擇這些組合的其中一個(gè)即可,省事又快速。
單擊【預覽】-【報表字體】開(kāi)啟自定義組合對話(huà)框。單擊【New】進(jìn)入定義詳細對話(huà)框,如圖:
按照圖中的順序填寫(xiě)信息和步驟,依次定義“表頭”、“組”、“列”、“列內容”、“統計計算”、“其他”等6中字體組合。
注意PDF內嵌字體的選擇,如果你需要報表時(shí)以PDF文件格式提供,那么對此需要作出選擇。


d、創(chuàng )建字段動(dòng)態(tài)對象·····
報表的動(dòng)態(tài)對象有變量、參數、字段,前文提及了他們的概念,這里將要一一講解如何使用。字段也就是數據庫中的字段,通過(guò)菜單【預覽】-【報表字段】開(kāi)啟字段的列表(工具條上可以找到相應的工具),可以拖放任意字段到報表的任何位置,比如拖動(dòng)一部分Bug的內容字段到detial段(內容無(wú)關(guān)緊要,只要知道原理)。
e、創(chuàng )建組···
組是一個(gè)很重要的概念,一個(gè)報表可以多個(gè)組,每個(gè)組以一個(gè)關(guān)鍵字為標記,比如希望Bug統計是根據項目(或是產(chǎn)品)進(jìn)行統計的。那么可以設立一個(gè)項目標記的組。如圖:

組的參數設定可以看界面即可理解部分,其中最主要的是“Group expression”,這是必須輸入格式正確的并且存在的字段名稱(chēng),本文的“proname”是【字段】中的一個(gè)元素。依此類(lèi)推,建立其他的組對象。
每建立一個(gè)組,在報表的界面上都會(huì )出現該組對應的段,如圖:他們是首尾對應出現的。(Header和Footer)





11、在jsp中調用報表·····
解決這個(gè)問(wèn)題也用了我差不多2天時(shí)間:(,但總算是搞定了·····
下面分別介紹以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"));
//這個(gè)是用來(lái)聯(lián)接我的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"是報表中定義過(guò)的一個(gè)參數名稱(chēng),其類(lèi)型為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為要打印的實(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格式調用主要要注意//exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
//exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "images目錄的路徑?image=");
在生成html預覽的時(shí)候會(huì )生成一個(gè)px文件,而這個(gè)images_uri的路徑就是那個(gè)px的路徑,建議不用,就用下面
的語(yǔ)句就可以了····
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
而這個(gè)語(yǔ)句則是處理分頁(yè)用的····
//exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "
");
需要注意的地方····
必須在tomcat5以上版本中運行····
在運行的時(shí)候還要將jasperreports/lib下的包全部拷到tomcat下你所放文件目錄下的win-inf/lib下···
特別要注意的是看看ireport/lib下的包與jasperreports/lib的包是否兼容···
之前我的一直有問(wèn)題就是因為我的發(fā)布環(huán)境是jasperreports-0.6.7.jar而運行環(huán)境是jasperreports-0.6.8.jar···
這樣也會(huì )出現錯誤的····
參考資料····
感謝···
聯(lián)系客服