jasper报表工具类

package webapp.util;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
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 webapp.comm.DBConnection;

//import com.mysql.jdbc.Connection;

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.JRPrintPage;
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.JRXlsExporterParameter;
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;
 private Connection conn;

 /**
  * 在其它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
   ) throws JRException {
  JasperReport jasperReport = null;
  try {
   conn=null;
   String dbsrc="webdb";
   conn=DBConnection.getConnection(dbsrc);
   jasperReport = (JasperReport) JRLoader.loadObject(filePath);
   return JasperFillManager.fillReport(jasperReport, parameter,
     conn);
  } catch (JRException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   if(conn!=null){
    try {
     conn.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     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,String fileName) throws JRException, IOException,
   ServletException {
  servletExportDocument(DocType.PDF, jasperPath, params,
    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,
   String imageUrl) throws JRException, IOException,
   ServletException {
  request.setCharacterEncoding("gb2312");
  response.setContentType("text/html");
//  response.setHeader("Cache-Control","no-cache");
//  response.setHeader("Cache-Control","no-store");
//  response.setDateHeader("Expires", -1);
//  response.setHeader("Pragma","no-cache");
  response.setCharacterEncoding("UTF-8");
  JRAbstractExporter exporter = getJRExporter(DocType.HTML);
  
  
       
  JasperPrint jasperPrint = getJasperPrint(jasperPath, params);
  
  List<JRPrintPage> pages = jasperPrint.getPages();
  if (pages.size() == 0) { 
   // 没有数据  
   response.sendRedirect("/jsp/jasperreport/nodata.jsp");
   return;
  }
        
  PrintWriter out = response.getWriter();
  
  //另一个方法(好像失败了)
//  Map imagesMap = new HashMap();
//        session.setAttribute("IMAGES_MAP", imagesMap);
//  request.getSession().setAttribute("IMAGES_MAP", imagesMap);
//  request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
//  
//  String image_dir_name=request.getSession().getServletContext().getRealPath("/jasperimage");
//  System.out.println("图形文件路径"+image_dir_name);
//  exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR_NAME,image_dir_name );
//  //设置图片请求uri
//  String image_uri=request.getContextPath()+"/jasperimage/";
//  if(!imageUrl.equals("")){
//   image_uri=imageUrl;
//  }
//  exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,image_uri);
  //exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,"/image?flush="+Math.random()+"&image=");
//  //设置导出图片到图片存放的路径
//  exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,Boolean.FALSE);
//  exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR,Boolean.TRUE);
//  
//  
//  exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
//  exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
  exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
     exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image?image");
//  exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); 
  

  //试验代码开始
  Map imagesMap = new HashMap();
  session.setAttribute("IMAGES_MAP", imagesMap);
  exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
  request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);
  exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
  exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
  exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/image?flush="+Math.random()+"&image=");//在web。xml里对应的net.sf.jasperreports.j2ee.servlets.ImageServlet配置路径是"/image"
  exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
  
  //处理分页用?//exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
  //实验代码结束
  
  
  
  exporter.exportReport();
 }

 /**
  * 输出Excel报表文件
  *
  * @param jasperPath
  * @param params
  * @param sourceList
  * @param fileName
  * @throws JRException
  * @throws IOException
  * @throws ServletException
  */
 public void servletExportExcel(String jasperPath, Map params, String fileName) throws JRException, IOException,
   ServletException {
  //servletExportDocument(DocType.XLS, jasperPath, params,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);// 显示边框
  JRAbstractExporter exporter = getJRExporter(DocType.XLS);
  String contentType = "application/vnd.ms-excel";
  response.setContentType(contentType);
  response.setHeader("Content-Disposition", "attachment; filename=\""
    + URLEncoder.encode(fileName+".xls", "UTF-8") + "\"");
  exporter.setParameter(JRExporterParameter.JASPER_PRINT,
    getJasperPrint(jasperPath, params));
  
  exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
   exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE); 
   exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
    
  OutputStream ouputStream = response.getOutputStream();
      
  exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
  exporter.exportReport();
  
 }

 /**
  * 生成不同格式报表文档
  *
  * @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, String fileName) throws JRException,
   IOException, ServletException {

  if (docType == DocType.HTML) {
   servletExportHTML(jasperPath, params, 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,
    getJasperPrint(jasperPath, params));

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值