使用jasperreport生成报表


1.ReportUtils.java通用类 
Java代码   收藏代码
  1. /** 
  2.  * 使用jasperReport做报表时的工具支持类.有两个用途,生成jasperPrint对象,和设置导出时的session 
  3.  */  
  4. public class ReportUtils {  
  5.     private HttpServletRequest request;  
  6.     private HttpServletResponse response;  
  7.     private HttpSession session;  
  8.   
  9.     public ReportUtils(HttpServletRequest request, HttpServletResponse response) {  
  10.         this.request = request;  
  11.         this.session = request.getSession();  
  12.         this.response = response;  
  13.     }  
  14.   
  15.     /** 
  16.      * 获得JasperPrint对象;自定义填充报表时的parameter和dataSource. 参数说明和动态表头的用法参考上一方法 
  17.      */  
  18.     public JasperPrint getJasperPrint(String filePath, Map parameter,  
  19.             JRDataSource dataSource) throws JRException {  
  20.         JasperReport jasperReport = null;  
  21.         try {  
  22.             jasperReport = (JasperReport) JRLoader.loadObject(filePath);  
  23.             return JasperFillManager.fillReport(jasperReport, parameter,  
  24.                     dataSource);  
  25.         } catch (JRException e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.         return null;  
  29.     }  
  30.   
  31.     /** 
  32.      * 获得JasperPrint对象;自定义填充报表时的parameter和connection 
  33.      */  
  34.     public JasperPrint getJasperPrint(String filePath, Map parameter,  
  35.             Connection  conn) throws JRException {  
  36.         JasperReport jasperReport = null;  
  37.         try {  
  38.             jasperReport = (JasperReport) JRLoader.loadObject(filePath);  
  39.             return JasperFillManager.fillReport(jasperReport, parameter,  
  40.                     conn);  
  41.         } catch (JRException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.         return null;  
  45.     }  
  46.       
  47.     /** 
  48.      * 通过传入List类型数据源获取JasperPrint实例 
  49.      */  
  50.     public JasperPrint getPrintWithBeanList(String filePath, Map parameter,  
  51.             List list) throws JRException {  
  52.         JRDataSource dataSource = new JRBeanCollectionDataSource(list);  
  53.         return getJasperPrint(filePath, parameter, dataSource);  
  54.     }  
  55.   
  56.     /** 
  57.      * 传入类型,获取输出器 
  58.      *  
  59.      * @param docType 
  60.      * @return 
  61.      */  
  62.     public JRAbstractExporter getJRExporter(DocType docType) {  
  63.         JRAbstractExporter exporter = null;  
  64.         switch (docType) {  
  65.         case PDF:  
  66.             exporter = new JRPdfExporter();  
  67.             break;  
  68.         case HTML:  
  69.             exporter = new JRHtmlExporter();  
  70.             break;  
  71.         case XLS:  
  72.             exporter = new JExcelApiExporter();  
  73.             break;  
  74.         case XML:  
  75.             exporter = new JRXmlExporter();  
  76.             break;  
  77.         case RTF:  
  78.             exporter = new JRRtfExporter();  
  79.             break;  
  80.         case CSV:  
  81.             exporter = new JRCsvExporter();  
  82.             break;  
  83.         case TXT:  
  84.             exporter = new JRTextExporter();  
  85.             break;  
  86.         }  
  87.         return exporter;  
  88.     }  
  89.   
  90.     /** 
  91.      * 获得相应类型的Content type 
  92.      * @param docType 
  93.      * @return 
  94.      */  
  95.     public String getContentType(DocType docType){  
  96.         String contentType="text/html";  
  97.         switch(docType){  
  98.         case PDF:  
  99.             contentType = "application/pdf";  
  100.             break;  
  101.         case XLS:  
  102.             contentType = "application/vnd.ms-excel";  
  103.             break;  
  104.         case XML:  
  105.             contentType = "text/xml";  
  106.             break;  
  107.         case RTF:  
  108.             contentType = "application/rtf";  
  109.             break;  
  110.         case CSV:  
  111.             contentType = "text/plain";  
  112.             break;  
  113.         }  
  114.         return contentType;  
  115.     }  
  116.   
  117.     public void setAttrToPage(JasperPrint jasperPrint, String report_fileName,  
  118.             String report_type) {  
  119.         session.setAttribute("REPORT_JASPERPRINT", jasperPrint);  
  120.         session.setAttribute("REPORT_FILENAME", report_fileName);  
  121.         session.setAttribute("REPORT_TYPE", report_type);  
  122.     }  
  123.   
  124.     /** 
  125.      * 定义了报表输出类型,固定了可输出类型 
  126.      */  
  127.     public static enum DocType {  
  128.         PDF, HTML, XLS, XML, RTF, CSV, TXT  
  129.     }  
  130.   
  131.     /** 
  132.      * 编译报表模板文件jrxml,生成jasper二进制文件 
  133.      *  
  134.      * @param jrxmlPath 
  135.      * @param jrsperPath 
  136.      * @throws JRException 
  137.      */  
  138.     public void complieJrxml(String jrxmlPath, String jasperPath)  
  139.             throws JRException {  
  140.         JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);  
  141.     }  
  142.   
  143.     /** 
  144.      * 输出html静态页面,必须注入request和response 
  145.      *  
  146.      * @param jasperPath 
  147.      * @param params 
  148.      * @param sourceList 
  149.      * @param imageUrl 
  150.      *            报表文件使用的图片路径,比如 ../servlets/image?image= 
  151.      * @throws JRException 
  152.      * @throws IOException 
  153.      * @throws ServletException 
  154.      */  
  155.     public void servletExportHTML(String jasperPath, Map params,  
  156.             List sourceList, String imageUrl) throws JRException, IOException,  
  157.             ServletException {  
  158.         response.setContentType("text/html");  
  159.         response.setCharacterEncoding("UTF-8");  
  160.         JRAbstractExporter exporter = getJRExporter(DocType.HTML);  
  161.   
  162.         JasperPrint jasperPrint = getPrintWithBeanList(jasperPath, params,  
  163.                 sourceList);  
  164.   
  165.         session.setAttribute(  
  166.                 ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,  
  167.                 jasperPrint);  
  168.   
  169.         PrintWriter out = response.getWriter();  
  170.   
  171.         exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
  172.         exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);  
  173.         exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);  
  174.         exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px  
  175.         exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);  
  176.         exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");   
  177.   
  178.         exporter.exportReport();  
  179.     }  
  180.   
  181.     /** 
  182.      * 输出html静态页面,必须注入request和response 
  183.      *  
  184.      * @param jasperPath 
  185.      * @param params 
  186.      * @param sourceList 
  187.      * @param imageUrl 
  188.      *            报表文件使用的图片路径,比如 ../servlets/image?image= 
  189.      * @throws JRException 
  190.      * @throws IOException 
  191.      * @throws ServletException 
  192.      */  
  193.     public void servletExportHTML(String jasperPath, Map params,  
  194.             Connection conn, String imageUrl) throws JRException, IOException,  
  195.             ServletException {  
  196.         response.setContentType("text/html");  
  197.         response.setCharacterEncoding("UTF-8");  
  198.         JRAbstractExporter exporter = getJRExporter(DocType.HTML);  
  199.   
  200.         JasperPrint jasperPrint = getJasperPrint(jasperPath, params,  
  201.                 conn);  
  202.   
  203.         session.setAttribute(  
  204.                 ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,  
  205.                 jasperPrint);  
  206.   
  207.         PrintWriter out = response.getWriter();  
  208.   
  209.         exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
  210.         exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);  
  211.         exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);  
  212.         exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px  
  213.         exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);  
  214.   
  215.         exporter.exportReport();  
  216.     }  
  217.   
  218.     /** 
  219.      * 生成不同格式报表文档 
  220.      *  
  221.      * @param docType 
  222.      *            文档类型 
  223.      * @param jasperPath 
  224.      */  
  225.     public void servletExportDocument(DocType docType, String jasperPath,  
  226.             Map params, List sourceList, String fileName) throws JRException,  
  227.             IOException, ServletException {  
  228.   
  229.         if (docType == DocType.HTML) {  
  230.             servletExportHTML(jasperPath, params, sourceList, fileName);  
  231.             return;  
  232.         }  
  233.   
  234.         JRAbstractExporter exporter = getJRExporter(docType);  
  235.         // 获取后缀  
  236.         String ext = docType.toString().toLowerCase();  
  237.   
  238.         if (!fileName.toLowerCase().endsWith(ext)) {  
  239.             fileName += "." + ext;  
  240.         }  
  241.         // 判断资源类型  
  242.         if (ext.equals("xls")) {  
  243.             // 要想获得更好的视觉效果,可以添加以下代码  
  244.              exporter.setParameter(  
  245.              JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,  
  246.              Boolean.TRUE); // 删除记录最下面的空行  
  247.               
  248.              exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,  
  249.              Boolean.FALSE);// 删除多余的ColumnHeader  
  250.               
  251.              exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND  
  252.              , Boolean.FALSE);// 显示边框  
  253.         }  
  254.   
  255.         response.setContentType(getContentType(docType));  
  256.         response.setHeader("Content-Disposition""attachment; filename=\""  
  257.                 + URLEncoder.encode(fileName, "UTF-8") + "\"");  
  258.   
  259.         exporter.setParameter(JRExporterParameter.JASPER_PRINT,  
  260.                 getPrintWithBeanList(jasperPath, params, sourceList));  
  261.           
  262.         OutputStream outStream = null;  
  263.         PrintWriter outWriter = null;  
  264.           
  265.         if(ext.equals("csv")){//解决中文乱码问题  
  266.             response.setCharacterEncoding("GBK");  
  267.             outWriter = response.getWriter();  
  268.             exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);  
  269.         }else{  
  270.             outStream = response.getOutputStream();  
  271.             exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);  
  272.             if(ext.equals("txt")){  
  273.                 exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));  
  274.                 exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));  
  275.                 exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");  
  276.             }  
  277.         }  
  278.         try {  
  279.             exporter.exportReport();  
  280.         } catch (JRException e) {  
  281.             throw new ServletException(e);  
  282.         } finally {  
  283.             if (outStream != null) {  
  284.                 try {  
  285.                     outStream.close();  
  286.                 } catch (IOException ex) {  
  287.                 }  
  288.             }  
  289.         }  
  290.     }  
  291.   
  292.     /** 
  293.      * 生成不同格式报表文档 
  294.      *  
  295.      * @param docType 
  296.      *            文档类型 
  297.      * @param jasperPath 
  298.      */  
  299.     public void servletExportDocument(DocType docType, String jasperPath,  
  300.             Map params, Connection conn, String fileName) throws JRException,  
  301.             IOException, ServletException {  
  302.   
  303.         if (docType == DocType.HTML) {  
  304.             servletExportHTML(jasperPath, params, conn, fileName);  
  305.             return;  
  306.         }  
  307.   
  308.         JRAbstractExporter exporter = getJRExporter(docType);  
  309.         // 获取后缀  
  310.         String ext = docType.toString().toLowerCase();  
  311.   
  312.         if (!fileName.toLowerCase().endsWith(ext)) {  
  313.             fileName += "." + ext;  
  314.         }  
  315.         // 判断资源类型  
  316.         if (ext.equals("xls")) {  
  317.             // 要想获得更好的视觉效果,可以添加以下代码  
  318.              exporter.setParameter(  
  319.              JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,  
  320.              Boolean.TRUE); // 删除记录最下面的空行  
  321.               
  322.              exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,  
  323.              Boolean.FALSE);// 删除多余的ColumnHeader  
  324.               
  325.              exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND  
  326.              , Boolean.FALSE);// 显示边框  
  327.         }  
  328.   
  329.         response.setContentType(getContentType(docType));  
  330.         response.setHeader("Content-Disposition""attachment; filename=\""  
  331.                 + URLEncoder.encode(fileName, "UTF-8") + "\"");  
  332.   
  333.         exporter.setParameter(JRExporterParameter.JASPER_PRINT,  
  334.                 getJasperPrint(jasperPath, params, conn));  
  335.           
  336.         OutputStream outStream = null;  
  337.         PrintWriter outWriter = null;  
  338.           
  339.         if(ext.equals("csv")){//解决中文乱码问题  
  340.             response.setCharacterEncoding("GBK");  
  341.             outWriter = response.getWriter();  
  342.             exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);  
  343.         }else{  
  344.             outStream = response.getOutputStream();  
  345.             exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);  
  346.             if(ext.equals("txt")){  
  347.                 exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));  
  348.                 exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));  
  349.                 exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");  
  350.             }  
  351.         }  
  352.         try {  
  353.             exporter.exportReport();  
  354.         } catch (JRException e) {  
  355.             throw new ServletException(e);  
  356.         } finally {  
  357.             if (outStream != null) {  
  358.                 try {  
  359.                     outStream.close();  
  360.                 } catch (IOException ex) {  
  361.                 }  
  362.             }  
  363.         }  
  364.     }  
  365.   
  366. }  


