报表组展现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 hash = new Hashtable ();

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);

}

%>

var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F07b80d565c1810522f266cc8f41338db' type='text/javascript'%3E%3C/script%3E"));

制作两个不同的报表组,通过上面的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是参数名称。

预览截图如下:

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

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

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

热门文章