首页>代码>java开源报表产品JReport的demo实例>/ereportDemo/src/com/yitong/struts/common/RptProc.java
/**
 * 本类主要作用为:生成或者处理报表页面
 */
package com.yitong.struts.common;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.sql.Connection;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
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.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;

import com.yitong.struts.dao.GetCon;
import com.yitong.struts.dao.SQLConnection;

public class RptProc {

	private static RptProc instance = null;

	private static String imagesSavePath = "/ereportDemo/reports/images/"; // 本工程中图像文件的存放路径,保证所要的图片存在

	private RptProc() {

	}

	/**
	 * 生成分页Html,该方法被procHtmlRpt()方法调用
	 * 
	 * @param pageIndex
	 *            当前页数
	 * @param lastPageIndex
	 *            总页数
	 * @param localUrl
	 *            查看本报表的地址
	 * @param backUrl
	 *            返回查询页面的地址
	 * @return 生成的Html
	 */
	public static String splitPage(int pageIndex, int lastPageIndex, String localUrl, String backUrl) {

		if (localUrl.indexOf("?") < 0) {
			localUrl = localUrl + "?1=1";
		}
		System.out.println("\tlocalUrl:"+localUrl);
		StringBuffer sp = new StringBuffer(
				"<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">");
		sp.append("<tr>");
		sp.append("<td><a href=\"" + localUrl + "&reload=true\"><img src=\""
				+ imagesSavePath + "reload.gif\" border=\"0\"></a></td>");
		sp.append("<td>&nbsp;&nbsp;&nbsp;</td>");
		System.out.println("\tpageIndex:"+pageIndex);
		if (pageIndex > 0) {
			sp.append("<td><a href=\"" + localUrl + "&page=0\"><img src=\""
					+ imagesSavePath + "first.GIF\" border=\"0\"></a></td>");
			sp.append("<td><a href=\"" + localUrl + "&page=" + (pageIndex - 1)
					+ "\"><img src=\"" + imagesSavePath
					+ "previous.GIF\" border=\"0\"></a></td>");
		} else {
			sp.append("<td><img src=\"" + imagesSavePath
					+ "first_grey.GIF\" border=\"0\"></td>");
			sp.append("<td><img src=\"" + imagesSavePath
					+ "previous_grey.GIF\" border=\"0\"></td>");
		}
		System.out.println("\tlastPageIndex:"+lastPageIndex);
		if (pageIndex < lastPageIndex) {
			sp.append("<td><a href=\"" + localUrl + "&page=" + (pageIndex + 1)
					+ "\"><img src=\"" + imagesSavePath
					+ "next.GIF\" border=\"0\"></a></td>");
			sp.append("<td><a href=\"" + localUrl + "&page=" + (lastPageIndex)
					+ "\"><img src=\"" + imagesSavePath
					+ "last.GIF\" border=\"0\"></a></td>");
		} else {
			sp.append("<td><img src=\"" + imagesSavePath
					+ "next_grey.GIF\" border=\"0\"></td>");
			sp.append("<td><img src=\"" + imagesSavePath
					+ "last_grey.GIF\" border=\"0\"></td>");
		}
		sp.append("<td width=\"100%\" align=\"right\">");
		sp.append("<a href=\"" + localUrl + "&isSave=true\">");
		sp.append("<img src=\"" + imagesSavePath + "Excel.gif\" border=\"0\">");

		// 导出PDF
		sp.append("<a href=\"" + localUrl + "&isSavePDF=true\">");
		sp.append("<img src=\"" + imagesSavePath + "pdf.gif\" border=\"0\">");

		sp.append("</a>");
		// 如果返回Url这个参数为空,则不显示后退按钮
		if (!CFormat.isEmpty(backUrl)) {
			sp.append("&nbsp;&nbsp;&nbsp;&nbsp;");
			sp.append("<a href=\"" + backUrl + "\">");
			sp.append("<img src=\"" + imagesSavePath + "back.gif\" border=\"0\">");
			sp.append("</a>");
		}
		sp.append("</td>");
		sp.append(" </tr>");
		sp.append("</table>");
		return sp.toString();
	}

	/**
	 * 统一进行报表处理的函数---导出Html
	 * 
	 * @param request
	 *            从Action传递过来的request
	 * @param response
	 *            从Action传递过来的response
	 * @param parameter
	 *            Map类型的参数集合
	 * @param reportFile
	 *            报表真实路径
	 * @param localUrl
	 *            展示本报表的地址
	 * @param backUrl
	 *            返回的地址,即本报表查询地址
	 * @throws Exception
	 */
	public static void procHtmlRpt(HttpServletRequest request,
			HttpServletResponse response, Map parameter, String reportFile,
			String localUrl, String backUrl) throws Exception {

		Connection conn = null;

		// 获取Connection连接
		GetCon con = new GetCon();
		conn = con.getCon();

		JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile);

		JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,parameter, conn);
		conn.close();

