登入  |  English
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。
技術專欄 JasperReport

JasperReport

Java Opensources for Web Development Part I:嘗試使用來自 Opensource 的小工具(1)
Lession 5 : JasperReport

JasperSoft.com 原是一個 Report Engine 的供應商,但是將 ReportEngine 開放成為一個 SourceForge 上的 Opensource 之後,廣受 Java Community 的人們喜愛,非常便利地使用 iReport 就可以完成 Report Designing 的工作。而現在,JasperSoft 將這些 Opensource 聚合起來放到 JasperForge, 將挑戰 Java Opensource solution for BI 的動作,也將 JasperServer 逐步開放出來,一則借用 Opensource 的力量協助開發與除錯,另一方面更可以利用廣大的族群,來進行挑戰 CrystalReport 強大的商業市場競爭。

◎ Overview JasperReport 本身是一個 ReportEngine,基本來說,我們可以製作 Report Template ( *.jrxml ),使用一些開發 jrxml 的工具如下

* iReport https://jasperforge.org/sf/projects/ireport
* jasperassistant https://www.jasperassistant.com

當我們完成之後,可以部署相關的 jrxml 到 server 端,讓 jasperReport compile 之成為 *.jasper 檔案,接著 ReportEngine 就會根據該設定去讀取相關的 DataSources 與參數,進行頁面的呈現或檔案的輸出。

◎ Strutures 我們需要有一些基本的 jars 放在 /WEB-INF/lib 之中。

* commons-beanutils.jar
* commons-collections.jar
* commons-digester.jar
* commons-javaflow.jar
* commons-logging.jar
* itext.jar
* jasperreports.jar
* jcommon.jar
* jdt-compiler.jar
* jfreechart.jar
* jxl.jar (https://jexcelapi.sourceforge.net/)
* png-encoder.jar
* poi.jar

commons-* 是屬於 apache jakarta commons 的共享工具專案元件
itext 是屬於輸出為 PDF 的專案元件
jcommon & jfreechart 是 jfree.org 輸出 chart 的專案元件
png-encoder 是輸出 PNG 圖檔的專案元件
poi & jxl 是輸出 Excel or Office (bugs) 的專案元件
jasperreports and jdt-compiler 則是 製作 Report 的相關元件

◎ SOP (Standard of Process)

* 建立 jrxml by iReport
* 將 jrxml 放到 /WEB-INF/jrxml 之下
* 程式使用
 String jrxmlPath =
 this.getServletContext().getRealPath("/")+ "WEB-INF/jrxml/myfirst.jrxml";
 取得實際的目錄 ex : d:\cvsbox\reporttest\WEB-INF\jrxml\myfirst.jrxml
* 利用 compileManger 對於匯入的 jrxml 產生一個 jasperReport instance : JasperReport jasperReport = *

JasperCompileManager.compileReport(jrxmlFilePath);
* 將相關的變數放到 HashMap 之中
 HashMap params = new HashMap();
 params.put(“key”,”value”);
* 利用 fillManager 將參數Map 與 Datasource 產生出相關文件
* 利用 exportManger 進行各種輸出作業

 

package com.softleader.utils;
import …;
public class JasperReportServlet extends HttpServlet {

private final static String jrxml = "jrxml";
private final static String jrstyle = "jrstyle";

public static Logger log =Logger.getLogger(JasperReportServlet.class.getName());

protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

// 取得 Report Template Definition
// /WEB-INF/jrxml/someDef.jrxml
String JRXML = StringUtils.trimToEmpty(request.getParameter(jrxml));
if ( JRXML.equals("")) {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

out.println("1. check jrxml put in /WEB-INF/jrxml/someDef.jrxml
");
out.println("2. use /JRServlet?jrxml=someDef&jrstyle=pdf&jrsysid=231"); out.close();
return;
}

// 取得 Request 之中所有參數
Enumeration paramNames = request.getParameterNames();
Map params =new HashMap();
while ( paramNames.hasMoreElements() ) {
String paramName = paramNames.nextElement();
params.put( paramName,
StringUtils.trimToEmpty(request.getParameter(paramName) );
}
log.debug(params);


// 取得 JRXML file Path
String jrXMLPath
= this.getServletContext().getRealPath("/")+ "WEB-INF\\jrxml\\"+JRXML+".jrxml";
log.debug(jrXMLPath);
try {
JasperReport jasperReport =
JasperCompileManager.compileReport(jrXMLPath);
JasperPrint jasperPrint=
JasperFillManager.fillReport(jasperReport,new HashMap(), new JREmptyDataSource());

// 輸出的格式, 目前僅允許 PDF ( jrstyle=pdf ) 及 EXCEL ( jrstyle=xls )
String JRSTYLE =
StringUtils.trimToEmpty(request.getParameter(jrstyle)).toLowerCase();
if ( JRSTYLE.equals("xls")) {
exportExcelReport(response, params, jasperPrint);
} else {
exportPDFReport(response, params, jasperPrint);
}

} catch ( Exception ex ) {
log.error(ex);
}



}

private void exportPDFReport(HttpServletResponse response,
Map params,JasperPrint jasperPrint) throws Exception {

JRPdfExporter exporter = new JRPdfExporter();
ByteArrayOutputStream pdfOutStream = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, pdfOutStream);
//exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outputFilePath);
exporter.exportReport();
byte bytes[] = pdfOutStream.toByteArray();
pdfOutStream.close();
response.reset();

response.setContentType("application/pdf");
//response.setHeader("Content-Disposition","attachment");
OutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();

}

private void exportExcelReport(HttpServletResponse response,
Map params,JasperPrint jasperPrint) throws Exception {
JRXlsExporter exporter = new JRXlsExporter();
ByteArrayOutputStream xlsOutStream = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsOutStream);
//exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outputFilePath);
exporter.exportReport();
byte bytes[] = xlsOutStream.toByteArray();
xlsOutStream.close();
response.reset();

response.setContentType("application/vnd.ms-excel");
//response.setHeader("Content-Disposition","attachment");
OutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();

}


protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}

public String getServletInfo() {
return "JasperReportServlet";
}

}
只要在 web.xml 設定
   
JasperReportServlet
com.softleader.utils.JasperReportServlet


JasperReportServlet
/JRServlet
接著把利用 iReport 製作出來的 jrxml 放到 /WEB-INF/jrxml/ 之下,就可以透過 Browser 傳遞參數給 jrxml 創造出成功的報表了。



自由軟體鑄造場電子報 : 第 63 期 IOSESC 2006 頒獎典禮

分類: 技術專欄