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" > <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 >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"); } }
最後更新:2017-04-02 18:44:44