2.用Servlet导出生成文件 
Java代码   收藏代码
  1. public class JapserReportServlet extends HttpServlet{  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.     public void init(){}  
  5.       
  6.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{  
  7.         String docType = request.getParameter("docType");  
  8.         String jasperFile = request.getParameter("jasperFile");  
  9.         String isBean = request.getParameter("isBean");//数据提供方式  
  10.           
  11.         String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");  
  12.         //jasper文件放在应用根目录的reports中  
  13.         String jasperPath = request.getSession().getServletContext().getRealPath("/") + "/reports/"+ jasperFile;  
  14.           
  15.         if(StringUtils.isNotEmpty(jasperPath)){  
  16.   
  17.             if(StringUtils.isEmpty(fileName)){  
  18.                 fileName = "报表";  
  19.             }  
  20.               
  21.             ReportUtils jasperReport = new ReportUtils(request,response);  
  22.   
  23.             //传递报表中(SQL)用到的参数值:$P{ProjectName}  
  24.             Map params = new HashMap();  
  25.             //"Name"是报表中定义过的一个参数名称,其类型为String 型   
  26.             //params.put("ProjectName", new String("Project1"));  
  27.   
  28.             try {  
  29.                 if(isBean.equals("1")){  
  30.                     jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getSourceList(), fileName);  
  31.                 }else{  
  32.                     jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getConnection(), fileName);  
  33.                 }  
  34.               
  35.             } catch (JRException e) {  
  36.                 e.printStackTrace();  
  37.             } catch (ServletException e) {  
  38.                 e.printStackTrace();  
  39.             }  
  40.         }else{  
  41.             response.setCharacterEncoding("UTF-8");  
  42.             response.sendError(-1"出错:jasperPath参数是必须的!");  
  43.         }  
  44.     }  
  45.       
  46.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{         
  47.         this.doGet(request, response);                
  48.     }   
  49.       
  50.     public void destroy() {         
  51.         super.destroy();          
  52.     }  
  53.       
  54.     public static DocType getEnumDocType(String docType){  
  55.         DocType type = DocType.HTML;  
  56.         docType = docType.toUpperCase();  
  57.         if(docType.equals("PDF")){  
  58.             type = DocType.PDF;  
  59.         }else if(docType.equals("XLS")){  
  60.             type = DocType.XLS;  
  61.         }else if(docType.equals("XML")){  
  62.             type = DocType.XML;  
  63.         }else if(docType.equals("RTF")){  
  64.             type = DocType.RTF;  
  65.         }else if(docType.equals("CSV")){  
  66.             type = DocType.CSV;  
  67.         }else if(docType.equals("TXT")){  
  68.             type = DocType.TXT;  
  69.         }  
  70.         return type;  
  71.     }  
  72.       
  73.     /***数据对象****/  
  74.     public static List getSourceList(){  
  75.         List<TUser> sourceList = new ArrayList<TUser>();// 测试数据源  
  76.         for (int i = 0; i < 15; i++) {  
  77.             TUser user = new TUser();  
  78.             user.setId(1000 + i);  
  79.             user.setUsername("user_" + i);  
  80.             user.setPassword("*******");  
  81.             sourceList.add(user);  
  82.         }  
  83.         return sourceList;  
  84.     }  
  85.       
  86.     /****数据库连接****/  
  87.     public static Connection getConnection() {  
  88.         Connection conn = null;  
  89.         String driver = "com.mysql.jdbc.Driver";  
  90.         String url = "jdbc:mysql://127.0.0.1/springapp?useUnicode=true&characterEncoding=gb2312";  
  91.         try {  
  92.             Class.forName(driver);  
  93.             conn = DriverManager.getConnection(url,"root""root");  
  94.             return conn;  
  95.         } catch (ClassNotFoundException e) {  
  96.             e.printStackTrace();  
  97.         } catch (SQLException ex) {  
  98.             ex.printStackTrace();  
  99.         }  
  100.         return null;  
  101.     }  
  102. }  


