インポートJavaリフレクション機構-excel - 名前及びシーケンスヘッダが交換を可能にします

Excelの表は、以下、リードデータヘッダ名に応じて、無意味な増加スペースは、シーケンスヘッダは、交換可能に、ヘッダを可能にします。


いいえ。 左キロ標準トンネル 右キロのトンネルラベル かどうかのトンネル
1 DK2291.416 DK0 それはあります
2 DK7389.65 DK2291.416 ノー
3 ZK2277 ZK0 それはあります
4 ZK5235.68 ZK2277 ノー
以下の方法は、Javaリフレクション機構、構成ファイルの注文フォーム、動的ファジーマッチングヘッダ名と注文を抽出するヘッダの名前と一致する正規表現の巧妙な使用を完全に使用することです。
/ **
	 * 
	 *指定された行指定されたページのシート<T>データを読みます
	 * 
	 0から始まる* @Param sheetIx指定された用紙ページ、
	 * @Param 0から始まる、指定にスタートラインを開始
	 * @Param 0から始まる、指定した行の終わりを終了
	 * @return
	 * @throws例外
	 * /
	@SuppressWarnings({ "rawtypes"、 "未チェック"})
	公衆リスト<リスト<T >> readGeneric(INT sheetIx、int型開始、int型エンド、T tは){例外をスロー
		シートのシート= workbook.getSheetAt(sheetIx)。
		リスト<リスト<T >>一覧=新しいのArrayList <リスト<T >>();

		IF(エンド>はgetRowCount(sheetIx)){
			端=はgetRowCount(sheetIx)。
		}
		一覧<整数> colNums =新しいのArrayList <Integer型>();
		{(; I <=エンドI ++ INT iはSTART =)のために
			リスト<T> rowList =新しいのArrayList <T>();
			行の行はsheet.getRow(i)を=。
			リストrowdata = getRowdata(行)。
			クラスclazz = t.getClass()。
			オブジェクトFA = clazz.newInstance()。
			方法メソッド= t.getClass()getMethod( "getLdcode"、新たなクラス[] {})。
			文字列[] ldcode =(文字列[])method.invoke(FA、新しいオブジェクト[] {})。
			

			//行0から作られたリクエストを処理し始めます
			(0が開始==)であれば
			{
				// 0行目の処理要求、すなわち、ヘッダ
				(私は== 0)の場合
				{
					反射によってテンプレートクラスのインスタンスを取得します//
					{試します
						ストリングsimpleName = t.getClass()getSimpleName()。
						ストリングStrEnumClass = simpleName.substring(0、simpleName.length() -  5)+ "列挙"。
						クラスEnumClass = Class.forNameの( "com.crscd.config.service.cbtc2.atp.excel.enums。" + StrEnumClass)。
						//オブジェクトenumInstance = EnumClass.newInstance()。
						
						(; J <rowdata.size(); int型J = 0 J ++)について
						{
							//ヘッドテーブルスペース、キャリッジリターン、改行、タブを削除します
							もし(ヌル!= rowdata.get(J)&&! ""。(rowdata.get(J))を等しいです){
								パターンp = Pattern.compile( "\\よ* | \ T | \ rを| \ N");
								文字列str =(文字列)rowdata.get(J)。
					            マッチM = p.matcher(STR)。
					            ストリングexcelData = m.replaceAll( "")。
					            //位置ldcodeに対応するヘッダのツールをゲット
					            この方法は、= EnumClass.getMethod( "のgetStatus"、String.class)を満たしました。
					            INT COL =(INT)met.invoke(Object.classを、excelData)。
								colNums.add(COL)。
							}そうしないと
							{
								colNums.add(-1)。
							}
						}
					}キャッチ(ClassNotFoundExceptionが電子){
						//e.printStackTrace()。
					}
					
				}
			}
				
			{(J ++; J <colNums.size()のint J = 0)のための
				int型のk = J;
				//マッピングテーブルヘッダとデータ列が一致しない場合、無効なExcelの列を示し、列ヘッダーよりも小さい場合、地図データ列、列が不足し、空の文字列で構成されました
				IF(colNums.size()> rowdata.size()){
					rowdata.add( "");
				}
				(0 ==開始&&!colNums.isEmpty())の場合
				{
					K = colNums.get(J)。
				}
				(== K -1)であれば{
					継続する;
				}そうしないと {
					{試します
						方法= t.getClass()getMethod( "セット" + ldcode [K]、String.class)。
						method.invoke(FA、rowdata.get(J));
					//マッピングテーブルヘッダとデータ列が一致しない場合は、超過は、すべてのデータが範囲外ではありません前に、Excelが国境を越えた、遺跡のランクは無効です。
					}キャッチ(例外:IndexOutOfBoundsException電子){
						継続する;
					}
				}
			}
			rowList.add((T)FA)。
			list.add(rowList)。
		}

		リストを返します。
	}


