EMP框架下使用ireport生成PDF报表
使用宇信EMP的人现在貌似挺小众的,不过不影响,我想大多数情况下,不管什么框架下都是可以通用的。
本人开发环境:JDK1.4+weblogic8.0
1.需要的jar包:jasperreports-1.1.1.jar、itext-1.3.1.jar、itextasian.jar、jdt-compiler-3.1.1.jar
2.必不可少的工具是报表神器ireport (http://www.onlinedown.net/soft/176160.htm)。关于如何利用ireport生成jrxml,我这不多说,教程地址 http://www.doc88.com/p-317622550528.html 在这里 我们只需要得到一个简单的***.jrxml文件就行。
3.下载页面:
<html> <head> </head> <body> <a href="creatPdfFile.do">生成PDF报表</a> </body> </html>
4.获取数据action 下面把最后调用生成方法的JSP页面贴出来,获取数据的过程省略。
<%@ page contentType="text/html;charset=GBK" %><%@ page import="java.util.*" %><%@page import="com.bos.cash.action.account.Czg111CreatPDF"%><%@page import="com.ecc.emp.core.*"%><%@page import="com.ecc.emp.data.*"%><%@page import="com.bos.cash.init.SystemHelper"%> <% Context context = (Context) request.getAttribute("context"); Map p = new HashMap(); List list = new ArrayList(); p.put("PRINT_DATE",SystemHelper.getServerTime("yyyy-MM-dd HH:mm:ss")); p.put("LOGO",Czg111CreatPDF.getFilePath("bankofshanghai-logo.jpg")); p.put("SEAL",Czg111CreatPDF.getFilePath("bankofshanghai-receiptseal.gif")); IndexedCollection indexedCollection = (IndexedCollection) context.getDataElement("ECInfoSession"); String checkListStr = (String)context.getDataValue("PrintCode"); String[] checkList = checkListStr.split("@"); for(int i = 0;i < checkList.length-1;i++){ for(int j = 0;j<indexedCollection.size();j++){ KeyedCollection indexedCollectionKC = (KeyedCollection) indexedCollection.get(j); String no = (String)indexedCollectionKC.getDataValue("ECBillCode"); if(no.equals(checkList[i+1])){ list.add(no); } } }
//上面的代码全部是对数据的操作 无需理睬 最终其作用的是下面这句方法的调用。
//makePdfReport第一个参数为传过去需要生成报表的jasper文件名,第二个参数为MAP集合,在ireport中为单个字段,
//第三个参数indexedCollection 为EMP框架内的List集合类型,在后面的操作中需要将他解析。第四个参数List,过滤第三个参数的集合参照,无需理会。
//第四个参数pageContext,jsp内置对象,第四个参数,
Czg111CreatPDF.makePdfReport("Receipt",p,indexedCollection,pageContext,list); %>
5.生成PDF文件的JAVA类 大体流程是 获取jrxml文件--编译成jasper文件--生成PDF报表
Czg111CreatPDF.java
package com.bos.cash.action.account; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; import javax.servlet.jsp.PageContext; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperRunManager; import net.sf.jasperreports.engine.util.JRProperties; import com.bos.cash.action.zxxt.AccAcountReportFile; /** * ireport报表生成类 * @author 夏星 * */ public class Czg111CreatPDF implements Serializable { private static final long serialVersionUID = 1L; /** * 生成PDF * @param fileName * @param para * @param resultset * @param page * @return * @throws JRException */ public static byte[] makePdfReport(String fileName, Map para, Collection resultset, PageContext page,List list) throws JRException { if (page == null) return null; ServletResponse response = page.getResponse(); String jasperf = getAddress01(fileName); response.reset(); if (jasperf == null) { return null; } File reportF = new File(jasperf); if (reportF == null) { return null; } JRDataSource jrds = getJRData(resultset,list); byte[] bytes = null; try { bytes = JasperRunManager.runReportToPdf(reportF.getPath(), para, jrds); } catch (JRException e1) { e1.printStackTrace(); } String contentType = "application/pdf"; response.setContentType(contentType); response.setContentLength(bytes.length); try { ServletOutputStream ouputStream = response.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close(); } catch (IOException e) { e.printStackTrace(); } return bytes; } /** * 解析数据 * @param resultset * @return */ private static JRDataSource getJRData(Collection resultset,List list) { Czg111JRData data1 = new Czg111JRData(); data1.setBeans(resultset,list); return data1; } /** * 获取jasper路径 * @param fileName 文件名 * @return locleFilePath jasper绝对路径 */ public static String getAddress01 (String fileName){ String bash=AccAcountReportFile.class.getResource("").getFile(); String bash2[] = bash.split("WEB-INF"); String locleFilePath = bash2[0]+"WEB-INF/jasper/"+fileName+".jrxml"; // 将jrxml文件编译成jasper文件 生产中直接使用编译后的jasper文件 ps:此项目中commons-digester.jar包版本过低 // 编译jrxml需要commons-digester-1.7.jar包 String jasperf = ""; JRProperties.setProperty("net.sf.jasperreports.compiler.classpath", bash2[0]+"WEB-INF/lib/jasperreports-1.1.1.jar"); JRProperties.setProperty("net.sf.jasperreports.compiler.temp.dir", bash2[0]+"WEB-INF/"); try { jasperf = JasperCompileManager.compileReportToFile(locleFilePath); } catch (JRException e) { e.printStackTrace(); } return jasperf; } /** * 获取文件绝对路径 * @param fileName 文件名(加后缀) * @return */ public static String getFilePath(String fileName){ String bash=AccAcountReportFile.class.getResource("").getFile(); String bash2[] = bash.split("WEB-INF"); String locleFilePath = bash2[0]+"images/"+fileName; return locleFilePath; } /** * 下载PDF * @param fileName * @param para * @param resultset * @param page * @return * @throws JRException */ public static String[] downloadPdf(String fileName, Map para, Collection resultset, PageContext page,List list) throws JRException { JasperPrint jasperPrint = null; String jasperf = getAddress01(fileName); File reportF = new File(jasperf); JRDataSource jrds = getJRData(resultset,list); try { jasperPrint = JasperFillManager.fillReport(reportF.getPath(), para, jrds); } catch (JRException e1) { e1.printStackTrace(); } String localPath = AccAcountReportFile.class.getResource("").getFile(); String localPathArray[] = localPath.split("WEB-INF"); String locleFilePath = localPathArray[0]+"WEB-INF/jasper"; String fileNames = fileName+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".pdf"; File fi = new File(locleFilePath+"/pdf"); if(!fi.exists()){ fi.mkdir(); } //生成方法1 // JRPdfExporter exporter = new JRPdfExporter(); // exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint); // exporter.setParameter(JRPdfExporterParameter.CHARACTER_ENCODING,"UTF-8"); // exporter.setParameter(JRPdfExporterParameter.OUTPUT_FILE_NAME, path+"/pdf/"+fileNames); // exporter.exportReport(); //生成方法2 try { JasperExportManager.exportReportToPdfFile(jasperPrint,locleFilePath+"/pdf/"+fileNames); } catch (Exception e) { e.printStackTrace(); } return new String[]{fileNames,locleFilePath+"/pdf/"+fileNames}; } }
解析Collection类型
Czg111JRData.java
package com.bos.cash.action.account; import java.util.Collection; import java.util.Iterator; import java.util.List; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; import com.ecc.emp.core.EMPConstance; import com.ecc.emp.data.KeyedCollection; import com.ecc.emp.log.EMPLog; /** * 解析数据类 * * @author 夏星 * */ public class Czg111JRData implements JRDataSource { private Collection beans = null; private Object bean = null; private Iterator it = null; private List list = null; /** * * @param theBeans 完整集合 * @param list 需要下载的回单号集合 */ public void setBeans(Collection theBeans, List list) { this.list = list; this.beans = theBeans; this.it = this.beans.iterator(); } public boolean next() throws JRException { if (this.it.hasNext()) { try { this.bean = this.it.next(); if(list!=null){ String receiptNo = (String) ((KeyedCollection) bean).getDataValue("ECBillCode"); if(!list.contains(receiptNo)) return next(); } } catch (Throwable e) { EMPLog.log("jasper", EMPLog.INFO, 0, e.toString()); throw new JRException(e); } return true; } return false; } public Object getFieldValue(JRField field) throws JRException { KeyedCollection kc = (KeyedCollection) this.bean; try { return kc.getDataValue(field.getName()); } catch (Exception e) { //EMPLog.log("jasper", EMPLog.INFO, 0, e.toString()); return ""; } } }
6.大功告成!
PS:在Czg111CreatPDF.java中我分别写了一个预览PDF和直接下载PDF的方法,如果需要实现在线下载PDF功能的话,需要另外写个jsp页面
czg111_PdfFileDownload.jsp<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@page language="java" contentType="text/html; charset=UTF-8"%> <%@page import="com.ecc.emp.core.Context" %> <%@page import="java.io.File" %> <%@page import="com.bos.cash.action.account.Czg111CreatPDF"%> <%@page import="java.util.Map"%> <%@page import="java.util.HashMap"%> <%@page import="com.ecc.emp.data.IndexedCollection"%> <%@page import="java.io.FileInputStream"%> <%@page import="com.bos.cash.init.SystemHelper"%> <%@page import="com.ecc.emp.data.KeyedCollection"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@page import="com.ecc.emp.log.EMPLog"%> <%@page import="com.ecc.emp.core.EMPConstance"%> <%@ include file="http://www.cnblogs.com/head.jsp"%> <% Context context = (Context) request.getAttribute("context"); Map p = new HashMap(); File file = null; List list = new ArrayList(); p.put("PRINT_DATE",SystemHelper.getServerTime("yyyy-MM-dd HH:mm:ss")); p.put("LOGO",Czg111CreatPDF.getFilePath("bankofshanghai-logo.jpg")); p.put("SEAL",Czg111CreatPDF.getFilePath("bankofshanghai-receiptseal.gif")); IndexedCollection indexedCollection = (IndexedCollection) context.getDataElement("ECInfoSession"); String checkListStr = (String)context.getDataValue("PrintCode"); String[] checkList = checkListStr.split("@"); for(int i = 0;i < checkList.length-1;i++){ for(int j = 0;j<indexedCollection.size();j++){ KeyedCollection indexedCollectionKC = (KeyedCollection) indexedCollection.get(j); String no = (String)indexedCollectionKC.getDataValue("ECBillCode"); if(no.equals(checkList[i+1])){ list.add(no); } } }
//此处调用下载方法 返回值为数组 分别为生成的文件名称以及文件物理路径 String[] fileNames = Czg111CreatPDF.downloadPdf("Receipt",p,indexedCollection,pageContext,list); ServletOutputStream ou = null; FileInputStream fis = null; try{ String displayFileName = fileNames[0]; String accountFilePath = fileNames[1]; String fullPath =accountFilePath; response.reset(); response.setContentType("charset=UTF-8"); response.setContentType("application/pdf"); String filename = new String(displayFileName.getBytes("gb2312"), "ISO8859-1"); response.setHeader("Content-Disposition","attachment; filename=" + filename); //解决HTTPS不能下载的问题 response.setHeader("Cache-Control","public"); ou = response.getOutputStream(); file = new File(fullPath); fis = new FileInputStream(file); try { if (fis != null) { int filelen = fis.available(); byte a[] = new byte[filelen]; fis.read(a); ou.write(a); ou.flush(); } } catch (Exception e) { EMPLog.log("pdfDownload", EMPLog.INFO, 0, e.toString()); } out = pageContext.pushBody(); }catch(Exception e){ e.printStackTrace(); }finally{ try { fis.close(); ou.close();
//文件下载至本地后,删除服务器上的文件
if(file != null){
file.delete(); } ou = null; response.flushBuffer(); } catch (Exception e) { e.printStackTrace(); } } %>
AccAcountReportFile