美文网首页
报表批量导出excel

报表批量导出excel

作者: 勤奋的表妹 | 来源:发表于2019-02-25 11:16 被阅读0次

    需求:多个皕杰报表展示信息导出到一个excel文件夹中。

    解决方案:

    在皕杰报表演示实例5.2提供了批量导出实例(BIOS Server\webapps\iface\report文件夹下的export.jsp和batchExport.jsp)

    export.jsp:提供了3个皕杰报表访问信息、选择导出的excel版本和文件名称的实例。

    export.jsp将导出的信息以规定的格式(rpts=Demo/分组报表/5分组汇总.brt|Demo/参数报表/时间参数.brt^params=year=1997&filetype=xls&filename=myexcel)传递到batchExport.jsp中。

    batchExport.jsp:获取export.jsp传递过来的信息并处理。

    〈%

             //rpts参数格式:a.brt|b.brt^params=p1=val1;p2=val2^vars=v1=val3;v2=val4

             //示例:batchExport.jsp?rpts=Demo/分组报表/5分组汇总.brt|Demo/参数报表/时间参数.brt^params=year=1997&filetype=xls&filename=myexcel

             //这个地方的编码与tomcat的server.xml及report_config.xml中的一致

             request.setCharacterEncoding("UTF-8");

             //获取访问皕杰报表的url(http://localhost:8080/report/ReportEmitter)

             String emitter = request.getScheme()  + "://" + request.getServerName() + ":" +  request.getServerPort() + request.getContextPath() +  "/ReportEmitter";

             //如果前端请求的url是经过javascript的encodeURIComponent函数编码的,获取rpts后应该再用java.net.URLDecoder.decode(rpts,"UTF-8")解码一次

             String rpts =  request.getParameter("rpts");//传递过来的报表信息

             String fileName =  request.getParameter("filename");//导出文件名

             String fileType =  request.getParameter("filetype");//导出格式(xls)

             String sessionId =  request.getSession().getId();

    //将多个报表信息根据“|”拆分(Demo/分组报表/5分组汇总.brt|Demo/参数报表/时间参数.brt^params=year=1997)

             String[] rptArr = rpts.split("\\|");

    // 创建一个Excel文件

                      HSSFWorkbook  wb = new HSSFWorkbook();

                      for  (int i = 0; i < rptArr.length; i++) {

                //拆分报表信息里的报表路径和参数信息和变量信息

                               String[] rptPart =  rptArr[i].split("\\^");

                               try {

                                        //这个地方的编码与tomcat的server.xml及report_config.xml中的一致

                                        String  urlencode = java.net.URLEncoder.encode(rptPart[0],"UTF-8");

                    //遍历参数或变量数组并url转码

                                        for(int  j=1;j

                                                 if("vars".equals(rptPart[1].substring(0,4).toLowerCase())){

                                                          urlencode=  urlencode+"&vars="+java.net.URLEncoder.encode(rptPart[j].substring(5),"UTF-8");

                                                 }else  if("params".equals(rptPart[1].substring(0,6).toLowerCase())){

                                                          urlencode=  urlencode+"¶ms="+java.net.URLEncoder.encode(rptPart[j].substring(7),"UTF-8");

                                                 }

                                        }

                    //创建一个新的url(http://localhost:8080/report/ReportEmitter?rpt=Demo/参数报表/时间参数.brt&params=year=1997)

                                        URL  url = new URL(emitter + "?rpt=" + urlencode +  "&emitter=toobj");

                    //此处的urlConnection对象实际上是根据URL的 请求协议(此处是http)生成的URLConnection类的子类HttpURLConnection,故此处最好将其转化为HttpURLConnection类型的对象

                                        urlc  = (HttpURLConnection) url.openConnection();

                                        // 设定请求的方法为"POST",默认是GET

    urlc.setRequestMethod("GET");

    //设置这个url的cookie

                                        urlc.setRequestProperty("Cookie",  "JSESSIONID="+sessionId);

                    //设定传送的内容类型是流

                                        urlc.setRequestProperty("Content-type",  "application/octet-stream");

                         //获取url的生成的输入流

                                        InputStream  in = urlc.getInputStream();

                    //从已经保存的ReportBean数据输入流创建一个报表运算结果

                                        ReportBean  rptBean = new ReportBean(in);

                    //使用传入POI文档对象,生成Excel

                                        rptBean.toExcel(wb);

    //设置这个excel的sheet页的名称

                                        wb.setSheetName(i,  rptBean.getReportName());

                                        in.close();

                               } catch (Exception e) {

                                        e.printStackTrace();

                               }

                      }

            //输出excel流到页面

                      response.resetBuffer();

           //设置excel名称

                      response.setHeader("Content-Disposition",  "attachment; filename=" + new  String(fileName.getBytes("utf-8"), "ISO8859-1") +  ".xls");

            //设置excel从页面下载

                      response.setContentType("application/x-msdownload;charset=utf-8");

    //创建输出流

                      ServletOutputStream  outStream = response.getOutputStream();

            //excel写入到输出流

                      wb.write(outStream);

                      outStream.flush();

                      outStream.close();

                      outStream  = null;

                      response.flushBuffer();

                      out.clear();

                      out  = pageContext.pushBody();                        

    %>

    相关文章

      网友评论

          本文标题:报表批量导出excel

          本文链接:https://www.haomeiwen.com/subject/tmuwyqtx.html