iReport报表开发

iReportJasperReport简介(二)

1.iReport 报表工具类 

package com.runan.util.iReport;
/**
 * iReport 报表工具 
 */
public class IreportUtils {
	/**  
	* 获得JasperPrint对象;自定义填充报表时的parameter和dataSource. 
	* @param filePath 模板路径
	* @param parameter 参数
	* @param dataSource 数据源(list,object[],map)
	*/  
	public JasperPrint getJasperPrint(String filePath, Map parameter, JRDataSource dataSource) throws JRException {   
		JasperReport jasperReport = null;   
		try {   
			//jasperReport = (JasperReport) JRLoader.loadObject(filePath);
			jasperReport = (JasperReport) JRLoader.loadObjectFromFile(filePath);
			return JasperFillManager.fillReport(jasperReport, parameter, dataSource);   
		} catch (JRException e) {   
			e.printStackTrace();   
		}   
		return null;   
	}
	
	/**  
	* 获得JasperPrint对象;自定义填充报表时的parameter和connection
	* @param filePath 模板路径
	* @param parameter 参数
	* @param conn 数据库连接
	*/  
	public JasperPrint getJasperPrint(String filePath, Map parameter, Connection  conn) throws JRException {   
		JasperReport jasperReport = null;   
		try {   
			//jasperReport = (JasperReport) JRLoader.loadObject(filePath);   
			jasperReport = (JasperReport) JRLoader.loadObjectFromFile(filePath);   
			return JasperFillManager.fillReport(jasperReport, parameter, conn);   
		} catch (JRException e) {   
			e.printStackTrace();   
		}   
		return null;   
	}
	
	/**  
	* 通过传入List类型数据源获取JasperPrint实例
	* @param filePath 模板路径
	* @param parameter 参数
	* @param list 数据源
	*/  
	public JasperPrint getPrintWithBeanList(String filePath, Map parameter, List list) throws JRException {   
		JRDataSource dataSource = new JRBeanCollectionDataSource(list);   
		return getJasperPrint(filePath, parameter, dataSource);   
	}   
	  
	/**  
	* 通过传入List类型数据源获取JasperPrint实例
	* @param filePath 模板路径
	* @param parameter 参数
	* @param Objcet[] 数据源
	*/  
	public JasperPrint getPrintWithBeanArayy(String filePath, Map parameter, Object[] objArray) throws JRException {   
		JRDataSource dataSource = new JRBeanArrayDataSource(objArray);   
		return getJasperPrint(filePath, parameter, dataSource);   
	}   
	
	
	/**  
	* 传入类型,获取输出器  
	*   
	* @param docType  
	* @return  
	*/  
	public JRAbstractExporter getJRExporter(DocType docType) {   
		JRAbstractExporter exporter = null;   
		switch (docType) {   
		case PDF:   
			exporter = new JRPdfExporter();   
			break;   
		case HTML:   
			exporter = new JRHtmlExporter();   
			break;   
		case XLS:   
			exporter = new JExcelApiExporter();   
			break;   
		case XML:   
			exporter = new JRXmlExporter();   
			break;   
		case RTF:   
			exporter = new JRRtfExporter();   
			break;   
		case CSV:   
			exporter = new JRCsvExporter();   
			break;   
		case TXT:   
			exporter = new JRTextExporter();   
			break; 
		case DOC:   
			exporter = new JRRtfExporter();   
			break;   
		}   
		return exporter;   
	}
	
	/**  
	* 获得相应类型的Content type  
	* @param docType  
	* @return  
	 */  
	public String getContentType(DocType docType){   
		String contentType="text/html";   
		switch(docType){   
			case PDF:   
				contentType = "application/pdf";   
				break;   
			case XLS:   
				contentType = "application/vnd.ms-excel";   
				break;   
			case XML:   
				contentType = "text/xml";   
				break;   
			case RTF:   
				contentType = "application/rtf";   
				break;   
			case CSV:   
				contentType = "text/plain";   
				break; 
			case DOC:   
				contentType = "application/msword;charset=utf-8";   
				break; 
		}   
		return contentType;   
	}  
	
