报表分页的思考与分析及实现

报表分页的思考与分析及实现
当今的报表分页在很多系统中都扮演着十分重要的角色,对于很多组件技术如CR、BO,等都是很好的报表工具,分页技术当然不在话下,
在此,我所说的是一般的jsp页面展现报表的讨论,
图片找不到
如上图(在此只做为一举例),一个表单一般分为表头,表内容和表尾,还有一些页数的选择,
在此我们讨论几种实现的方法:
一,一公用页面和公用java类实现法---将表头及表内容查询的sql及表尾内容写入一xml文件中,当调用表单时,在javat程序中设用xml文件中的相应ID,找到及解析相应的内容,存放在java对象中,然后在jsp页面得到相应的java对象加以显示,此为一过程, 在此可谓第一次调用完成。
 当点击第二次调用时,此处有多种方法,1,在页面隐藏保存相应xml中的ID,后面同第一次程序实现相同,但此处解析xml文件的开销过大。2,将第一次存放在java对象存放在session中,这样,先判断session中是否有值,有值直接取出,没有就到xml文件中解析, 此方法省去了多次解析xml文件的操作,但增加了session的负担,而且当不再做表单查询操作也不能很好释放session中内容。
二,一查询对应一页面和java类,此方法实现比较简单,表样式可以先画好,传入一些相应变量进行展现,但这种做法很难统一管理,要对表结构和样式做变动时较难解决,而且代码冗余度大。
三,目前我认为较好些的办法, 把表中表头即表的B部分抽取成一静态页面,而表ACD部分都放入xml文件中定义,此定义内容相比之下比第一种方法减少很多,因为表B部分是对xml最难对应的一部分,宽度、位置,名称及对应java变量名称等都要定义,而对于多行表头是更难定义,
因为表ACD我们可以在xml中定义(此处采用spring的xml解析

 1 <? xml version="1.0" encoding="GB2312" ?>
 2 <! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
 3 < beans >
 4      < bean  id ="queryinfo"  class ="online.common.query.vo.QueryInfo" >
 5          < property  name ="title" >< value > 发票出库 </ value ></ property >
 6          < property  name ="headInfo" >< ref  local ="headInfo" /></ property >
 7          < property  name ="footInfo" >< ref  local ="footInfo" /></ property >
 8          < property  name ="sqlStr" >< value > <![CDATA[ select t.billdataid aa,'200501' bb, '建筑发票' cc, t.billstatus dd,t.taxofficialcode ee, '1000' ff, '1005' gg, 0.98 hh,
 9 t.taxtotal ii, '调拨' jj
10 from billdata t
11                ]]> </ value ></ property >
12      </ bean >
13      < bean  id ="headInfo"  class ="online.common.query.vo.HeadInfo" >
14          < property  name ="lineItemNum" >< value > 2 </ value ></ property >
15          < property  name ="itemList" >
16             < list >
17              < value > 出库单位 </ value >
18              < value > 统计日期 </ value >
19             </ list >
20          </ property >
21          < property  name ="engList" >
22             < list >
23              < value > gljg </ value >
24              < value > tjlq </ value >
25             </ list >
26          </ property >
27     </ bean >  
28     < bean  id ="footInfo"  class ="online.common.query.vo.FootInfo" >
29          < property  name ="itemList" >
30             < list >
31              < value > 验收单位: </ value >
32              < value > 验收日期: </ value >
33             </ list >
34          </ property >
35          < property  name ="engList" >
36             < list >
37              < value > theuser </ value >
38              < value > thedate </ value >
39             </ list >
40          </ property >
41     </ bean >
42 </ beans >
然后在公用的查询jsp页面中expression为传入参数(表头B部分静态页面地址);
< jsp:include  page ="<%= expression %>"    />  
公用页面ACD部分
for ( int  i = 0 ;i <= headItemList.size() / lineItemNum;i ++ {
    headStr 
+= "<tr>";
  
if(i==headItemList.size()/lineItemNum)  {
     ind 
=headItemList.size()%lineItemNum ;
  }

    
for(int j=0;j<ind;j++{
        headStr 
+= " <td  align=\"center\"  colspan=\"2\">"+ headItemList.get(i*lineItemNum+j) + "£º" + paramMap.get(engItemList.get(i*lineItemNum+j))  +"</td>";
    }

    headStr 
+= "</tr>";
}

%>
<%= headStr %>
 
<% 要输出的内容  
           
for ( int  i = 0 ;i < pageList.size();i ++ ) {
          pageStr 
+= "<tr>";
         HashMap obj 
=(HashMap) pageList.get(i);
            
for(int j=0;j<coumNum;j++)
          pageStr 
+= " <td class=\"tdbg0\"  >"+obj.get(engnList.get(j)) +"</td>";
          pageStr 
+= "</tr>";
           }


%>
<%= pageStr %>
<%   // 表尾
String footStr  =   "" ;
      footStr 
+=   " <tr> " ;
    
for ( int  j = 0 ;j < footList.size();j ++ {
        footStr 
+= " <td  align=\"center\"  colspan=\"2\">"+ footList.get(j) + "£º" + paramMap.get(engfootList.get(j))  +"</td>";
    }

    footStr 
+=   " </tr> " ;
%>
<%= footStr %>

spring映射代码略.............
总结:我们清楚,当一次调用报表时,无论是点第几页,它的ABD部分是不会变的,因此,能把此三部分都在第一次调用都生成静态页或此三部分在第一次生成调用后,翻页操作就不在调用(曾试过用frame,效果不是很好),若能解决此部分,可将再次提高java和页面的执行效率................

你可能感兴趣的:(报表分页的思考与分析及实现)