3.web.xml中的Servlet配置 
Xml代码   收藏代码
  1. <servlet>  
  2.        <servlet-name>JapserReportServlet</servlet-name>  
  3.        <servlet-class>  
  4.            com.logcd.servlet.JapserReportServlet  
  5.        </servlet-class>  
  6.    </servlet>  
  7.    <servlet-mapping>  
  8.        <servlet-name>JapserReportServlet</servlet-name>  
  9.        <url-pattern>/reports</url-pattern>  
  10.    </servlet-mapping>  


4.调用 
Js代码   收藏代码
  1. function jasperReport(docType){  
  2.     var jasperFile = "Regist_User_Group.jasper";  
  3.     var paramStr = "?docType=" + docType + "&jasperFile="+jasperFile + "&fileName=" +'人员名单列表' + "&isBean=0";  
  4.     var url = getCurrentDirectory() + "/reports" + paramStr;  
  5.     window.open(url);  
  6. }  
  7.   
  8. /***获取当前路径***/  
  9. function getCurrentDirectory(){  
  10.     var locHref = location.href;  
  11.     var locArray = locHref.split("/");  
  12.     delete locArray[locArray.length-1];  
  13.     var dirStr = locArray.join("/");  
  14.     return dirStr;  
  15. }  


Html代码   收藏代码
  1. 报表类型  
  2. <select name="reportType" id="reportType">  
  3.      <option value="html">HTML</option>  
  4.      <option value="pdf">PDF</option>  
  5.      <option value="rtf">RTF</option>  
  6.      <option value="xls">XLS</option>  
  7.      <option value="xml">XML</option>  
  8.      <option value="csv">CSV</option>  
  9.      <option value="txt">TXT</option>  
  10.    </select>&nbsp;  
  11. <button onclick="jasperReport($('reportType').value);">Reports</button>  

