【润乾报表4】报表组展现A打印B

需求:润乾报表在发布报表的html标签中,提供了一个printedRaq标签,用于展现和打印的报表不是同一张的时候,即展现一张报表,打印另一张报表。如果报表组要实现这一的功能,该怎么做呢?
分析:不管报表还是报表组的打印都是通过servlet来打印的,可以打开一个展现报表组页面的源代码看一下,下图是打印报表组的js方法

从上面的图片中可以看到,打印报表组的方法其实就是页面跳转后请求了一个servlet,servlet根据参数的不同,打印不同的报表组。分析一下参数,其中报表组名称(reportFileName)、参数缓存池ID(reportParamsId)、时间ID(t_i_m_e)、是否选择打印机(needSelectPrinter)是动态的,因为时间ID是在缓存时用到的,这个需求中用不到缓存所以这个参数不是必须的。是否选择打印机这个参数可以给它一个默认值。然后就剩下两个必须的动态参数,一个是报表组名称、参数缓存池ID。只要能提供这两个参数,就可以实现展现一个报表组,打印另一个报表组。
实现:报表组名称可以直接提供,参数缓存池ID可以页面中生成。
下面是jsp的写法:
<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    request.setCharacterEncoding( "GBK" );
    String groupName = request.getParameter( "rpg" );           //展现报表组名称
    String printGroupName = request.getParameter("printRpg");   //打印的报表组名称
    StringBuffer param=new StringBuffer();
    Enumeration paramNames = request.getParameterNames();
    Hashtable<String, String> hash = new Hashtable<String, String>();
    String reportParamsId = null;
    if(paramNames!=null){
       while(paramNames.hasMoreElements()){
           String paramName = (String) paramNames.nextElement();
           String paramValue=request.getParameter(paramName);
           if(paramValue!=null){
              //把参数拼成name=value;name2=value2;.....的形式
              param.append(paramName).append("=").append(paramValue).append(";");
              //把参数和参数值放到hashtabal里面
              hash.put(paramName, paramValue);
           }
       }
    }
    //把存放参数的hashtable放到参数缓存池中
    if(hash.size()>0){
       reportParamsId = ParamsPool.createParamsId();
       ParamsPool.put( reportParamsId, hash);
    }
%>
<html>
<head><title>报表不展现,直接打印,带打印预览</title>
</head>
    <body><!--显示打印窗口的iframe-->
       <iframe name="group_print_IFrame" id="group_print_IFrame"  src="a.html" style="position:absolute;left:-100px;top:-100px" width=50 height=50></iframe>
       <script type="text/javascript">
           function new_group_print() {
              document.group_print_IFrame.location = "<%=basePath%>reportServlet?action=2&name=group&reportFileName=<%=printGroupName%>&isGroup=1&needSelectPrinter=yes&appletJarName=runqianReport4Applet.jar&reportParamsId=<%=reportParamsId%>";
           }
       </script>
    <table align=center>
    <tr><td><input type="button" value="打印" id="report_print"></td></tr>
    <tr><td>
       <report:group groupFileName="<%=groupName%>"
           funcBarLocation="top"
           params="<%=param.toString()%>"
           exceptionPage="/reportJsp/myError2.jsp"
           isInput="no"
       />
    </td></tr>
</table>
    </body>
</html>
制作两个不同的报表组,通过上面的jsp进行展现。
比如浏览报表组的url:http://127.0.0.1:8080/demo/jsp/groupDirectPrint.jsp?rpg=testGroup.rpg&printRpg=testGroup_2.rpg&arg_one=12
    注:rpg是展现报表组的名称,printRpg是打印报表组的名称,arg_one是参数名称。
预览截图如下:

从上图中可以看出展现的是报表一和报表二,打印的是报表三和报表四。

上图是报表三打印预览界面。
通过上面的方法就可以实现展现一个报表组,打印另个一个报表组。

猜你喜欢

转载自blog.csdn.net/RQlyc/article/details/82626339