自定义批量导出实现全过程

我是社区第56792位番薯,欢迎点我头像关注我哦~
本帖最后由 jy210355 于 2015-12-22 17:15 编辑

前言:在做项目的时候,需要用到批量导出报表的功能,虽然帮助文档中有例子,但自己要做出来还是会花费点时间的。最想吐槽的是,当要导出的模板有多个,参数值也很多的时候,例子中的方法就不奏效啦。那我该怎么去实现用户的这个需求呢,笔者将制作自定义导出功能的全过程分享出来,希望对有相同需求的帆薯们能有所帮助。
第一回:
有一张带参数的模板需要导出所有参数值的报表,并且输出格式为WORD。
我找了帮助文档,查到了一篇《自定义批量导出》,仔细研读了一番,发现这正是我想要的。用下面的句式:
再加上一句window.open(url);
就可以批量导出报表啦。
第二回:
但是我的参数值有几十个,我不能一个一个都写进去啊,于是我参照了在线培训课程《1.15FineReport打印专题》(22分50秒)中,有一段程序可以将多个模板拼接起来:
P.push('{reportlet:/主变压器输出表.cpt,ProCode:'+procodevalue+',SubName:'+encodeURIComponent(FR.cjkEncode(subnamevalue))+'}');
//将参数值组成的数组转化为字符串
      var rp=P.join(",");
但是这里面的subnamevalue,也就是多个参数值该如何获得呢?我又参考了帮助文档中的《下拉复选框默认选中全部值》中的方法,例子里是这么写的:
“在属性表>基本属性>控件值中选择公式,并在公式中输入:sql("FRDemo","select distinct(雇员ID) from 雇员",1)//通过sql从数据库中取出雇员ID即下拉框的实际值”
按照上述方法完善程序后,就可以实现批量导出啦!
第三回:
但是,后来用户又增加表了,这下需求变成了三张带参数的模板批量导出到一个WORD中。好在,这三张模板的参数是共用的。于是,我就按照上面的方法,把另外两张模板添加进去。心想改起来挺容易的么。可是,结果却发现无法打开页面,导不出来了。
我开始一个模板一个模板的测试,发现语法上是没有问题的。后来我就改循环次数,从1开始循环,结果发现当循环次数增大到某一个值后就无法导出了。
后来,我在QQ上找了技术支持,他解释说,url的长度是受浏览器限制的,因为拼接的url太长了,所以导不出了。
他建议我用POST方法,也就是上面培训视频中批量打印的两种方法之一POST传参方法,这个是不会影响URL的长度的。
但,后来经技术支持本人测试后发现,这个POST方法没法用在批量导出上,具体原因不清楚。
最后他建议我采用表单的方法,并给了我一个例子。
var form =$("<form>");   //定义一个form表单
            form.attr('style','display:none');   //在form表单中添加查询参数
            form.attr('target', '');
            form.attr('method', 'post');
            form.attr('action',"http://localhost:8075/WebReport/ReportServer");
            var input1 = $('<input>');
            input1.attr('type', 'hidden');
            input1.attr('name', 'reportlets');
            input1.attr('value',FR.cjkEncode("({reportlet:GettingStarted.cpt,地区:华东},{reportlet:GettingStarted.cpt,地区:华北},{reportlet:GettingStarted.cpt,地区:华北},{reportlet:GettingStarted.cpt,地区:华北},{reportlet:GettingStarted.cpt,地区:华北},{reportlet:GettingStarted.cpt,地区:华北},{reportlet:GettingStarted.cpt,地区:华北})"));   
            var input2 = $('<input>');
            input2.attr('type', 'hidden');
            input2.attr('name', 'op');
            input2.attr('value', 'export');
            var input3 = $('<input>');
            input3.attr('type', 'hidden');
            input3.attr('name', 'format');
            input3.attr('value', 'word');
            var input4 = $('<input>');
            input4.attr('type', 'hidden');
            input4.attr('name','__filename__');
            input4.attr('value', 'aaa');
            $('body').append(form);   
            form.append(input1);  
         form.append(input2);
          form.append(input3);
         form.append(input4);
            form.submit();
我照着例子修改了我的JS,经过大半天的调试,终于可以实现批量导出了!
内容较多,就不贴源码了,有需要的帆薯可以回复我,发模板给你们。
最后非常感谢技术支持对我的指导和帮助!
参与人数 +2 F豆 +201 理由
windy_gui + 1 很给力!
传说哥 + 200 赞一个!

查看全部评分

发表于 2015-12-15 16:03:16
感谢楼主分享
发表于 2015-12-15 16:21:47
感谢楼主分享,能不能把模板发我一下liuys2008@163.com.  谢谢啦!
发表于 2015-12-15 16:24:09
感谢楼主,需要您的模板和源码
发表于 2015-12-22 14:01:24
我的邮箱:lxc009@126.com
发表于 2015-12-23 13:46:06
谢谢啊,谢谢啊
发表于 2016-1-17 11:31:01
点赞!!!支持!!!
发表于 2016-5-19 21:24:18
真是会研究啊。
发表于 2016-6-21 20:34:50
这个批量导出是可以,不过表格内容多的话,格式有点问题呀。
发表于 2016-6-25 16:33:09
好的。好的。好的。好的。好的。好的。
发表于 2016-8-5 15:12:09
已按此方法实现功能,感谢楼主分享。
发表于 2016-8-8 08:16:42
有问题,有总结  棒!
发表于 2016-8-8 10:15:38
感谢楼主共享,高,实在是高
发表于 2016-10-18 13:17:52
6666666666666666666666666
发表于 2016-10-18 13:25:30
感谢楼主共享,高,实在是高
发表于 2016-11-21 21:43:50
批量导出的时候,楼主有没有研究 动态修改 sheet的名字?没有这方面的需求吗?
发表于 2016-11-27 10:08:31
okokokok
发表于 2016-12-2 16:29:03
学习一下
发表于 2017-5-19 12:32:43
楼主,我现在也有类似需求;就是把参数里每个参数都导出来,每个参数生成一个excel; 我的邮箱是810629842@qq.com
发表于 2017-5-20 09:13:54
正需要,学习中
发表于 2018-12-24 08:22:54
@jy210355 大神,这个代码咋9.0 版本不灵, 在8.0 版本是可以的。哪里还需要修改一下?
发表于 2019-1-23 15:33:15
谢谢分享
发表于 2020-3-24 15:10:58
楼主求帮助呀
发表于 2020-3-24 15:11:58
楼主我按照这个方法,为什么会报找不到模板的错不,急求帮助啊
发表于 2023-1-4 22:30:33
111111
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

25回帖数 1关注人数 16558浏览人数
最后回复于:2023-8-26 19:36

返回顶部 返回列表