	/**  
	* 编译报表模板文件jrxml,生成jasper二进制文件  
	* @param jrxmlPath  报表设计文件
	* @param jrsperPath 报表编译后文件
	* @throws JRException  
	*/  
	public void complieJrxml(String jrxmlPath, String jasperPath) throws JRException {   
		JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);   
	}   
	
	/**  
	* 定义了报表输出类型,固定了可输出类型  
	*/  
	public static enum DocType {   
		PDF, HTML, XLS, XML, RTF, CSV, TXT, DOC  
	}  
	
	/**  
	* 输出html静态页面,必须注入request和response  
	* @param jasperPath  
	* @param params  
	* @param sourceList  
	* @param imageUrl  
	*  报表文件使用的图片路径,比如 ../image?image=  
	* @param response  
	* @throws Exception  
	*/  
	public void servletExportHTMLList(String jasperPath, Map params,   
			List sourceList, String imageUrl,HttpServletResponse response) throws Exception{   
		response.setContentType("text/html");   
		response.setCharacterEncoding("UTF-8");   
		JRAbstractExporter exporter = getJRExporter(DocType.HTML);   
		JasperPrint jasperPrint = getPrintWithBeanList(jasperPath, params, sourceList);   
		PrintWriter out = response.getWriter();   
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);   
		exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);   
		exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);   
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px   
		exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);   
		exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");    
		exporter.exportReport();   
	}
	
	/**  
	* 输出html静态页面,必须注入request和response  
	* @param jasperPath  
	* @param params  
	* @param sourceList  
	* @param imageUrl  
	*  报表文件使用的图片路径,比如 ../image?image=  
	* @param response  
	* @throws Exception  
	*/  
	public void servletExportHTMLArray(String jasperPath, Map params,   
			Object[] sourceArray, String imageUrl,HttpServletResponse response) throws Exception{   
		response.setContentType("text/html");   
		response.setCharacterEncoding("UTF-8");   
		JRAbstractExporter exporter = getJRExporter(DocType.HTML);   
		JasperPrint jasperPrint = getPrintWithBeanArayy(jasperPath, params, sourceArray);   
		PrintWriter out = response.getWriter();   
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);   
		exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);   
		exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);   
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px   
		exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);   
		exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");    
		exporter.exportReport();   
	}
	
	/**  
	* 输出html静态页面,必须注入request和response  
	* @param jasperPath  
	* @param params  
	* @param sourceList  
	* @param imageUrl  
	*  报表文件使用的图片路径,比如 ../image?image=  
	* @param response  
	* @throws Exception  
	*/  
	public void servletExportHTML(String jasperPath, Map params,   
			Connection con, String imageUrl, HttpServletResponse response) throws Exception{   
		response.setContentType("text/html");   
		response.setCharacterEncoding("UTF-8");   
		JRAbstractExporter exporter = getJRExporter(DocType.HTML);   
		JasperPrint jasperPrint = getJasperPrint(jasperPath, params, con);   
		PrintWriter out = response.getWriter();   
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);   
		exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);   
		exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);   
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px   
		exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);   
		exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");    
		exporter.exportReport();   
	} 
	
	/**  
	* 生成不同格式报表文档  
	* @param docType  文档类型 
	* @param jasperPath  
	* @param params
	* @param sourceList
	* @param fileName
	* @param response
	*/  
	public void exportDocumentList(DocType docType, String jasperPath, 
			Map params, List sourceList, String fileName, HttpServletResponse response) throws Exception{   
		if (docType == DocType.HTML) {   
			servletExportHTMLList(jasperPath, params, sourceList, fileName, response);   
			return;   
		}   
		JRAbstractExporter exporter = getJRExporter(docType);   
		// 获取后缀   
		String ext = docType.toString().toLowerCase();   
		if (!fileName.toLowerCase().endsWith(ext)) {   
			fileName += "." + ext;   
		}   
		// 判断资源类型   
		if (ext.equals("xls")) {  
			// 删除记录最下面的空行 
			exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); 
			// 删除多余的ColumnHeader 
			exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
			// 显示边框 
			exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);  
		}   
		response.setContentType(getContentType(docType));   
		response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");   
		exporter.setParameter(JRExporterParameter.JASPER_PRINT,   
		getPrintWithBeanList(jasperPath, params, sourceList));   
		OutputStream outStream = null;   
		PrintWriter outWriter = null;   
		if(ext.equals("csv")){//解决中文乱码问题   
			response.setCharacterEncoding("GBK");   
			outWriter = response.getWriter();   
			exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);   
		}else{   
			outStream = response.getOutputStream();   
			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);   
			if(ext.equals("txt")){   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");   
			}   
		}   
		try {   
			exporter.exportReport();   
		 } catch (JRException e) {   
			 throw new Exception(e);   
		} finally {   
			if (outStream != null) {   
				try {   
						outStream.close();   
				} catch (IOException ex) {   
				}   
			}   
		}   
	}
	
	/**  
	* 生成不同格式报表文档  
	* @param docType  文档类型 
	* @param jasperPath  
	* @param params
	* @param sourceList
	* @param fileName
	* @param response
	*/  
	public void exportDocumentArray(DocType docType, String jasperPath, 
			Map params, Object[] sourceArray, String fileName, HttpServletResponse response) throws Exception{   
		if (docType == DocType.HTML) {   
			servletExportHTMLArray(jasperPath, params, sourceArray, fileName, response);   
			return;   
		}   
		JRAbstractExporter exporter = getJRExporter(docType);   
		// 获取后缀   
		String ext = docType.toString().toLowerCase();   
		if (!fileName.toLowerCase().endsWith(ext)) {   
			fileName += "." + ext;   
		}   
		// 判断资源类型   
		if (ext.equals("xls")) {  
			// 删除记录最下面的空行 
			exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); 
			// 删除多余的ColumnHeader 
			exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
			// 显示边框 
			exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);  
		}   
		response.setContentType(getContentType(docType));   
		response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");   
		exporter.setParameter(JRExporterParameter.JASPER_PRINT,   
		getPrintWithBeanArayy(jasperPath, params, sourceArray));   
		OutputStream outStream = null;   
		PrintWriter outWriter = null;   
		if(ext.equals("csv")){//解决中文乱码问题   
			response.setCharacterEncoding("GBK");   
			outWriter = response.getWriter();   
			exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);   
		}else{   
			outStream = response.getOutputStream();   
			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);   
			if(ext.equals("txt")){   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");   
			}   
		}   
		try {   
			exporter.exportReport();   
		 } catch (JRException e) {   
			 throw new Exception(e);   
		} finally {   
			if (outStream != null) {   
				try {   
						outStream.close();   
				} catch (IOException ex) {   
				}   
			}   
		}   
	}
	
	/**  
	* 生成不同格式报表文档  
	* @param docType  文档类型 
	* @param jasperPath 模板文件路径 
	* @param params 参数
	* @param con 连接
	* @param fileName 输出文件名
	* @param response 相应对象
	*/  
	//public void exportDocumentCon(DocType docType, String jasperPath, Map params, Connection con, String fileName, HttpServletResponse response) throws Exception{   
	public void exportDocumentCon(DocType docType, String jasperPath, Map params, String fileName, HttpServletResponse response) throws Exception{   
		DataSource dataSource ;
		WebApplicationContext cont = WebApplicationContextUtils
				.getRequiredWebApplicationContext(RequestFilter.threadLocalRequest.get()
						.getSession().getServletContext());
		dataSource = (DataSource)cont.getBean("dataSource");
		Connection con = dataSource.getConnection();
		if (docType == DocType.HTML) {  
	      servletExportHTML(jasperPath, params, con, fileName, response);   
	      return;   
		}   
		JRAbstractExporter exporter = getJRExporter(docType);   
		// 获取后缀   
		String ext = docType.toString().toLowerCase();   
		if (!fileName.toLowerCase().endsWith(ext)) {   
			fileName += "." + ext;   
		}   
		// 判断资源类型   
		if (ext.equals("xls")) {  
			// 删除记录最下面的空行 
			exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); 
			// 删除多余的ColumnHeader 
			exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
			// 显示边框 
			exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);  
		}   
		response.setContentType(getContentType(docType));   
		response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");   
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, getJasperPrint(jasperPath, params, con));
		OutputStream outStream = null;   
		PrintWriter outWriter = null;   
		if(ext.equals("csv")){
			//解决中文乱码问题 
			response.setCharacterEncoding("GBK");   
			outWriter = response.getWriter();   
			exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);   
		}else{   
			outStream = response.getOutputStream();   
			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);   
			if(ext.equals("txt")){   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));   
				exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");   
			}   
		}   
		try {   
			exporter.exportReport();   
		 } catch (JRException e) {   
			 throw new Exception(e);   
		} finally {   
			if (outStream != null) {   
				try {   
					outStream.flush();
						outStream.close();   
				} catch (IOException ex) {   
					ex.printStackTrace();
				}   
			}   
		}   
	}
	
	public static DocType getEnumDocType(String docType){   
		DocType type = DocType.HTML;   
		docType = docType.toUpperCase();   
		if(docType.equals("PDF")){   
			type = DocType.PDF;   
		}else if(docType.equals("XLS")){   
			type = DocType.XLS;   
		}else if(docType.equals("XML")){   
			type = DocType.XML;   
		}else if(docType.equals("RTF")){   
			type = DocType.RTF;   
		}else if(docType.equals("CSV")){   
			type = DocType.CSV;   
		}else if(docType.equals("TXT")){   
			type = DocType.TXT;   
		}else if(docType.equals("DOC")){   
			type = DocType.DOC;   
		}   
		return type;   
	}
	
	/**  
	* 预览不同格式报表文档  
	* @param docType  文档类型 
	* @param jasperPath  
	* @param params
	* @param sourceList
	*/  
	public void viewDocumentArray(String jasperPath, 
			Map params, Object[] sourceArray) throws Exception{   
		try {   
			JasperViewer.viewReport(getPrintWithBeanArayy(jasperPath, params, sourceArray));
		 } catch (JRException e) {   
			 throw new Exception(e);   
		} finally { 
			
		}   
	}
	
	/**  
	* 预览不同格式报表文档  
	* @param docType  文档类型 
	* @param jasperPath  
	* @param params
	* @param sourceList
	*/  
	public void viewDocumentList(String jasperPath, 
			Map params, List sourceArray) throws Exception{   
		try {   
			JasperViewer.viewReport(getPrintWithBeanList(jasperPath, params, sourceArray));
		 } catch (JRException e) {   
			 throw new Exception(e);   
		} finally { 
			
		}   
	}
}

 2.Controller类

