图表制作软件FineReport教程:[2]批量打印
1、问题描述
若您有很多张模板需要打印,而如果一个一个进行打印的话会比较麻烦,希望批量打印出来。
例如有一张全国销售人员的业绩报表,我传入不同销售人员参数后,批量打印出这些报表。
2、批量打印传入的url格式
批量打印多张报表url格式如:http://localhost:8075/WebReport/ReportServer?reportlets=[{reportlet:'reportname1.cpt',paraname:'paravalue'},{reportlet:'reportname2.cpt',paraname:'paravalue'}]。
调用内置的打印方法直接使用完整的url进行批量打印:
var printurl="http://localhost:8075/WebReport/ReportServer?reportlets=[{reportlet:'reportname1.cpt',paraname:'paravalue'},{reportlet:'reportname2.cpt',paraname:'paravalue'}]";
FR.doURLPDFPrint(printurl,true); //get方式传参
3、如批量打印的模板过多的话,url就很长,而get方式对长度有限制,url过长时会导致打印失败。推荐批量打印的时候用post方式,reportlets参数打包在数据包中传输,不在url中显示,从而缩短url长度,另外安全性较好,如下:
var printurl="http://localhost:8075/WebReport/ReportServer";
var reportlets = FR.cjkEncode("[{reportlet: '/doc/Primary/Parameter/Parameter_1.cpt', 地区 : '华东'}, {reportlet: '/doc/Primary/Parameter/Parameter_1.cpt', 地区 : '华北'}]");
var config = {
url : printurl,
isPopUp : false,
data : {
reportlets: reportlets
}
};
FR.doURLPDFPrint(config);
注:调用打印方法中的第二个参数为true表示弹出对话框,为false表示不弹出对话框即静默打印。
4、示例
如需要打印出某个模板所有参数情况对应的结果,如下图,选择希望打印的参数值,点击doPrint按钮批量打印出对应的结果。
5、实现思路
首先通过JS获取复选框的值然后拼凑出正确的url,最后调用打印方法如PDF打印,通过post方法传参(FR.doURLPDFPrint(printurl,true,{data: {reportlets : paravalue}});)或get方法传参(FR.doURLPDFPrint(printurl,true);)进行批量打印。
6、post传参PDF打印完整代码
<html>
<head>
<title>FineReport Demo</title>
<script type="text/javascript" src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script>
<link rel="stylesheet" type="text/css" href="/WebReport/ReportServer?op=emb&resource=finereport.css"/>
<script type="text/javascript">
function doPrint(){ //通过sessionid打印
var printurl="http://localhost:8075/WebReport/ReportServer";
var p=[];
//获取当前页面选中的参数值,并将值放入数组中
$(":checkbox").each(function(){
if($(this).attr("checked")=="checked")
p.push("{reportlet: '/doc/Primary/Parameter/Parameter_1.cpt', 地区 : " + $(this).val() + "}");
})
if(p.length>0){
//将参数值组成的数组转化为字符串
var rp=p.join(",");
//使用FineReport自带的方法cjkEncode进行转码
var reportlets=FR.cjkEncode("["+rp+"]");
var config = {
url : printurl,
isPopUp : false,
data : {
reportlets: reportlets
}
};
FR.doURLPDFPrint(config); }
else
alert("请选择需要打印的参数");
}
</script>
</head>
<body>
<form name="report
<input id="config1" type="checkbox" value="华东" />华东<br>
<input id="config2" type="checkbox" value="华北" />华北<br>
<input type="button" onClick="doPrint();" value="doPrint"><br>
</form>
<body>
</html>
7、效果查看
打开内置服务器,选中多个复选框,点击doprint按钮,既可以实现批量打印了。
1、问题描述
在批量预览或者批量打印报表时会发现报表页码是累加的,因为这些报表是独立的没有什么关联的进行批量预览或批量打印只是为了节省工作,不用一个一个预览模板或者打印模板,因此希望页码是这些报表的页面是独立的。
2、解决方案
在批量打印的URL后增加&__cumulatepagenumber__=false即可。
3、示例
如:批量打印或预览两个报表模板时,即打印或预览第二张模板时,页码仍从第一页开始。
4、 各报表设置打印显示的页数
如:k1.cpt,除了报表内容外,再任意单元格处,输入公式:显示当前页与总页数。例如,如下样式:
5、如:k2.cpt,同上。如下:
若两张模板均放置在reportlets下,URL中的输入地址如下。
6、预览效果
不累加页码效果
如:启动我们的内置服务器,预览这两张模板,URL中输入http://localhost:8075/WebReport/ReportServer?reportlets=({reportlet:/k1.cpt},{reportlet:/k2.cpt})&__cumulatepagenumber__=false
预览,效果如下:
第一个模板(k1.cpt)的第一页,如下:
7、第一个模板(k1.cpt)的第三页,如下:
8、第二个模板(k2.cpt)为第四页内容,显示如下:
如上看出,就是第二个模板的页码,仍从第一页开始。
9、累加页码效果
而地址栏后面不加&__cumulatepagenumber__=false ,其效果是页码累加的效果,如下:
第一个模板(k1.cpt)的每页内容的当前页还是如上效果,而总页数变为4。
第二个模板(k2.cpt)为第四页的内容,显示如下:
查看到,第二个模板的页码,是累加其第一个模板的页码的,就不是从第一页开始重新计算当前第二个模板页码的。