润乾报表组实现展现A打印B

来源:互联网 发布:新手模拟钢琴软件 编辑:程序博客网 时间:2024/05/16 15:36

需求:润乾报表在发布报表的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" onClick="new_group_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是参数名称。

预览截图如下:


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


上图是报表三打印预览界面。

通过上面的方法就可以实现展现一个报表组,打印另个一个报表组。

0 0