@RequestMapping(params = "report")
    public void report(String ddlx,HttpServletRequest request,HttpServletResponse response){
    	String idsArray[] = request.getParameterValues("id");
    	Transferwithin transferwithin = transferwithinService.getTransferwithinById(idsArray[0]);
    	CommonConfig config = new CommonConfig();
    	config.setCode(transferwithin.getDdhszjq());
    	config.setGroupCode("JQ");
    	config = commonConfigService.getCommonConfigbyCode(config);
		IreportUtils ireportUtils = new IreportUtils();
		String	jasperPath="/report/ireportTemplete/zf_djtzs.jasper";
		jasperPath = request.getSession().getServletContext().getRealPath(jasperPath);
		String fileName="罪犯调监通知书";
		Map<String,Object> params= new HashMap<String, Object>();
		try {
			params.put("title", "罪犯调动通知单 (存根)");
			params.put("zihao", transferwithin.getDlxh()); 
			params.put("content", "          因为改造需要,经研究同意将罪犯 "+transferwithin.getXm()+"等"+idsArray.length+"名分给"+config.getName()+",请于"+DateUtils.dateToString(transferwithin.getDdrq(), "yyyy年MM月dd日")+"前办理好交接手续。");
			params.put("fmd", "附名单:"+transferwithinService.getZfXmString(idsArray));  
			params.put("name", "德州监狱狱政管理科");
			params.put("makedate", DateUtils.dateToString(new Date(), "yyyy年MM月dd日"));
			ireportUtils.exportDocumentCon(DocType.PDF, jasperPath, params,fileName, response);
		} catch (Exception e) {
			throw new RunanException(e.getMessage());
		}
    }

导出图见附件,当然PDF某些元素是靠iReport工具生成。

猜你喜欢

转载自nice2230.iteye.com/blog/2238469