`
yongboy
  • 浏览: 105835 次
  • 来自: ...
博客专栏
E16f1064-1c93-305c-9ed5-2118b09bada4
Servlet 3.0 学...
浏览量:0
社区版块
存档分类

JasperReports 在Servlet环境下工具类

阅读更多
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRAbstractExporter;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;

/**
 * 使用jasperReport做报表时的工具支持类.有两个用途,生成jasperPrint对象,和设置导出时的session
 */
public class ReportUtils {
	private HttpServletRequest request;
	private HttpServletResponse response;
	private HttpSession session;

	/**
	 * 在其它web环境下构造此工具类对象
	 * 
	 * @param request
	 *            request请求对象
	 */
	public ReportUtils(HttpServletRequest request) {
		this.request = request;
		this.session = request.getSession();
	}

	public ReportUtils(HttpServletResponse response) {
		this.response = response;
	}

	public ReportUtils(HttpServletRequest request, HttpServletResponse response) {
		this(request);
		this.response = response;
	}

	/**
	 * 获得JasperPrint对象;自定义填充报表时的parameter和dataSource. 参数说明和动态表头的用法参考上一方法
	 * 
	 * @param filePath
	 * @param parameter
	 * @param dataSource
	 * @param sizeGroup
	 * @return
	 */
	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;
	}

	/**
	 * 通过传入List类型数据源获取JasperPrint实例
	 * 
	 * @param filePath
	 *            jasper路径
	 * @param parameter
	 * @param list
	 * @return
	 * @throws JRException
	 */
	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;
		}
		return exporter;
	}

	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);
	}

	/**
	 * 定义了报表输出类型,固定了可输出类型
	 * 
	 * @author Administrator
	 * 
	 */
	public static enum DocType {
		PDF, HTML, XLS, XML, RTF
	}

	/**
	 * 编译报表模板文件jaxml,生成jasper二进制文件
	 * 
	 * @param jaxmlPath
	 * @param jasperPath
	 * @throws JRException
	 */
	public void complieJaxml(String jaxmlPath, String jasperPath)
			throws JRException {
		JasperCompileManager.compileReportToFile(jaxmlPath, jasperPath);
	}

	/**
	 * 输出PDF 使用此方法,必须预先注入response
	 * 
	 * @param jasperPath
	 * @param params
	 * @param sourceList
	 * @param fileName
	 * @throws JRException
	 * @throws IOException
	 * @throws ServletException
	 */
	public void servletExportPDF(String jasperPath, Map params,
			List sourceList, String fileName) throws JRException, IOException,
			ServletException {
		servletExportDocument(DocType.PDF, jasperPath, params, sourceList,
				fileName);
	}

	/**
	 * 输出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.exportReport();
	}

	/**
	 * 输出Excel报表文件
	 * 
	 * @param jasperPath
	 * @param params
	 * @param sourceList
	 * @param fileName
	 * @throws JRException
	 * @throws IOException
	 * @throws ServletException
	 */
	public void servletExportExcel(String jasperPath, Map params,
			List sourceList, String fileName) throws JRException, IOException,
			ServletException {
		servletExportDocument(DocType.XLS, jasperPath, params, sourceList,
				fileName);
		// 要想获得更好的视觉效果,可以添加以下代码
		// // 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);// 显示边框
	}

	/**
	 * 生成不同格式报表文档
	 * 
	 * @param docType
	 *            文档类型
	 * @param jasperPath
	 * @param params
	 * @param sourceList
	 * @param fileName
	 * @throws JRException
	 * @throws IOException
	 * @throws ServletException
	 */
	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;
		}
		// 判断资源类型
		String contentType = "application/";
		if (ext.equals("xls")) {
			ext = "excel";
		} else if (ext.equals("xml")) {
			contentType = "text/";
		}
		contentType += ext;

		response.setContentType(contentType);
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ URLEncoder.encode(fileName, "UTF-8") + "\"");

		exporter.setParameter(JRExporterParameter.JASPER_PRINT,
				getPrintWithBeanList(jasperPath, params, sourceList));

		OutputStream ouputStream = response.getOutputStream();

		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
		try {
			exporter.exportReport();
		} catch (JRException e) {
			throw new ServletException(e);
		} finally {
			if (ouputStream != null) {
				try {
					ouputStream.close();
				} catch (IOException ex) {
				}
			}
		}
	}
}

 当前代码在Servlet环境下使用,仅仅传入jasper路径,LIST类型数据源,以及其它参数即可完成报表的输出。

分享到:
评论

相关推荐

    JasperReports webapp应用

    - 集成到Webapp:在Web应用中配置JasperReports库,编写Servlet或JSP来处理报表请求并渲染报表。 - 数据绑定:根据需求设置数据源,如数据库查询语句或XML数据。 - 测试与优化:在Web环境中测试报表的显示和交互...

    JasperReports,iReport制作报表

    例如,`MyJasperReportWebPrint`可能是一个示例项目,演示了如何在Web环境下使用JasperReports。这可能包括创建一个Servlet,该Servlet接收请求,生成报表,然后将其以特定格式返回给浏览器。在这样的项目中,你可能...

    jasperreports-6.1.1_all_jar.rar资源包下载.zip

    6. **嵌入式能力**:JasperReports设计的报表可以嵌入到Java应用程序中,如Servlet、Swing或JavaFX应用,使得报表成为应用程序的一部分,提供实时数据分析。 在"jasperreports-6.1.1_all_jar.rar"资源包中,包含了...

    jasperreports-6.9.0-project.zip

    《JasperReports 6.9.0:深度解析与实战指南》 JasperReports是一款强大的开源...在实际开发中,结合ireport(一个基于JasperReports的可视化报表设计工具),我们可以快速设计出复杂的报表模板,进一步提升工作效率。

    JasperReports中文入门

    在Web环境中,JasperReports同样表现出色,能够集成到Servlet容器中,支持HTTP请求响应模型,实现在Web页面上查看和下载报表。此外,JasperReports还提供了JRXML和JASPERREPORTS服务器,以便于管理和部署报表。 ###...

    jasperreports+alivepdf+Flex解决打印和导出PDF问题

    jasperreports的强大之处在于其基于Java,可以方便地与各种Java应用集成,如Spring、Struts等,同时也支持JSP、Servlet等Web开发环境。 Flex是Adobe开发的一个开源框架,主要用于构建富互联网应用(RIA),它使用...

    JasperReport+Servlet Web应用之:打印预览

    JasperReport是一款强大的开源报表工具,它允许开发者在Java应用程序、Web应用甚至独立的Java应用程序中创建复杂的报告。Servlet是Java Web开发中的一个重要组件,用于接收和响应来自客户端的HTTP请求。在本知识点中...

    Jasperreports6+spring5

    在IT行业中,报表生成是企业应用中不可或缺的一部分,而JasperReports作为一个强大的开源报表工具,深受开发者喜爱。本文将深入探讨如何将JasperReports 6版本与Spring 5框架进行整合,尤其考虑到Spring Web 5已经...

    eclipse_ssh_jasperreports输出PDF等

    在Java Web开发中,Eclipse、SSH(Spring、Struts和Hibernate)框架的组合是常见的选择,而JasperReports则是一个强大的报表生成工具,能够帮助开发者创建复杂的报表并以多种格式输出,如HTML、PDF等。本文将深入...

    JasperReport + Servlet Web应用之:HTML显示报表内容

    在Servlet环境下,我们需要先将.jrxml文件编译成.jasper格式的预编译报表模板。这个过程可以通过JasperCompileManager类的compileReport方法完成,它接收.jrxml文件的路径作为参数,返回预编译后的.jasper文件。 接...

    Ireport强大的报表工具制作报表必用代码 在Servlet中将集合中的数据输出到PDF,XLS,HTML

    在Java Web开发中,IReport是一款强大的报表设计工具,它允许开发者通过拖拽方式创建复杂的报表模板,并将数据源与这些模板结合,最终生成PDF、XLS、HTML等多种格式的报表。本文将深入探讨如何利用IReport以及相关库...

    jasperreport报表模板预览 applet与servlet通信

    标题中的“jasperreport报表模板预览 applet与servlet通信”涉及到的是Java开发中的一种常见应用场景,即使用JasperReports库创建报表,并通过Applet和Servlet进行交互以实现报表的预览。JasperReports是一个强大的...

    Packtpub.JasperReports.3.5.for.Java.Developers.Aug.2009.pdf

    了解如何将JasperReports集成到Java应用程序中,包括Servlet、JSP和Swing应用等。此外,还会涉及如何通过网络分发和打印报表。 7. **子报表与分组** 子报表用于在主报表中嵌套其他报表,而分组则是按照特定字段对...

    iReport+jasperReports报表设计中文全套.rar

    iReport和JasperReports是Java世界中非常流行的报表设计工具,它们主要用于创建复杂的数据报告,广泛应用于企业级应用系统中。本套教程包含了从基础到高级的全方位学习内容,旨在帮助用户掌握这两款工具的使用技巧,...

    java调用jasper

    在这个配置中,`jasper`是servlet的名称,`JRServlet`是实际的类。`reportURI`参数指定了报表模板文件在Web应用中的路径,`url-pattern`则定义了访问报表的URL模式。 一旦配置完成,用户可以通过类似`...

    JasperReport集成

    - **创建报表视图配置文件**:在项目的`/WEB-INF/jasper/`目录下创建`jasper-defs.xml`文件,并指定自定义的视图解析器类; - **配置视图解析器**:在`/WEB-INF/spring/appServlet/servlet-context.xml`文件中增加`...

    ireport与java 桌面应用,web应用

    标题中的“ireport与java 桌面应用,web应用”揭示了本次讨论的核心主题,即如何使用ireport工具在Java环境下开发桌面应用程序和Web应用程序的报表功能。ireport是JasperReports库的一个图形化设计工具,允许开发者...

    java+ireport应用.pdf

    - **Servlet交互**: 文档还展示了如何在Servlet环境中使用这些类,通过`HttpServletRequest`和`HttpServletResponse`对象来处理HTTP请求和响应。 - **异常处理**: 在报表生成和输出的过程中可能会抛出`JRException`...

Global site tag (gtag.js) - Google Analytics