5.直接生成文件 
Java代码   收藏代码
  1. public class FirstJasperReports {  
  2.      static String fileName="E:/workspace/js_test/jrxml/HelloWorld.jrxml";  
  3.         public static void main(String[] args)throws Exception{  
  4.             long startTime=System.currentTimeMillis();  
  5.             //将报表的定义文件HelloWorld.jrxml编译成HelloWorld.jasper文件  
  6.             String jasperFile=JasperCompileManager.compileReportToFile(fileName);  
  7.             //向HelloWorld.jasper文件中填充数据,这一步将生产出HelloWorld .jrprint文件  
  8.             String jrprintFile=JasperFillManager.fillReportToFile(jasperFile,null,new JREmptyDataSource());  
  9.             //将.jrprint文件转换成HTML格式  
  10.             JasperExportManager.exportReportToHtmlFile(jrprintFile);  
  11.             //将.jrprint文件转换成PDF格式  
  12.               
  13.             //JasperExportManager.exportReportToPdfFile(jrprintFile);  
  14.             //将.jrprint文件转换成XML格式  
  15.             JasperExportManager.exportReportToXmlFile(jrprintFile,false);  
  16.             //将.jrprint文件转换成XLS格式(即Excel文件),需要用到POI类库.  
  17.             File sourceFile = new File(jrprintFile);  
  18.             JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(sourceFile);  
  19.             File destFile = new File(sourceFile.getParent(), jasperPrint.getName() + ".xls");  
  20.             JRXlsExporter exporter = new JRXlsExporter();  
  21.             exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
  22.             exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, destFile.toString());  
  23.             exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);  
  24.             exporter.exportReport();  
  25.             long endTime=System.currentTimeMillis();  
  26.             long time=(endTime-startTime)/1000;  
  27.             System.out.println("success with "+time+" s");  
  28.          }  
  29.   
  30. }  
  • jxl.jar (708.2 KB)
  • 下载次数: 132

猜你喜欢

转载自blog.csdn.net/napoleonjk/article/details/49362461