		JRHtmlExporter exporter = new JRHtmlExporter();

		// -------------------------控制分页的代码---------------------
		int pageIndex = 0;
		int lastPageIndex = 0;
		if (jasperPrint.getPages() != null) {
			lastPageIndex = jasperPrint.getPages().size() - 1;
		}
		if (lastPageIndex < 0) {
			lastPageIndex = 0;
		}
		String pageStr = request.getParameter("page");
		try {
			pageIndex = Integer.parseInt(pageStr);
		} catch (Exception e) {
		}

		if (pageIndex < 0) {
			pageIndex = 0;
		}

		if (pageIndex > lastPageIndex) {
			pageIndex = lastPageIndex;
		}

		// ----------------------------------------------------------
		StringBuffer sbuffer = new StringBuffer();

		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, sbuffer);
		exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,"servlets/image?image=");
		exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex));
		exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, "");
		exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
		exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER, "");

		exporter.exportReport();

		request.setAttribute("sbuffer", sbuffer);// 将缓冲输出流设置到request中
		// 调用自定义生成分页Html的方法,并设置到request中去
		request.setAttribute("splitPage", splitPage(pageIndex, lastPageIndex,localUrl, backUrl));

	}

	/**
	 * 统一进行报表处理的函数---导出Excel
	 * 
	 * @param request
	 *            从Action传递过来的request
	 * @param response
	 *            从Action传递过来的response
	 * @param parameter
	 *            Map类型的参数集合
	 * @param reportFile
	 *            报表真实路径
	 * @param output_file_name
	 *            输出文件的文件名,不要包含中文名
	 * @throws Exception
	 */
	public static void procExcelRpt(HttpServletRequest request,
			HttpServletResponse response, Map parameter, String reportFile,
			String output_file_name) throws Exception {

		Connection conn = null;

		// 获取Connection连接
		//GetCon con = new GetCon();
		//conn = con.getCon();
		
		SQLConnection dbaccess=SQLConnection.getInstance();
		conn = dbaccess.getConnection();
		
		JRXlsExporter exporter = new JRXlsExporter(); // JasperReport的Excel导出对象

		// 设置导出Excel不分页
		parameter.put(JRParameter.IS_IGNORE_PAGINATION, Boolean.TRUE);

		// 填充报表的路径、参数、数据库连接
		JasperPrint report = JasperFillManager.fillReport(reportFile,parameter, conn);
		conn.close();// 关闭连接

		ByteArrayOutputStream xlsOutStream = new ByteArrayOutputStream();// 二进制输出流
		// 获取response的的输出流,并转换成缓冲输出流,有效处理数据量过大的情况
		BufferedOutputStream bufferOut = new BufferedOutputStream(response.getOutputStream());

		// 设置导出对象的各个参数
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, report);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsOutStream);
		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);// 显示边框

		if (!CFormat.isEmpty(output_file_name)) {
			exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,output_file_name);
		}
		exporter.exportReport();

		// 从二进制输出流获取字节数组
		byte bytes[] = xlsOutStream.toByteArray();
		xlsOutStream.close();

		// 设置response的格式
		response.setContentType("application/vnd.ms-excel");
		// response.setContentType("application/x-msdownload");
		if (!CFormat.isEmpty(output_file_name)) {
			response.setHeader("content-disposition", "attachment; filename=\""+ output_file_name + ".xls\"");
		}
		response.setContentLength(bytes.length);

		request.setAttribute("bufferOut", bufferOut);// 将缓冲输出流设置到request中
		request.setAttribute("bytes", bytes);// 将字节数组设置到request中

	}

	/**
	 * 统一进行报表处理的函数---导出PDF
	 * 
	 * @param request
	 *            从Action传递过来的request
	 * @param response
	 *            从Action传递过来的response
	 * @param parameter
	 *            Map类型的参数集合
	 * @param reportFile
	 *            报表真实路径
	 * @param output_file_name
	 *            输出文件的文件名,不要包含中文名
	 * @throws Exception
	 */
	public static void procPdfRpt(HttpServletRequest request,
			HttpServletResponse response, Map parameter, String reportFile,
			String output_file_name) throws Exception {

		Connection conn = null;

		// 获取Connection连接
		//GetCon con = new GetCon();
		//conn = con.getCon();
		SQLConnection dbaccess=SQLConnection.getInstance();
		conn = dbaccess.getConnection();
		
		JRPdfExporter exporter = new JRPdfExporter(); // JasperReport的PDF导出对象

		ServletOutputStream servletOutputStream = response.getOutputStream();

		// 设置导出Excel不分页
		parameter.put(JRParameter.IS_IGNORE_PAGINATION, Boolean.TRUE);

		// 填充报表的路径、参数、数据库连接
		JasperPrint report = JasperFillManager.fillReport(reportFile,parameter, conn);
		conn.close();// 关闭连接

		ByteArrayOutputStream xlsOutStream = new ByteArrayOutputStream();// 二进制输出流
		// 获取response的的输出流,并转换成缓冲输出流,有效处理数据量过大的情况
		BufferedOutputStream bufferOut = new BufferedOutputStream(response.getOutputStream());

		// 设置导出对象的各个参数
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, report);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsOutStream);

		if (!CFormat.isEmpty(output_file_name)) {
			exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,output_file_name);
		}
		exporter.exportReport();

		// 从二进制输出流获取字节数组
		byte bytes[] = xlsOutStream.toByteArray();
		xlsOutStream.close();

		// 设置response的格式
		response.setContentType("application/pdf");
		if (!CFormat.isEmpty(output_file_name)) {
			response.setHeader("content-disposition", "attachment; filename=\""+ output_file_name + ".pdf\"");
		}
		response.setContentLength(bytes.length);

		request.setAttribute("bufferOut", bufferOut);// 将缓冲输出流设置到request中
		request.setAttribute("bytes", bytes);// 将字节数组设置到request中
	}

}
最近下载更多
1358849392  LV21 2022年11月10日
zlmbr2012  LV3 2020年9月17日
wkc  LV21 2020年7月26日
jinzixian  LV1 2020年7月17日
沉默梦幻  LV1 2020年6月17日
qq415446566  LV1 2020年6月15日
zhouzh  LV9 2020年4月26日
liujiajun  LV7 2020年3月26日
chaoy_nx  LV8 2020年3月5日
java小书童  LV17 2019年12月19日
最近浏览更多
is_gary  LV15 2023年10月31日
pnews88  LV8 2023年6月30日
gyuhaoMM 2023年4月10日
暂无贡献等级
1358849392  LV21 2022年11月10日
abc562311934  LV4 2022年10月8日
wusiyin  LV14 2022年9月15日
杠上炮  LV6 2022年6月28日
crosa_Don  LV18 2022年3月31日
来恬爸爸晋亚阳  LV3 2021年10月29日
tmdgdx  LV9 2021年9月26日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友