`
suhongliang5332
  • 浏览: 22535 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Struts2+freemarker实现动态表头输出

 
阅读更多

首先创建一个树的节点

package com.stxdalian.redbook.structure;

import java.util.LinkedList;

public class TreeNode {
	String data;
	TreeNode parent;
	LinkedList<TreeNode> childlist;
	TreeNode()
	{
		data = null;
		childlist = new LinkedList<TreeNode>();
		parent = null;
	}
}

 再实现树的基本操作

package com.***.redbook.structure;

import java.util.ArrayList;
import java.util.HashMap;

import javassist.expr.NewArray;


public class MultiTree {
	ArrayList<String> resultExcel = new ArrayList<String>();
	ArrayList<ArrayList<Object>> tempResult;
	public MultiTree(){
		tempResult = new ArrayList<ArrayList<Object>>();
		TreeNode root = new TreeNode();
		root.data="root";
		ArrayList<String> testArr = new ArrayList<String>();
		testArr.add("ddd");
		testArr.add("aaa");
		testArr.add("ccc");
		testArr.add("bbb/x");
		testArr.add("bbb/y");
		testArr.add("eee/a");
		testArr.add("eee/b");
		testArr.add("eee/c/a");
		testArr.add("eee/c/m");
		testArr.add("eee/c/n");
		for (String string : testArr) {
			arrTotree(string,root);
		}
		System.out.println("--------------------->>"+getMaxTreece(root));
		treeToArr(root,0,getMaxTreece(root));
		treeToTable(tempResult,getMaxTreece(root));
	}
	/**
	 * 返回一个表格的头
	 * 数据类型为 arraylist<行arraylist<[value='',rowspan='',colspan='']>>
	 * @param tmpArr
	 * @param maxce
	 * @return
	 */
	public ArrayList<ArrayList<HashMap<String,String>>> treeToTable(ArrayList<ArrayList<Object>> tmpArr,int maxce){
		ArrayList<ArrayList<HashMap<String,String>>> totalresultTable = new ArrayList<ArrayList<HashMap<String,String>>>();
		for(int i=0;i<=maxce;i++){
			ArrayList<HashMap<String,String>> resultTable = new ArrayList<HashMap<String,String>>();
			for(ArrayList<Object> item:tmpArr){
				HashMap<String, String> hangHS = new HashMap<String, String>();
				if(item.get(3).equals(i)){
					hangHS.put("value", item.get(0).toString());
					hangHS.put("rowspan", item.get(1).toString());
					hangHS.put("colspan", item.get(2).toString());
					resultTable.add(hangHS);
				}
			}
			totalresultTable.add(resultTable);
		}
		return totalresultTable;
	}
	
	//TODO 传递任意一棵树,计算位置
	
	/**
	 * 把一棵树转换为数组   【名称,合并的层数,合并的列数,树的层次】
	 * 行不等于0的时候,要回行输出
	 * @param curtroot
	 */
	public void treeToArr(TreeNode f,int level,int maxce){

		for(int i=0; i<f.childlist.size(); i++) {
			TreeNode t = f.childlist.get(i);
			if(! t.childlist.isEmpty()) {
				ArrayList<Object> tmpInarr = new ArrayList<Object>();
				tmpInarr.add(t.data);
				tmpInarr.add("0");
				tmpInarr.add(getTreeye(t));
				tmpInarr.add(level);
				tempResult.add(tmpInarr);
				System.out.println(t.data+0+"-"+getTreeye(t)+"-"+level);
				treeToArr(t, level + 1,maxce);
			}else{
				ArrayList<Object> tmpInarr = new ArrayList<Object>();
				tmpInarr.add(t.data);
				tmpInarr.add((maxce-level+1));
				tmpInarr.add(getTreeye(t));
				tmpInarr.add(level);
				tempResult.add(tmpInarr);
				System.out.println(t.data+(maxce-level+1)+"-"+getTreeye(t)+"-"+level);
			}
		}
	}
	/**
	 * 创建一个树
	 * @param testStr  树结构字符串
	 * @param curtroot 根节点
	 */
	public void arrTotree(String testStr,TreeNode curtroot){
		if(testStr.indexOf("/")>0){
			int endIndex = testStr.indexOf("/");
			TreeNode nodeChild ;
			//判断这个节点是否已经存在,存在就不要建了
			if(isexist(testStr.substring(0, endIndex),curtroot)==null){
				nodeChild = new TreeNode();
				nodeChild.data = testStr.substring(0, endIndex);
				curtroot.childlist.add(nodeChild);
			}else{
				nodeChild = isexist(testStr.substring(0, endIndex),curtroot);
			}
			String nextxt = testStr.substring(endIndex+1);
			arrTotree(nextxt,nodeChild);
		}
		else{
			TreeNode nodeChild = new TreeNode();
			nodeChild.data = testStr;
			curtroot.childlist.add(nodeChild);
		}
	}
	/**
	 * 判断节点是否存在
	 * @param testStr  测试的节点
	 * @param curtroot 当前树
	 * @return
	 */
	public TreeNode isexist(String testStr,TreeNode curtroot){
		 TreeNode currtchild = null ;
		 for(int i=0; i<curtroot.childlist.size(); i++) {
			 if(testStr.equals(curtroot.childlist.get(i).data)){
				 currtchild = curtroot.childlist.get(i);
			 }
		 }
		 return currtchild;
	}
	/**
	 * 递归显示树
	 * @param f
	 * @param level
	 */
	public void displaytree(TreeNode f, int level) {       
		String preStr = "";
		int m=0;
		for(int i=0; i<level; i++) {
			preStr += "    ";
			m+=1;
		}
		for(int i=0; i<f.childlist.size(); i++) {
			TreeNode t = f.childlist.get(i);
			System.out.println(preStr + "-"+t.data+m);
			if(! t.childlist.isEmpty()) {
				displaytree(t, level + 1);
			}
		}
	}
	/**
	 * 获得一个树的最大层次
	 * @param f
	 * @return
	 */
	public int getMaxTreece(TreeNode f){
		int temp = 0;
		for (int i = 0; i < f.childlist.size(); i++) {
			if(temp < this.getTreece(f.childlist.get(i))){
				temp = this.getTreece(f.childlist.get(i));
			}
		}
		return temp;
	}
	/**
	 * 获得树的层次,根为-1,第一层为0
	 * @param f
	 * @return
	 */
	public int getTreece(TreeNode f){
		int result = 0;
		for(int i=0; i<f.childlist.size(); i++) {
			int tmp=0;
			if(f.childlist.get(i).childlist.isEmpty()){
				result = 1;				  //为叶子节点,那么层次为1
			}
			else{
				result = result+  getTreece(f.childlist.get(i));
			}
		}
		return result;
	}
	/**
	 * 获得树的叶子个数
	 * @param f
	 * @return
	 */
	public int getTreeye(TreeNode f){
		int result = 0;
		for(int i=0; i<f.childlist.size(); i++) {
			int tmp=0;
			if(f.childlist.get(i).childlist.isEmpty()){
				result = result+1;				  //为叶子节点
			}
			else{
				tmp = getTreeye(f.childlist.get(i));
			}
			result = result + tmp;
		}
		return result;
	}
	
}

 3

 SELECT 'SHIP NO.'  AS HEADERS,
		        'PROJECT_NO' AS DEPT_CODE,
		        '0' AS POSITION_CODE,
		        '0' AS WORK_CODE
		FROM DUAL 
		UNION ALL
		SELECT  CASE WHEN #{lang}= 'KOR' THEN '시리즈'
			    ELSE '系列'
				END HEADERS ,
		        'SERIES_PROJECT' ,
		        '1',
		        '1'
		FROM DUAL 
		UNION ALL
		SELECT  CASE WHEN #{lang}= 'KOR' THEN '선종'
			    ELSE '船种'
				END HEADERS ,
		        'SHIPTYPE' ,
		        '2',
		        '2'
		FROM DUAL  
		UNION ALL
		SELECT  CASE WHEN #{lang}= 'KOR' THEN '선주'
			    ELSE '船东'
				END HEADERS,
		        'OWNER' ,
		        '3',
		        '3'
		FROM DUAL 
		UNION ALL
		SELECT  CASE WHEN #{lang}= 'KOR' THEN '선급'
			    ELSE '船级社'
				END HEADERS,
		        'CLASS1' ,
		        '4',
		        '4'
		FROM DUAL
		UNION ALL
		SELECT  CASE WHEN #{lang}= 'KOR' THEN 'PC(정)'
			    ELSE 'PC(正)'
				END HEADERS,
		        'PC' ,
		        '5',
		        '5'
		FROM DUAL 
		
		UNION ALL
		
		SELECT HEADERS, DEPT_CODE,POSITION_CODE,WORK_CODE FROM (
		SELECT DISTINCT  HEADERS,DEPT_CODE,POSITION_CODE,WORK_CODE,WC_STEP, PC_STEP
		 FROM (
		    SELECT D.DEPT_NAME,
		           D.DEPT_CODE,
		           P.POSITION_CODE,
		           P.WORK_CODE ,
		           WC.C_STEP AS WC_STEP, 
                   PC.C_STEP AS PC_STEP,
		           STX_IBD_KEYMAN_PKG.GET_CODE_NAME(#{lang},'WCODE',   P.WORK_CODE)||'/'||
                   REPLACE(DECODE(#{lang},'KOR',D.ATTRIBUTE2,D.DEPT_NAME),'Team','' )||'/'||
                   STX_IBD_KEYMAN_PKG.GET_CODE_NAME(#{lang},'PCODE',   P.POSITION_CODE) AS  HEADERS
		    FROM STX_IBD_PM         P,
		         STX_IBD_PM_PROJECT PR,
                 LPM_PROJECT_HI     L,
		         STX_COM_INSA_USER  U,
		         STX_COM_INSA_DEPT  D,
                 STX_IBD_ISSUE_CODE PC,
                 STX_IBD_ISSUE_CODE WC
		    WHERE P.PROJECT_NO    = PR.PROJECT_NO
            AND   P.PROJECT_NO    = L.PROJECTNO
		    AND   P.EMPNO         = U.EMP_NO
		    AND   U.DEPT_CODE     = D.DEPT_CODE
			AND   P.POSITION_CODE = PC.CID
	        AND   P.WORK_CODE     = WC.CID
	        AND   PC.GCID         = 'PCODE'
	        AND   WC.GCID         = 'WCODE'
		    AND   NVL(PR.END_DATE, TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')) &gt;=TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')
		    AND   NVL(PC.DISABLE_DATE, TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')) &gt;=TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')
		    AND   NVL(WC.DISABLE_DATE, TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')) &gt;=TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')
            AND   (#{project_no} IS NULL OR ( #{project_no} IS NOT NULL AND P.PROJECT_NO  =  #{project_no}))
            AND   P.POSITION_CODE LIKE #{position_code}
            AND   P.WORK_CODE     LIKE #{work_code}
            AND   (#{dept_code} IS NULL OR ( #{dept_code} IS NOT NULL AND U.DEPT_CODE  =  #{dept_code}))
            AND   L.SHIPTYPE      LIKE #{shiptype}
            AND   (#{empnm} IS NULL OR ( #{empnm} IS NOT NULL AND ( U.USER_NAME LIKE '%${empnm}%' OR U.USER_NAME_KOR LIKE '%${empnm}%')))
		    AND   D.USE_YN ='Y'
		    AND   P.POSITION_CODE >='2'
		    ORDER BY TO_NUMBER(WC.C_STEP),D.DEPT_CODE,TO_NUMBER(PC.C_STEP)
		    )
		  ORDER BY TO_NUMBER(WC_STEP),DEPT_CODE,TO_NUMBER(PC_STEP)
		) 

 

分享到:
评论
2 楼 suhongliang5332 2013-08-07  
liu_bia 写道
这个显示的界面是怎样的?

可以直接在html输出
1 楼 liu_bia 2013-07-29  
这个显示的界面是怎样的?

相关推荐

Global site tag (gtag.js) - Google Analytics