自定义批量导出实现全过程
本帖最后由 jy210355 于 2015-12-22 17:15 编辑
前言:在做项目的时候,需要用到批量导出报表的功能,虽然帮助文档中有例子,但自己要做出来还是会花费点时间的。最想吐槽的是,当要导出的模板有多个,参数值也很多的时候,例子中的方法就不奏效啦。那我该怎么去实现用户的这个需求呢,笔者将制作自定义导出功能的全过程分享出来,希望对有相同需求的帆薯们能有所帮助。第一回:有一张带参数的模板需要导出所有参数值的报表,并且输出格式为WORD。我找了帮助文档,查到了一篇《自定义批量导出》,仔细研读了一番,发现这正是我想要的。用下面的句式:url=http://localhost:8075/WebReport/ReportServer?reportlets=({reportlet:/doc/reportname.cpt,paraname1:paravalue1,paraname2:paravalue2,...},{reportlet:/doc/reportname.cpt,paraname1:paravalue1,paraname2:paravalue2,...},{...})&format=XX;再加上一句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.attr('style','display:none'); //在form表单中添加查询参数 form.attr('target', ''); form.attr('method', 'post'); form.attr('action',"http://localhost:8075/WebReport/ReportServer"); var input1 = $(''); 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 = $(''); input2.attr('type', 'hidden'); input2.attr('name', 'op'); input2.attr('value', 'export'); var input3 = $(''); input3.attr('type', 'hidden'); input3.attr('name', 'format'); input3.attr('value', 'word'); var input4 = $(''); 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,经过大半天的调试,终于可以实现批量导出了!内容较多,就不贴源码了,有需要的帆薯可以回复我,发模板给你们。最后非常感谢技术支持对我的指导和帮助!