反馈已提交

网络繁忙

当前为10.0版本文档,只有最新版本的文档支持在线编辑修改,如果想创建/编辑文档,请移步至 最新版帮助文档

批量打印

  • 文档创建者:文档助手1
  • 历史版本:30
  • 最近更新:Suki陈 于 2023-02-08
  • 1. 概述

    1.1 版本

    报表服务器版本
    10.0

    1.2 预期效果

    对于多张模板,用户希望一键打印出来。

    对于动态参数模板,用户希望一键打印不同参数值时的报表。

    例如有一张全国销售人员的业绩报表,传入不同地区参数后,批量打印出这些报表。如下图所示:

    2020-08-26_16-42-27.gif

    1.3 实现思路

    使用 JavaScript 调用 FineReport 的打印接口 FR.doURLPrint(config) 来批量打印报表。

    2. 接口简介

    FR.doURLPrint(config)打印接口内容可参考文档 JS调用FR打印接口 第 2 章

    实现批量打印需要对接口中 data 参数进行设置。data参数形式:

    data: {
    reportlets: "[{reportlet: 'reportname1.cpt',param1: 'value1',param2: 'value2'},
    {reportlet: 'reportname2.cpt',param3: 'value3',param4: 'value4}]"
    }

    注:其中“[]”中的内容对应需要打印的内容,一个“{}”对应一个模板,“{}”中内容用“,”隔开,顺序依次为模板名称、模板中参数名称,若有多个参数也用","隔开。

    举例给出不同应用场景下对应的设置:

    1)打印同一个模板,传入模板的参数不同

    "[{reportlet: 'GettingStarted.cpt',地区: '华北'}, 
    {reportlet: 'GettingStarted.cpt', 地区: '华东'}]"

    2)打印多个模板,传入的模板名称不同

    "[{reportlet: 'GettingStarted001.cpt',地区: '华北'}, 
    {reportlet: 'GettingStarted002.cpt', 地区: '华东'}]"

    3)打印同一个模板,传入两个参数

    "[{reportlet: 'GettingStarted.cpt',地区: '华北',销售员: '孙林'}, 
    {reportlet: 'GettingStarted.cpt', 地区: '华东',销售员: '张珊'}]"

    3. 示例一:JS实现本地批量打印

    3.1 模板准备

    3.1.1 新建数据集

    新建普通报表,新建数据集 ds1:

    select 地区 from 销量

    3.1.2  设置参数复选框按钮

    将地区字段拖入 A2 单元格,选中 A2 单元格,点击「单元格属性」>「高级」按钮,自定义显示值,如下图所示:

    自定义显示值内容:

    '<input id="config1" type="checkbox" value="'+$$$+'" checked />'+$$$

    注:checked 代表初始化时参数复选框默认全选,如果不需要被选中,去掉此参数。

    2020-08-26_17-29-06.png

    为了将 A2 显示成复选框样式,还需要将其样式设计成「用 HTML 显示内容」。

    选中 A2 单元格,点击「单元格属性>其他」,设置显示内容为「用 HTML 显示内容」,如下图所示:

    2020-08-26_17-37-04.png

    3.1.3 设置按钮控件

    选中 A4 单元格,点击「控件」,设置为「按钮控件」。

    按钮类型为「普通」,按钮名字为「批量打印」,如下图所示:

    2020-08-26_17-40-11.png

    3.2 设置批量打印 JS 事件

    选中 A4 单元格,点击「控件」>「事件」,添加「点击事件」,输入 JavaScript 代码,如下图所示:

    2020-08-26_17-46-29.png

    JavaScript 代码如下:

    var printurl = "http://localhost:8075/webroot/decision/view/report";
    var p = [];
    //获取当前页面选中的参数值,并将值放入数组中  
    $(":checkbox").each(function() {
    if ($(this).attr("checked") == "checked")
    p.push("{reportlet: 'GettingStarted.cpt', 地区 : " + $(this).val() + "}");
    })
    if (p.length > 0) {
    //将参数值组成的数组转化为字符串  
    var rp = p.join(",");
    var reportlets = "[" + rp + "]";
    var config = {
    printUrl: printurl,
    isPopUp: true,
    // 是否弹出设置窗口,true为弹出,false为不弹出
    data: {
    reportlets: reportlets // 需要打印的模板列表
    },
    printType: 0, // 打印类型,0为零客户端打印,1为本地打印
    // 以下为本地打印的参数,仅当 printType 为 1 时生效
    printerName: 'Microsoft Print to PDF', // 打印机名
    pageType: 2, // 打印页码类型:0:所有页,1:当前页,2:指定页
    pageIndex: '1-3', // 页码范围。当 pageType 为 2 时有效
    copy: 1, // 打印份数
    };
    FR.doURLPrint(config);
    } else
    alert("请选择需要打印的参数");

    3.3 效果预览

    保存模板,点击填报预览,即可对选中的按钮值根据不同参数批量打印。效果如「1.2 节预期效果」所示。

    注:不支持移动端。

    4. 示例二:Web页面传参打印

    如何在 Web 页面中,通过自定义打印按钮实现批量打印报表呢?

    本节示例:在 iframe 中嵌入一张各地区销售人员的业绩报表,并在页面上提供参数复选框。参数选择完成后,点击「自定义打印按钮」,传入不同地区参数,实现批量打印不同参数组合的报表。

    4.1 模板准备

    本文示例将模板 %FR_HOME%\webapps\webroot\WEB-INF\reportlets\GettingStarted.cpt嵌入 iframe 中。

    4.2 新建 HTML 文件

    1)新建print_batch.html文件,内容如下:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
     <head>
      <title>FineReport Demo</title>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <script type="text/javascript" src="/webroot/decision/view/report?op=emb&resource=finereport.js"></script>
    <link rel="stylesheet" type="text/css" href="/webroot/decision/view/report?op=emb&resource=finereport.css"/>
     <script type='text/javascript'>
        function doPrint(){     //通过sessionid打印
            var printurl="http://localhost:8075/webroot/decision/view/report";
            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(",");
        var reportlets = "[" + rp + "]";
                            var config = {
                                printUrl : printurl,
                                isPopUp : true,
                                data : {
                                    reportlets: reportlets
                                },
                                printType: 0, // 打印类型,0为零客户端打印,1为本地打印
                                // 以下为本地打印的参数,仅当 printType 为 1 时生效
                                printerName: 'Microsoft Print to PDF', // 打印机名
                                pageType: 2, // 打印页码类型:0:所有页,1:当前页,2:指定页
                                pageIndex: '1-3', // 页码范围。当 pageType 为 2 时有效
                                copy: 1, // 打印份数
                            };
                            FR.doURLPrint(config);  }
            else
            alert("请选择需要打印的参数");
                }
    </script>
    </head>
    <body>
    <form name="report" width="200" height="200">
        <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>

    代码说明如下:

    • 在 Web 页面中调用 FineReport 打印方法前,需要先引入 finereport.js,这个文件是报表工程自带的,直接在 Web 代码中添加即可

      注:finereport.js 在报表工程目录中没有实体文件,引用它有个固定写法,详情参见文档:FineReport内置方法

    • 以上代码在 iframe 页面中嵌入多个参数复选框,然后获取复选框的值拼出接口的 data 参数 ,最后调用打印方法 doURLPrint() 进行打印,用户可以根据自己的实际需求对参数复选框修改。

    • 本节示例使用的是本地打印,若想使用其他打印方法可以查看  JS 调用 FR 打印方法 文档,用法类似。

    2)将 print_batch.html文件放置到 %FR_HOME%\webapps\webroot\help\page_demo 路径下,如下图所示:

    4.3 效果预览

    打开内置服务器,在浏览器中访问:http://localhost:8075/webroot/help/page_demo/print_batch.html,选中复选框,点击「doPrint」按钮即可打印,效果如下图所示:

    5. 文件下载

    示例一:

    已完成模板请参见:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Advanced\PrintReport\JS实现批量打印.cpt

    点击下载模板:JS实现批量打印.cpt

    示例二:
    点击下载并解压获取 HTML 文件:print_batch.zip

    附件列表


    主题: 报表专题
    已经是第一篇
    已经是最后一篇
    • 有帮助
    • 没帮助
    • 只是浏览

    售前咨询电话

    400-811-8890转1

    在线技术支持

    请前往「服务平台」,选择「在线支持」

    热线电话:400-811-8890转2

    总裁办24H投诉

    热线电话:173-1278-1526