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