Excelの表は、以下、リードデータヘッダ名に応じて、無意味な増加スペースは、シーケンスヘッダは、交換可能に、ヘッダを可能にします。
いいえ。 | 左キロ標準トンネル | 右キロのトンネルラベル | かどうかのトンネル |
1 | DK2291.416 | DK0 | それはあります |
2 | DK7389.65 | DK2291.416 | ノー |
3 | ZK2277 | ZK0 | それはあります |
4 | ZK5235.68 | ZK2277 | ノー |
/ ** * *指定された行指定されたページのシート<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 | ノー |