ireport和jasperreport的簡單使用(2009-05-05 16:20:25)標簽:ireport jasperreport jsp 分類:釋疑集
1.下載ireport包和jasperreport包
去官方網站下載。
iReport-nb-3.5.0.zip
jasperreports-3.5.0-project.zip
2.使用ireport
可以直接使用ireport生成報表,jasperreport只是用來在web應用上使用報表。
1》.單獨使用ireport,而且不使用中文,則不需要加入任何包到ireport的lib目錄下。
2》.使用中文,則需要加入iText-2.1.5.jar,iTextAsian.jar兩個jar包到ireport的lib下,或者通過【工具】--》【選項】--》【classpath選項卡】加入依賴jar包。
注意:ireport3.5.0的版本,沒有什麼編譯,一保存就生成jrxml文件,點擊preview相應的方式就會生成相應的應用文件和jasper文件。
3》.具體的ireport的使用可以參考她的官網。http://ireport.cubebi.com/
3.在web上使用報表
1.導入依賴的包
com-jaspersoft-ireport.jar
commons-beanutils-1.8.0.jar
commons-collections-3.2.1.jar
commons-digester-2.0.jar
commons-logging.jar
iText-2.1.5.jar
iTextAsian.jar
jasperreports-3.1.4.jar
poi-3.2-FINAL-20081019.jar
當然還有數據庫的驅動包mysql-connector-java-5.0.3-bin.jar
2.使用ireport生成的jasper文件,將它放在webRoot下report下的jasper目錄裡。
3.編寫調用web文件。
這是主要的jsp文件,可以通過如http://127.0.0.1:8080/工程名/xxx.jsp?reportType=pdf的方式測試
<%@page contentType="text/html;charset=GB2312"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.io.File"%>
<%@page import="net.sf.jasperreports.engine.JasperRunManager"%>
<%@page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@page import="net.sf.jasperreports.engine.JasperFillManager"%>
<%@page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>
<%@page import="net.sf.jasperreports.engine.JRExporterParameter"%>
<%@page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>
<%@page import="java.io.ByteArrayOutputStream"%>
<%@page import="net.sf.jasperreports.engine.export.JRHtmlExporterParameter"%>
<%@page import="net.sf.jasperreports.engine.export.JRHtmlExporter"%>
<%@page import="java.sql.DriverManager"%>
<%
String rptpath = application.getRealPath("/report/jasper");//我們將要使用的報表模板保存路徑
// String reportname = request.getParameter("reportName");//獲取報表名稱
String reportname ="employee";//一個employee.jasper的模板
String driverName = "com.mysql.jdbc.Driver"; //加載JDBC驅動
String dbURL = "jdbc:mysql://localhost:3306/wanrue"; //連接服務器和數據庫test
String userName = "root"; //默認用戶名
String userPwd = "xwrwc"; //密碼
try {
Class.forName(driverName);
Connection con = DriverManager.getConnection(dbURL, userName, userPwd);//創建數據源
File rpt = new File(rptpath + "/" + reportname + ".jasper");//獲取報表模板
//將解析完的參數傳入報表模板中並生成報表
if(request.getParameter("reportType").equals("pdf")){
byte[] bytes = JasperRunManager.runReportToPdf(rpt.getPath(), null, con);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
con.close();
out.clear();
out = pageContext.pushBody();
//生成xls
}else if(request.getParameter("reportType").equals("xls")){
JRXlsExporter exporter = new JRXlsExporter();
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
JasperPrint jasperPrint = JasperFillManager.fillReport(rpt.getPath(), null, con);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
exporter.exportReport();
byte[] bytes = oStream.toByteArray();
response.setContentType("application/vnd.ms-excel");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
con.close();
out.clear();
out = pageContext.pushBody();
}else{
//生成html
JRHtmlExporter exporter = new JRHtmlExporter();
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
JasperPrint jasperPrint = JasperFillManager.fillReport(rpt.getPath(), null, con);
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
exporter.setParameter(JRHtmlExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRHtmlExporterParameter.CHARACTER_ENCODING, "utf-8");
exporter.setParameter(JRHtmlExporterParameter.OUTPUT_STREAM, oStream);
exporter.exportReport();
byte[] bytes = oStream.toByteArray();
response.setContentType("text/html");
response.setContentLength(bytes.length);
response.setCharacterEncoding("utf-8");
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
con.close();
out.clear();
out = pageContext.pushBody();
}
} catch (Exception ex) {
System.out.print("Jasper Output Error:" + ex.getMessage());
ex.printStackTrace();
}
%>
4.中文問題
2 設置中文支持
為了在報表中能夠顯示中文,加入以上四個包還不夠(因為以上四個包僅對報表生成及中文顯示提供了支持),必須設置報表上各顯示對象的相關屬性,各屬性設置說明如下:
Font name: 宋體 (中文字體)
PDF font name: STSong-Light
PDF Encoding: UniGB-UCS2-H(Chinese Siplified)
PDF Embeded: √
注意:此三項的設置必須確保iTextAsian.jar亞洲語言包已經包含在項目中,否則出現編譯錯誤.
”Fonts”菜單進行統一設置,並設成報表的默認字體。如下圖所示:?若讀者覺得對每一個對象設置比較麻煩,可通過iReport的”Format”
3可能出現的問題
經過以上的設置,報表中文的顯示應該沒什麼問題了,筆者在報表的開發過程中遇到幾個問題,現總結如下:
3.1 問題描述
在WinXp中運行iReport1.2.8,設計報表時將數據字段的字體設置成中文字體,調好格式後編譯並運行,並使用JRViewer進行預覽一切正常(中文顯示正常),但使用PDF、Excel預覽出現如下錯誤:
Could not load the following font :
pdfFontName : STSong-Light
pdfEncoding : UniGB-UCS2-H
isPdfEmbedded : true
產生原因:成成PDF的亞洲語言包沒有包含到項目中
解決辦法”Classpath”將iTextAsian.jar添加Classpath中或者直接將iTextAsian.jar復制到iReport安裝目錄下的lib中.若是Web項目則應該將iTextAsian.jar復制到此項目的WEB-INF\lib\中.?:將亞洲語言包iTextAsian.jar包含到項中,可能過iReport的”Options”
3.2 問題描述
在WinXp中運行iReport1.2.8,設計報表時將數據字段的字體設置成中文字體,調好格式後編譯並運行,並使用JRViewer進行預覽一切正常(中文顯示正常),使用PDF、Excel預覽時無任何錯誤,但中文無法顯示(只顯示空白).
產生原因:報表顯示對象的PDF字體屬性設置不正確
解決辦法: 報表對象有關字體屬性的設置如下:
Font name: 宋體 (中文字體)
PDF font name: STSong-Light
PDF Encoding: UniGB-UCS2-H(Chinese Siplified)
PDF Embeded: √
3.3問題描述
生成PDF、Excel文件時,中文顯示一切正常,但生成Html文件時顯示亂碼
產生原因:主要是網頁編碼問題
解決方法
在JSP頁中生成Html時,設置 <%@ page contentType="text/html;charset=GB2312" %>
在Servlet中生成Html時,response.setContentType("text/html;charset=GB2312");
若用戶對項目進行了統一編碼設定及過濾,則需要另作考慮,但主要還是集中在編碼問題上.例如:筆者最近做的項目是其於Struts的,對編碼進行了統一和過濾處理,生成Html頁面時無需指編碼就可正確生成Html頁面,並不會出亂碼,若設置成charset=GB2312反而出現了亂碼.總之,對編碼的統一與處理還是比較嘛煩的事.
另外, 我們通過查看iReport生成的jrxml(<?xml version="1.0" encoding="UTF-8" ?>)文件可以發現, iReport保存的漢字都是UTF-8編碼。了解它的編碼可以有助於我們統一編碼方式。