动态行转列

来源:互联网 发布:排名优化网站建设 编辑:程序博客网 时间:2024/04/28 03:28

由于项目的需要,做一个报表工具

要求:  首先能使查寻出来的结果自动行转列,

然后拼接成表格字符串

 

 

使用者只需调用String getTableSytle()方法就可以得到一个完整的表格,它的参数是 

 sql1: 查询要显示的内容,

sql2:  查询要显示的列标题,

sql3:  查询纵向总加的语句

结果可以见图片

 


  

  1. import java.util.*;
  2. public class ReportTool {
  3.    /*
  4.     * param@ String sql1  "select e.DataDomain_Name,q.sTransMode, q.total  from  (select d.DataDomain_Id as  DataDomain_Id ,d.DataDomain_Name as DataDomain_Name from tDataDomain d where 1=1  ) e  left join  (select p.sDataDomain as sDataDomain, p.sTransMode as sTransMode ,isnull( ceiling(round( avg(p.iCalcuValue),0)),0) as total  from tbAnaNeEquip p  where 1=1 and  p.dMpRptType >= '2008-06-21' and  p.dMpValue <= '2008-07-22'  group by p.sTransMode,p.sDataDomain ) q  on e.DataDomain_Id = q.sDataDomain order by   q.sDataDomain , q.sTransMode"
  5.     * 
  6.     * param@ String sql2  "select p.sTransMode from tbAnaNeEquip p where 1=1  group by p.sTransMode order by p.sTransMode"  
  7.     * 
  8.     * param@ String sql3  "select p.sTransMode ,isnull(ceiling(round( avg(p.iCalcuValue),0)),0) from tbAnaNeEquip p   where 1=1 and      p.dMpValue >= '2008-06-21' and  p.dMpRptType <= '2008-07-22'  group by p.sTransMode order by p.sTransMode"
  9.     * 
  10.     * param@ String domainId 数据库所属域
  11.     * 
  12.     * return@ String
  13.     * 
  14.     * function@
  15.     * 
  16.     * 
  17.     */
  18.  public static  String getTableSytle(String sql1, String sql2, String sql3, String domainid){
  19.      
  20.      
  21.      List<String> titleList = new ArrayList<String>();    //放置标题的集合
  22.      List<ReportBean>  ReportBeanList =  new ArrayList<ReportBean>(); //放置行的集合
  23.   
  24.      List<String[]> newList = new ArrayList<String[]>(); //行转列后新的集合
  25.      String[] totalArray = null//纵向相加的后的数字的数组
  26.      int totalArraySize = 0;  
  27.   
  28.      ReportBeanList = getRow(sql1,domainid); //得到行的集合
  29.      titleList = getComlun(sql2,domainid);  //得到标题
  30.      //**********************把标题放置到集合中*****************
  31.   
  32.      String[] titleArray = new String[titleList.size()+ 2]; 
  33.      titleArray[0] = "所在区域";
  34.      for(int j = 0 ; j < titleList.size(); j++ ){
  35.          titleArray[j+1] = (String)titleList.get(j);
  36.      }
  37.      titleArray[titleList.size()+ 1] = "合计";
  38.      newList.add(titleArray);
  39.  //****************************************************** 
  40.      for(int i = 0 ; i < ReportBeanList.size(); i++){
  41.          ReportBean newReportBean = (ReportBean)ReportBeanList.get(i);
  42.          Map<String,String> map = newReportBean.getMap();
  43.    
  44.          int size = titleList.size()+ 2;
  45.          totalArraySize = titleList.size()+ 2;
  46.          String[] tempArray = new String[size];
  47.          tempArray[0] = newReportBean.getDomain();
  48.          long total = 0;
  49.          for(int k = 0 ; k < titleList.size(); k++){
  50.              if(null != map.get((String)titleList.get(k))){
  51.                  tempArray[k+1] = map.get((String)titleList.get(k));
  52.                  total += Long.parseLong(map.get((String)titleList.get(k)));
  53.              }else{
  54.                  tempArray[k+1] = "--";
  55.                  total += 0;
  56.              }
  57.          }
  58.          
  59.          tempArray[size - 1] = Long.toString( total);
  60.          newList.add(tempArray);
  61.     }
  62.     totalArray = getTotal(sql3,domainid,titleList);
  63.     newList.add(totalArray);
  64.     return toTable(newList);
  65.  }
  66.  /* param@ List<String[]> list 行集合
  67.   * return@ String 字符串
  68.   * function@ 把行集合的记录迭代成一个table的样式
  69.   */
  70.  private static String toTable(List<String[]> list ){
  71.      
  72.   
  73.      StringBuffer table = new StringBuffer("<table class=table_line>");
  74.   
  75.      for(int i = 0 ; i < list.size(); i++){
  76.          table.append("<tr class=table_line>");
  77.          String[] tempArray = (String[])list.get(i);
  78.          for(int k = 0; k < tempArray.length ; k++){
  79.              if(i == 0){
  80.                  table.append("<td class=tabel_head>");
  81.              }else{
  82.                  table.append("<td class=total_digital>");
  83.              }
  84.              table.append(tempArray[k]);
  85.              table.append("</td>");
  86.          }
  87.          table.append("</tr>");
  88.      }
  89.      table.append("</table>");
  90.      return table.toString();
  91.  }
  92.  /*
  93.   * 
  94.   * param@ String sql  查询语句
  95.   * param@ String domainId 数据库所属域
  96.   * return@ List<ReportBean> 包含ReportBean的集合
  97.   * function@ 把查询到的结果按domain合并成一个ReportBean,并把ReportBean放置到一个集合中
  98.   * 
  99.   */
  100.  private static List<ReportBean> getRow(String sql,String domain){
  101.      List<ReportBean>  rowList=  new ArrayList<ReportBean>();
  102.      ResultSet rs = null;
  103.   
  104.      com.catt.db.DBTool dbtool = new com.catt.db.DBTool();
  105.      try{
  106.          rs = dbtool.getResultSet(sql, domain);
  107.    //System.out.println("ssss");
  108.    
  109.    
  110.          ReportBean newReportBean = null;
  111.          Map<String,String> map = null;
  112.          String domainId = "";
  113.          while(rs!=null&&rs.next()){  
  114.              if("".equals(domainId)){
  115.                  domainId = rs.getString(1) == null ? "未知":rs.getString(1);
  116.                  newReportBean = new ReportBean();
  117.                  map = new HashMap<String,String>();
  118.                  newReportBean.setDomain(domainId);
  119.      
  120.              }if(domainId.equals(rs.getString(1) == null ? "未知":rs.getString(1))){
  121.      
  122.                  if(null!= rs.getString(2)){
  123.                      map.put(rs.getString(2), rs.getString(3));
  124.                  }else{
  125.                      map.put(null"--");
  126.                  }
  127.              }if(!domainId.equals(rs.getString(1) == null ? "未知":rs.getString(1))){
  128.                  domainId = rs.getString(1) == null ? "未知":rs.getString(1);
  129.                  if(newReportBean != null){
  130.                      newReportBean.setMap(map);
  131.                      rowList.add(newReportBean);
  132.                  }
  133.                  newReportBean = new ReportBean();
  134.                  newReportBean.setDomain(domainId);
  135.                  map = new HashMap<String,String>();
  136.                  if(null!= rs.getString(2)){
  137.                      map.put(rs.getString(2), rs.getString(3));
  138.                  }else{
  139.                      map.put(null"--");
  140.                  }
  141.              }
  142.     
  143.          }
  144.          newReportBean.setMap(map);
  145.          rowList.add(newReportBean);
  146.          rs.close();
  147.      }catch(Exception e){
  148.          e.printStackTrace();
  149.      }finally{
  150.          dbtool.closeCon();
  151.      }
  152.      return rowList; 
  153.  }
  154.  /* param@ String sql 查询语句
  155.   * param@ String domainId 数据库所属域
  156.   * return@ List<String> 字符串集合
  157.   * function@ 查询标题并把它们放置在一个集合中
  158.   */
  159.  public static List<String> getComlun(String sql,String domainId){
  160.      List<String> list = new ArrayList<String>() ;
  161.      ResultSet rs = null;
  162.   
  163.      com.catt.db.DBTool dbtool = new com.catt.db.DBTool();
  164.      try{
  165.          rs = dbtool.getResultSet(sql, domainId);
  166.    
  167.          while(rs!=null&&rs.next()){
  168.              list.add(rs.getString(1));
  169.          }
  170.          rs.close();
  171.      }catch(Exception e){
  172.          e.printStackTrace();
  173.      }finally{
  174.          dbtool.closeCon();
  175.      }
  176.   
  177.      return list;
  178.  }
  179.  /* param@ String sql 查询语句
  180.   * param@ String domainId 数据库所属域
  181.   * param@ int size 字符串数组的长度
  182.   * return@ String[] 字符串数组
  183.   * function@ 获取到纵向相加的值
  184.   */
  185.  private static String[] getTotal(String sql , String domainId ,List<String> ComlunList ){
  186.      String[] array = new String[ComlunList.size()+2];
  187.      ResultSet rs = null;
  188.      com.catt.db.DBTool dbtool = new com.catt.db.DBTool();
  189.      array[0] = "合计";
  190.      int i = 1;
  191.      long total = 0;
  192.      try{
  193.          rs = dbtool.getResultSet(sql, domainId);
  194.    
  195.          Map<String ,String> tempMap = new HashMap<String,String>();
  196.    
  197.          while(rs!=null&&rs.next()){
  198.              tempMap.put(rs.getString(1),rs.getString(2));
  199.          }  
  200.    
  201.          for(int k = 0; k < ComlunList.size(); k++ ){
  202.     
  203.              String comlunName = (String)ComlunList.get(k);
  204.              String value = "0";
  205.     
  206.              if( tempMap.get(comlunName)  != null){
  207.                  value = tempMap.get(comlunName);
  208.              }
  209.              array[i] = value;
  210.              total += Long.parseLong(value);
  211.              i++;
  212.          }
  213.    
  214.    
  215.          array[ComlunList.size()+1] = Long.toString(total);
  216.          rs.close();
  217.      }catch(Exception e){
  218.          e.printStackTrace();
  219.      }finally{
  220.          dbtool.closeCon();
  221.      }
  222.      return array;
  223.  }
  224. }

   

原创粉丝点击