Java报表

  iReport是用于定义JasperReport报表的可视化工具,JasperReport使用XML来定义一个报表的结构。 

一、安装 
   下载地址:http://www.jaspersoft.com/ir_opensource_download.html 
   下载iReport-3.0.0-windows-installer.exe,按提示执行默认安装。 

使用jasperreport生成报表 (一) 

/**  

     * 生成不同格式报表文档   
     *    
     * @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导出生成文件 
Java代码 
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配置 
Xml代码 
<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.调用 
Js代码 
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;   
}  
Html代码 
报表类型   
<select   name = "reportType"   id = "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> &nbsp;   
<button   onclick = "jasperReport($('reportType').value);" > Reports </button>   
 
5.直接生成文件 
Java代码 
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" );   
         }      

}  


使用jasperreport生成报表 (二)

关键字: jasperreport 
1.ReportUtils.java通用类 
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) {   
                }   
            }   
        }   
    }   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值