• JasperRepor导出报表通用类


    1.ReportUtils.java通用类

    /**
     * 使用jasperReport做报表时的工具支持类.有两个用途,生成jasperPrint对象,和设置导出时的session
     */
    public class ReportUtils {
    	private HttpServletRequest request;
    	private HttpServletResponse response;
    	private HttpSession session;
    
    	public ReportUtils(HttpServletRequest request, HttpServletResponse response) {
    		this.request = request;
    		this.session = request.getSession();
    		this.response = response;
    	}
    
    	/**
    	 * 获得JasperPrint对象;自定义填充报表时的parameter和dataSource. 参数说明和动态表头的用法参考上一方法
    	 */
    	public JasperPrint getJasperPrint(String filePath, Map parameter,
    			JRDataSource dataSource) throws JRException {
    		JasperReport jasperReport = null;
    		try {
    			jasperReport = (JasperReport) JRLoader.loadObject(filePath);
    			return JasperFillManager.fillReport(jasperReport, parameter,
    					dataSource);
    		} catch (JRException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 获得JasperPrint对象;自定义填充报表时的parameter和connection
    	 */
    	public JasperPrint getJasperPrint(String filePath, Map parameter,
    			Connection  conn) throws JRException {
    		JasperReport jasperReport = null;
    		try {
    			jasperReport = (JasperReport) JRLoader.loadObject(filePath);
    			return JasperFillManager.fillReport(jasperReport, parameter,
    					conn);
    		} catch (JRException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	/**
    	 * 通过传入List类型数据源获取JasperPrint实例
    	 */
    	public JasperPrint getPrintWithBeanList(String filePath, Map parameter,
    			List list) throws JRException {
    		JRDataSource dataSource = new JRBeanCollectionDataSource(list);
    		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;
    		}
    		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;
    		}
    		return contentType;
    	}
    
    	public void setAttrToPage(JasperPrint jasperPrint, String report_fileName,
    			String report_type) {
    		session.setAttribute("REPORT_JASPERPRINT", jasperPrint);
    		session.setAttribute("REPORT_FILENAME", report_fileName);
    		session.setAttribute("REPORT_TYPE", report_type);
    	}
    
    	/**
    	 * 定义了报表输出类型,固定了可输出类型
    	 */
    	public static enum DocType {
    		PDF, HTML, XLS, XML, RTF, CSV, TXT
    	}
    
    	/**
    	 * 编译报表模板文件jrxml,生成jasper二进制文件
    	 * 
    	 * @param jrxmlPath
    	 * @param jrsperPath
    	 * @throws JRException
    	 */
    	public void complieJrxml(String jrxmlPath, String jasperPath)
    			throws JRException {
    		JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
    	}
    
    	/**
    	 * 输出html静态页面,必须注入request和response
    	 * 
    	 * @param jasperPath
    	 * @param params
    	 * @param sourceList
    	 * @param imageUrl
    	 *            报表文件使用的图片路径,比如 ../servlets/image?image=
    	 * @throws JRException
    	 * @throws IOException
    	 * @throws ServletException
    	 */
    	public void servletExportHTML(String jasperPath, Map params,
    			List sourceList, String imageUrl) throws JRException, IOException,
    			ServletException {
    		response.setContentType("text/html");
    		response.setCharacterEncoding("UTF-8");
    		JRAbstractExporter exporter = getJRExporter(DocType.HTML);
    
    		JasperPrint jasperPrint = getPrintWithBeanList(jasperPath, params,
    				sourceList);
    
    		session.setAttribute(
    				ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
    				jasperPrint);
    
    		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
    	 *            报表文件使用的图片路径,比如 ../servlets/image?image=
    	 * @throws JRException
    	 * @throws IOException
    	 * @throws ServletException
    	 */
    	public void servletExportHTML(String jasperPath, Map params,
    			Connection conn, String imageUrl) throws JRException, IOException,
    			ServletException {
    		response.setContentType("text/html");
    		response.setCharacterEncoding("UTF-8");
    		JRAbstractExporter exporter = getJRExporter(DocType.HTML);
    
    		JasperPrint jasperPrint = getJasperPrint(jasperPath, params,
    				conn);
    
    		session.setAttribute(
    				ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
    				jasperPrint);
    
    		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.exportReport();
    	}
    
    	/**
    	 * 生成不同格式报表文档
    	 * 
    	 * @param docType
    	 *            文档类型
    	 * @param jasperPath
    	 */
    	public void servletExportDocument(DocType docType, String jasperPath,
    			Map params, List sourceList, String fileName) throws JRException,
    			IOException, ServletException {
    
    		if (docType == DocType.HTML) {
    			servletExportHTML(jasperPath, params, sourceList, fileName);
    			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); // 删除记录最下面的空行
    			
    			 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
    			 Boolean.FALSE);// 删除多余的ColumnHeader
    			
    			 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 ServletException(e);
    		} finally {
    			if (outStream != null) {
    				try {
    					outStream.close();
    				} catch (IOException ex) {
    				}
    			}
    		}
    	}
    
    	/**
    	 * 生成不同格式报表文档
    	 * 
    	 * @param docType
    	 *            文档类型
    	 * @param jasperPath
    	 */
    	public void servletExportDocument(DocType docType, String jasperPath,
    			Map params, Connection conn, String fileName) throws JRException,
    			IOException, ServletException {
    
    		if (docType == DocType.HTML) {
    			servletExportHTML(jasperPath, params, conn, fileName);
    			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); // 删除记录最下面的空行
    			
    			 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
    			 Boolean.FALSE);// 删除多余的ColumnHeader
    			
    			 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, conn));
    		
    		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 ServletException(e);
    		} finally {
    			if (outStream != null) {
    				try {
    					outStream.close();
    				} catch (IOException ex) {
    				}
    			}
    		}
    	}
    
    }


    2.用Servlet导出生成文件

    public class JapserReportServlet extends HttpServlet{
    
    	private static final long serialVersionUID = 1L;
    	public void init(){}
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
    		String docType = request.getParameter("docType");
    		String jasperFile = request.getParameter("jasperFile");
    		String isBean = request.getParameter("isBean");//数据提供方式
    		
    		String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");
    		//jasper文件放在应用根目录的reports中
    		String jasperPath = request.getSession().getServletContext().getRealPath("/") + "/reports/"+ jasperFile;
    		
    		if(StringUtils.isNotEmpty(jasperPath)){
    
    			if(StringUtils.isEmpty(fileName)){
    				fileName = "报表";
    			}
    			
    			ReportUtils jasperReport = new ReportUtils(request,response);
    
    			//传递报表中(SQL)用到的参数值:$P{ProjectName}
    			Map params = new HashMap();
    		    //"Name"是报表中定义过的一个参数名称,其类型为String 型 
    		    //params.put("ProjectName", new String("Project1"));
    
    			try {
    				if(isBean.equals("1")){
    					jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getSourceList(), fileName);
    				}else{
    					jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getConnection(), fileName);
    				}
    			
    			} catch (JRException e) {
    				e.printStackTrace();
    			} catch (ServletException e) {
    				e.printStackTrace();
    			}
    		}else{
    			response.setCharacterEncoding("UTF-8");
    			response.sendError(-1, "出错:jasperPath参数是必须的!");
    		}
    	}
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{       
    		this.doGet(request, response);              
    	} 
    	
        public void destroy() {       
            super.destroy();        
        }
        
        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;
        	}
        	return type;
        }
        
        /***数据对象****/
        public static List getSourceList(){
        	List<TUser> sourceList = new ArrayList<TUser>();// 测试数据源
    		for (int i = 0; i < 15; i++) {
    			TUser user = new TUser();
    			user.setId(1000 + i);
    			user.setUsername("user_" + i);
    			user.setPassword("*******");
    			sourceList.add(user);
    		}
        	return sourceList;
        }
        
        /****数据库连接****/
    	public static Connection getConnection() {
    		Connection conn = null;
    		String driver = "com.mysql.jdbc.Driver";
    		String url = "jdbc:mysql://127.0.0.1/springapp?useUnicode=true&characterEncoding=gb2312";
    		try {
    			Class.forName(driver);
    			conn = DriverManager.getConnection(url,"root", "root");
    			return conn;
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException ex) {
    			ex.printStackTrace();
    		}
    		return null;
    	}
    }

    3.web.xml中的Servlet配置

     

    	<servlet>
            <servlet-name>JapserReportServlet</servlet-name>
            <servlet-class>
                com.logcd.servlet.JapserReportServlet
            </servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>JapserReportServlet</servlet-name>
            <url-pattern>/reports</url-pattern>
        </servlet-mapping>


    4.调用

    function jasperReport(docType){
    	var jasperFile = "Regist_User_Group.jasper";
    	var paramStr = "?docType=" + docType + "&jasperFile="+jasperFile + "&fileName=" +'人员名单列表' + "&isBean=0";
    	var url = getCurrentDirectory() + "/reports" + paramStr;
    	window.open(url);
    }
    
    /***获取当前路径***/
    function getCurrentDirectory(){
    	var locHref = location.href;
    	var locArray = locHref.split("/");
        delete locArray[locArray.length-1];
        var dirStr = locArray.join("/");
        return dirStr;
    }


     

    		报表类型
    		<select name="reportType" id="reportType">
    			 <option value="html">HTML</option>
    			 <option value="pdf">PDF</option>
    			 <option value="rtf">RTF</option>
    			 <option value="xls">XLS</option>
    			 <option value="xml">XML</option>
    			 <option value="csv">CSV</option>
    			 <option value="txt">TXT</option>
    	    </select> 
    		<button onclick="jasperReport($('reportType').value);">Reports</button>


    5.直接生产文件

    public class FirstJasperReports {
    	 static String fileName="E:/workspace/js_test/jrxml/HelloWorld.jrxml";
    	    public static void main(String[] args)throws Exception{
    	        long startTime=System.currentTimeMillis();
    	        //将报表的定义文件HelloWorld.jrxml编译成HelloWorld.jasper文件
    	        String jasperFile=JasperCompileManager.compileReportToFile(fileName);
    	        //向HelloWorld.jasper文件中填充数据,这一步将生产出HelloWorld .jrprint文件
    	        String jrprintFile=JasperFillManager.fillReportToFile(jasperFile,null,new JREmptyDataSource());
    	        //将.jrprint文件转换成HTML格式
    	        JasperExportManager.exportReportToHtmlFile(jrprintFile);
    	        //将.jrprint文件转换成PDF格式
    	        
    	        //JasperExportManager.exportReportToPdfFile(jrprintFile);
    	        //将.jrprint文件转换成XML格式
    	        JasperExportManager.exportReportToXmlFile(jrprintFile,false);
    	        //将.jrprint文件转换成XLS格式(即Excel文件),需要用到POI类库.
    	        File sourceFile = new File(jrprintFile);
    	        JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(sourceFile);
    	        File destFile = new File(sourceFile.getParent(), jasperPrint.getName() + ".xls");
    	        JRXlsExporter exporter = new JRXlsExporter();
    	        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    	        exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, destFile.toString());
    	        exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
    	        exporter.exportReport();
    	        long endTime=System.currentTimeMillis();
    	        long time=(endTime-startTime)/1000;
    	        System.out.println("success with "+time+" s");
    	     }
    
    }


     

    作者:熊哥club
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。文章部分内容来源网络,如有版权问题,请留言告知,博主会尽快删除.
    微信扫描下方二维码关注【熊哥club】,回复1024获取程序员必备IT电子书,回复java获取全套学习资源
  • 相关阅读:
    Linux服务器修改时区
    Linux磁盘IO查看
    passwd: 鉴定令牌操作错误
    Kubernetes 使用Nginx-Ingress实现蓝绿发布/金丝雀发布/AB测试【转】
    MySQL count 浅析【转】
    k8s pv,pvc无法删除问题【转】
    K8S 上部署 Redis-cluster 三主三从 集群【转】
    XtraBackup 备份加速【转】
    Gitlab+DRBD 高可用方案【转】
    Linux网卡bond的七种模式详解【转】
  • 原文地址:https://www.cnblogs.com/xionggeclub/p/5296481.html
Copyright © 2020-2023  润新知