如何批量将报表导成excel文件并打包下载

来源:互联网 发布:记考勤软件 编辑:程序博客网 时间:2024/04/29 03:41

随着客户需求的不同,对报表的要求不仅要求能在页面上对报表进行查看,也要求报表能在后台批量导出,将批量导出的文件供其他系统或人员使用。常见需求:

1.         项目公司报表导出部分需实现:

a)   能批量导出一个项目公司下的所有报表。

b)   能批量导出所有项目公司的某张报表。

2.    综合报表导出部分需实现:

a)   客户希望能灵活制定某些张报表可批量导出。

b)   可批量导出某个用户下的所有综合报表(不同的用户权限不同可看到的报表也不同)。

c)   可按组织维度批量导出综合报表。比如:可以批量导出按省份分类统计的报表或按业态、按机组等级等维度批量导出。

此功能可分两部分实现:

一:客户自己实现部分,由于客户要想按照自己的需求导出相关报表,比如某公司下所有报表或某人员下所有报表,必然涉及到客户自己的组织机构等,客户可根据自己的组织机构树等查出相关设置,比如公司A下所述报表为 表1,表2,公司B下为表2,表3,则根据该树得到相关报表名称

二:润乾相关代码

<%@ page contentType="text/html;charset=GBK" %>

<%@ page import="java.util.*" %>

<%@ page import="java.io.*" %>

<%@ page import="com.runqian.report4.model.*"%>

<%@ page import="com.runqian.report4.usermodel.*"%>

<%@ page import="com.runqian.report4.util.*" %>

<%@ page import="org.apache.tools.zip.ZipEntry"%>

<%@ page import="org.apache.tools.zip.ZipOutputStream,com.runqian.report4.view.excel.*" %>

<%

       //设置所有report对象的值为GBK转码

       request.setCharacterEncoding("GBK");

     String date1="20101101";

       String date2="20101131";

       //报表起始时间,结束时间,实际应用中从程序中获得

       String raqNames="testexcel,testexcel1";

       //批量导出报表名称,此处可由客户程序传递进来

       String burs="BDP";

       //站名称

              String root = getServletContext().getRealPath("/"); //获得应用根目录

       String fileName = "srbbfx";//定义批量导出压缩包名称

              String txtPath = root+"txtPath\\"+Double.toString(Math.random()*100000000).toString().substring(0,6)+"\\";

              java.io.File file = new java.io.File(txtPath);

              if(!file.exists()) {

                file.mkdirs();

              } else {

              }

       //防止名称冲突,每次导出新建临时文件夹

              String[] raqN=raqNames.split(",");

              String[] bur=burs.split(",");

              //用公共类制作压缩包,应用中导入export.jar

       ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(txtPath+fileName+".zip"));

       //导出时按报表名、站名循环,实际应用中增加时间循环

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

       for(int j=0;j<bur.length;j++){

       String raq=raqN[i]+".raq";//报表名称,以raq结尾

       //第一步,读取报表模板

       InputStream fis=application.getResourceAsStream("/reportFiles/"+raq);

       ReportDefine rd = (ReportDefine)ReportUtils.read( fis );

              //第二步,运算报表

       Context context = new Context();//构建报表环境

       context.setParamValue("date1","20101101");//设置起始时间

       context.setParamValue("date2","20101231");//设置结束时间,实际应用由程序获得或循环取值

//     context.setMacroValue("macro1"," and bur_sta_tel='"+bur[j]+"'");//给润乾宏赋值,每次取相应站数据

       Engine enging = new Engine( rd, context);//构建润乾引擎

       IReport iReport = enging.calc();//计算报表,生成结果文件

                     ExcelReport eReport = new ExcelReport();

       eReport.export("test1",iReport);

       eReport.setFomulaExported(true);

    FileOutputStream fos = new FileOutputStream(txtPath+"b"+raqN[i]+bur[j]+"20101101"+".xls" );

               eReport.saveTo(fos);

              //将导出的txt文件放到待压缩的zip包中

       String filePath=txtPath+"b"+raqN[i]+bur[j]+"20101101"+".xls";

           File f = new File(filePath);

            if(f.exists())

            {   FileInputStream fis1 = new FileInputStream(f);

                ZipEntry ze = new ZipEntry(f.getName());

                zos.putNextEntry(ze);

                int b;

                while((b = fis1.read()) != -1)

                    zos.write(b);

                fis1.close();

            }

   fos.flush();

 fos.close();

                           }

                            }

                             zos.flush();

        zos.close();       

        //判断文件是否存在,设置下等待时间

                file = new java.io.File("txtPath/"+fileName+".zip");

            if(!file.exists()) {

                Thread.sleep(10000);

            }              

                          //将生成的压缩包下载到客户端,此处可自写代码实现,可自增代码将生成的文件删除

                                response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName+".zip"+ "\"");

       try{

 

java.io.OutputStream os = response.getOutputStream();

java.io.FileInputStream fiss = new java.io.FileInputStream(txtPath+fileName+".zip");

byte[] b = new byte[10240];

int i = 0;

while ( (i = fiss.read(b)) > 0 )

{

os.write(b, 0, i);

}

fiss.close();

os.flush();

os.close();

}

catch ( Exception e )

{}

       out.clear(); 

out = pageContext.pushBody(); 

%>

0 0