パッケージcom.crscd.config.service.cbtc2.atp.excel。

パブリッククラスTunnelUtils <T> Comparableを実装する<TunnelUtils <T >>、Cloneableを{

	プライベート文字列[] ldcode = {
			"ID"、 "TunnelLeftKilo"、 "TunnelRightKilo"、 "IsTunnel"
	}。
	
	プライベート文字列ID;
	プライベート文字列tunnelLeftKilo。
	プライベート文字列tunnelRightKilo。
	プライベート文字列isTunnel。
	
	パブリック文字列[] getLdcode(){
		ldcodeを返します。
	}
	公共ボイドsetLdcode(文字列[] ldcode){
		this.ldcode = ldcode。
	}
	パブリック文字列のgetId(){
		IDを返します。
	}
	公共ボイドSETID(文字列ID){
		this.id = ID。
	}
	パブリック文字列getTunnelLeftKilo(){
		tunnelLeftKiloを返します。
	}
	公共のボイドsetTunnelLeftKilo(文字列tunnelLeftKilo){
		this.tunnelLeftKilo = tunnelLeftKilo。
	}
	パブリック文字列getTunnelRightKilo(){
		tunnelRightKiloを返します。
	}
	公共のボイドsetTunnelRightKilo(文字列tunnelRightKilo){
		this.tunnelRightKilo = tunnelRightKilo。
	}
	パブリック文字列getIsTunnel(){
		isTunnelを返します。
	}
	公共のボイドsetIsTunnel(文字列isTunnel){
		this.isTunnel = isTunnel。
	}
	
	@オーバーライド
	公共のintのcompareTo(TunnelUtils <T> O){
		IF(Double.parseDouble(stringGetNum(tunnelLeftKilo))<Double.parseDouble(stringGetNum(o.getTunnelLeftKilo()))){
			-1を返します。
		}
		IF(Double.parseDouble(stringGetNum(tunnelLeftKilo))> Double.parseDouble(stringGetNum(o.getTunnelLeftKilo()))){
			1を返します。
		}
		0を返します。
	}
	//文字列の数を取得します
		パブリック文字列stringGetNum(文字列str){
			文字列STR2 = "";
			もし(STR!= nullの&&は! ""。等しい(文字列)){
				以下のために(; I <str.length(); INT iが0 = I ++){
					IF((str.charAt(I)> = 48 && str.charAt(I)<= 57)|| str.charAt(I)== 46){
						STR2 + = str.charAt(I)。
					}
				}
				STR2を返します。
			}
			STRを返します。
		}
		@オーバーライド  
	    パブリックオブジェクトのクローン(){  
			TunnelUtils <T> STU = NULL;  
	        {試します  
	            STU =(TunnelUtils <T>)super.clone();  
	        }キャッチ(CloneNotSupportedException電子){  
	            e.printStackTrace();  
	        }  
	        STUを返します。  
	    }  
}
パッケージcom.crscd.config.service.cbtc2.atp.excel.enums。

輸入java.util.regex.Patternの;

パブリック列挙TunnelEnum {
	ID( "ID"、0)、
	tunnelLeftKilo( "左キロトンネルラベル"、1)、
	tunnelRightKilo( "右キロトンネルラベル"、2)
	isTunnel( "トンネルかどうか"、3)。
	
	民間最終文字列のMSG。
    民間最終int型のステータス。
	
	TunnelEnum(文字列MSG、int型のステータス)
	{
		this.msg = MSG;
        this.status =ステータス。
	}	
	//ダイナミックマッチングヘッダー名、あなたは空、無意味な文字を追加することができますプラス
	getStatus int型のpublic static(String str)文字
	{
		STR = str.replaceAll( "\\("、 "\\\\(")。
		STR = str.replaceAll( "\\)"、 "\\\\)")。
		文字列のパターン= "^" + STR + "*。";
		用(TunnelEnum電子:TunnelEnum.values())
		{
			IF(Pattern.matches(パターン、e.msg))
			{
				e.statusを返します。
			}
		}
		-1を返します。
	}

}

次のようにデータをエクセル:

いいえ。 左キロ標準トンネル 右キロのトンネルラベル かどうかのトンネル
1 DK2291.416 DK0 それはあります
2 DK7389.65 DK2291.416 ノー
3 ZK2277 ZK0 それはあります
4 ZK5235.68 ZK2277 ノー


おすすめ

転載: blog.51cto.com/zhaoanan/2468113