001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.hayabusa.db.DBTableModel; 021import org.opengion.hayabusa.db.DBColumn; 022import org.opengion.hayabusa.io.TableReader; 023import org.opengion.fukurou.util.ErrorMessage; 024import org.opengion.fukurou.util.FileUtil; 025import org.opengion.fukurou.util.Closer ; 026import org.opengion.fukurou.util.StringUtil ; 027import static org.opengion.fukurou.util.StringUtil.nval ; 028 029import java.io.File; 030import java.io.BufferedReader; 031import java.util.Locale ; 032import java.io.ObjectOutputStream; 033import java.io.ObjectInputStream; 034import java.io.IOException; 035 036/** 037 * 指定のファイルを DBTableModelオブジェクトに読み取るファイル入力タグです。 038 * 039 * データ(DBTableModel)と、コントローラ(ReadTableタグ)を与えて、外部からコントロールすることで、 040 * 各種形式で データ(DBTableModel)を表示させることが できます。 041 * ReadTableタグ に対して、コマンドを与えることにより、内部のコントローラの実装に対応した 042 * 形式でデータを作成します。 043 * すべての読取の初期クラス名を リソースファイルの TABLE_READER_DEFAULT_CLASS で指定可能です。 044 * その場合、AutoReader を指定すると、Excel と Default(テキスト) を順番に試します。 045 * 046 * 入力件数を"DB.COUNT" キーでリクエストにセットしています。 047 * 048 * @og.formSample 049 * ●形式: 050 * <og:readTable 051 * command = "NEW" 052 * fileURL = "{@USER.ID}" 読み取り元ディレクトリ名 053 * filename = "{@filename}" 読み取り元ファイル名 054 * encode = "UnicodeLittle" 読み取り元ファイルエンコード名 055 * maxRowCount = "10000" 読取最大件数(0:[無制限]) 056 * /> 057 * ●body:なし 058 * 059 * ●Tag定義: 060 * <og:readTable 061 * readerClass 【TAG】実際に読み出すクラス名の略称(TableReader_**** の ****)をセットします({@og.doc03Link readerClass 初期値:Default}) 062 * fileURL 【TAG】読み取り元ディレクトリ名を指定します(初期値:FILE_URL) 063 * filename 【TAG】ファイルを作成するときのファイル名をセットします (初期値:FILE_FILENAME[=file.xls]) 064 * encode 【TAG】ファイルを作成するときのファイルエンコーディング名をセットします(初期値:FILE_ENCODE) 065 * maxRowCount 【TAG】読取時の最大取り込み件数をセットします (初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限]) 066 * separator 【TAG】可変長ファイルを作成するときの項目区切り文字をセットします 067 * tableId 【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID 068 * command 【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW) 069 * modifyType 【TAG】ファイル取り込み時の モディファイタイプ(A(追加),C(更新),D(削除))を指定します 070 * displayMsg 【TAG】query の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0033[ 件検索しました]) 071 * notfoundMsg 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした]) 072 * sheetName 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし) 073 * sheetNos 【TAG】EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0) 074 * sheetConstKeys 【TAG】EXCELファイルを読み込むときの固定値となるカラム名(CSV形式) 075 * sheetConstAdrs 【TAG】EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・) 076 * nullBreakClm 【TAG】カラム列に NULL が現れた時点で読み取りを中止します(複数Sheetの場合は、次のSheetを読みます)。 077 * columns 【TAG】読み取り元ファイルのカラム列を、外部(タグ)より指定します 078 * useNumber 【TAG】行番号情報を、使用している/していない[true/false]を指定します(初期値:true) 079 * adjustColumns 【TAG】読み取り元ファイルのデータ変換を行うカラム列をカンマ指定します 080 * checkColumns 【TAG】読み取り元ファイルの整合性チェックを行うカラム列をカンマ指定します 081 * nullCheck 【TAG】NULL チェックすべきカラム列をカンマ区切り(CVS形式)で指定します 082 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 083 * stopZero 【TAG】読込件数が0件のとき処理を続行するかどうか[true/false]を指定します(初期値:false[続行する]) 084 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session) 085 * mainTrans 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false) 086 * skipRowCount 【TAG】(通常は使いません)データの読み飛ばし件数を設定します 087 * useRenderer 【TAG】読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します (初期値:USE_TABLE_READER_RENDERER[=false]) 088 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20) 089 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20) 090 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20) 091 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20) 092 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 093 * /> 094 * 095 * ●使用例 096 * 097 * <og:readTable 098 * command = "NEW" 099 * readerClass = "Fixed" 固定長データの読み取り 100 * modifyType = "{@modifyType}" 読取時のモディファイタイプ(A,C等) 101 * fileURL = "{@USER.ID}" 読み取り元ディレクトリ名 102 * filename = "{@filename}" 読み取り元ファイル名 103 * encode = "Shift_JIS" 読み取り元ファイルエンコード名 104 * maxRowCount = "10000" 読取最大件数(0:[無制限]) 105 * columns = "OYA,KO,HJO,SU,DYSTR,DYEND" #NAME に対応するカラム列 106 * useNumber = "false" 行番号の存在しないデータを読み取ります。 107 * adjustColumns = "OYA,KO,HJO,SU" データ変換するカラム列("*" で全カラム) 108 * checkColumns = "OYA,KO,HJO,SU" 整合性チェックするカラム列("*" で全カラム) 109 * nullCheck = "OYA,KO,SU" NULLチェックを実行します("*" で全カラム) 110 * stopZero = "true" 取得0件の場合に以降の処理を停止します 111 * skipRowCount = "4" データの読み飛ばし件数(読み込み開始は、この数字+1行目から) 112 * /> 113 * 114 * @og.group ファイル入力 115 * 116 * @version 4.0 117 * @author Kazuhiko Hasegawa 118 * @since JDK5.0, 119 */ 120public class ReadTableTag extends CommonTagSupport { 121 //* このプログラムのVERSION文字列を設定します。 {@value} */ 122 private static final String VERSION = "5.7.7.2 (2014/06/20)" ; 123 124 private static final long serialVersionUID = 577220140620L ; 125 126 private static final int ERROR_ROW_COUNT = 200 ; // 4.0.0 (2007/05/25) 127 128 /** command 引数に渡す事の出来る コマンド 新規作成 {@value} */ 129 public static final String CMD_NEW = "NEW" ; 130 /** command 引数に渡す事の出来る コマンド 再検索 {@value} */ 131 public static final String CMD_RENEW = "RENEW" ; 132 133 private static final String[] COMMAND_LIST = new String[] { CMD_NEW , CMD_RENEW }; 134 135 private String separator = TableReader.TAB_SEPARATOR; // 項目区切り文字 136 private String fileURL = HybsSystem.sys( "FILE_URL" ); 137 private String filename = HybsSystem.sys( "FILE_FILENAME" ); // ファイル名 138 private String encode = HybsSystem.sys( "FILE_ENCODE" ); // ファイルエンコーディング "JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS" 139 private String readerClass = HybsSystem.sys( "TABLE_READER_DEFAULT_CLASS" ); // 3.8.5.3 (2006/08/07) 140 private int maxRowCount = -1; 141 private String displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" ); 142 private String notfoundMsg = "MSG0077"; // 対象データはありませんでした。 143 private int executeCount = -1; // 検索/実行件数 144 private String modifyType = null; 145 private String adjustColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 146 private String checkColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 147 private String nullCheck = null; // 3.8.0.2 (2005/06/30) nullチェック確認 148 149 private transient DBTableModel table = null; 150 private String command = CMD_NEW; 151 private String tableId = HybsSystem.TBL_MDL_KEY ; 152 private String sheetName = null ; // 3.5.4.2 (2003/12/15) 153 private String sheetNos = null ; // 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるようにする。 154 private String sheetConstKeys = null ; // 5.5.8.2 (2012/11/09) 固定値となるカラム名(CSV形式) 155 private String sheetConstAdrs = null ; // 5.5.8.2 (2012/11/09) 固定値となるアドレス(行-列,行-列,・・・) 156 private String nullBreakClm = null; // 5.5.8.2 (2012/11/09) 取込み条件/Sheet BREAK条件 157 158 // 3.5.4.5 (2004/01/23) 外部よりカラム列(カンマ区切り)を指定できるようにする。 159 private String columns = null; 160 private boolean useNumber = true; // 3.7.0.5 (2005/04/11) 161 162 private boolean stopZero = false; // 4.3.7.0 (2009/06/01) stopZero属性追加 163 164 // 5.1.8.0 (2010/07/01) AutoReaderのCalc対応 165 private static final String[] AUTO_READER_CLASS = new String[] { "Excel","Calc","Default" ,"Default" }; 166 private static final String[] AUTO_READER_ENCODE = new String[] { null ,null ,"UnicodeLittle","Windows-31J" }; 167 168 private boolean isMainTrans = true; // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 169 private int skipRowCount = 0; // 5.1.6.0 (2010/05/01) データの読み飛ばし設定 170 171 // 5.2.1.0 (2010/10/01) 読取処理でコードリソースのラベル変換を行うかどうか 172 private boolean useRenderer = HybsSystem.sysBool( "USE_TABLE_READER_RENDERER" ); // 5.2.1.0 (2010/10/01) 173 174 /** 175 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 176 * 177 * @og.rev 3.0.1.4 (2003/03/17) displayMsg が 0Byteの場合は、件数も表示しないように変更。 178 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 179 * @og.rev 3.5.4.1 (2003/12/01) 引数の BufferedReader を、InputStream に変更。 180 * @og.rev 3.5.4.3 (2004/01/05) 引数の InputStream を、 BufferedReader に戻す。 181 * @og.rev 3.5.6.5 (2004/08/09) 暫定的に、DBTableModelを先行削除します。 182 * @og.rev 3.6.0.0 (2004/09/24) DBTableModel の先行削除は、scope="session" の場合のみ。 183 * @og.rev 3.6.0.2 (2004/10/04) 取り込み時チェック用に、checkColumns,adjustColumns 属性追加 184 * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。 185 * @og.rev 3.8.5.3 (2006/08/07) readerClassが "Excel"でエラーが発生したとき、もう一度Defaultで再読取を行います。 186 * @og.rev 4.0.0.0 (2007/10/12) checkTableColumn 前に、modifyType 設定を行います。 187 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 188 * @og.rev 4.3.1.1 (2008/10/08) columnsが指定されている場合は、AutoReader禁止 189 * @og.rev 4.3.7.0 (2009/06/01) stopZero機能,DB.COUNTリクエストキーへ読込件数セットを追加 190 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。 191 * @og.rev 5.1.8.0 (2010/07/01) AutoReaderのCalc対応 192 * @og.rev 5.1.9.0 (2010/08/01) AutoReaderでのExceptionの判定をThrowableに変更 193 * @og.rev 5.7.1.2 (2013/12/20) tempMsg.toString() ⇒ errMsg 変更 194 * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加 195 * 196 * @return 後続処理の指示 197 */ 198 @Override 199 public int doEndTag() { 200 debugPrint(); // 4.0.0 (2005/02/28) 201 // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加 202 if( !useTag() ) { return EVAL_PAGE ; } 203 204 if( check( command, COMMAND_LIST ) ) { 205 useMainTrans( isMainTrans ); // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 206 startQueryTransaction( tableId ); // 3.6.0.8 (2004/11/19) 207 208 // 3.5.6.5 (2004/08/09) 削除するのは、セッションのオブジェクトでよい。 209 // 3.6.0.0 (2004/09/24) 削除するのは、scope="session" の場合のみ。 210 if( "session".equals( getScope() ) ) { 211 removeSessionAttribute( tableId ); 212 removeSessionAttribute( HybsSystem.VIEWFORM_KEY ); 213 } 214 215 if( maxRowCount < 0 ) { 216 maxRowCount = sysInt( "DB_MAX_ROW_COUNT" ); 217 } 218 219 // ファイル の読み込み:AutoReader 処理 220 BufferedReader pw = null; 221 final String[] READER_CLASS ; 222 final String[] READER_ENCODE ; 223 if( "AutoReader".equalsIgnoreCase( readerClass ) ) { 224 // 4.3.1.1 (2008/10/08) 225 if( columns != null && columns.length() > 0 ) { 226 String errMsg = "columnsが指定されている場合は、readerClass=\"AutoReader\"は使えません"; 227 throw new HybsSystemException( errMsg ); // 4.3.4.4 (2009/01/01) 228 } 229 READER_CLASS = AUTO_READER_CLASS ; 230 READER_ENCODE = AUTO_READER_ENCODE; 231 } 232 else { 233 READER_CLASS = new String[] { readerClass }; 234 READER_ENCODE = new String[] { encode }; 235 } 236 237 StringBuilder tempMsg = new StringBuilder(); 238 for( int i=0; i<READER_CLASS.length; i++ ) { 239 readerClass = READER_CLASS[i]; 240 encode = READER_ENCODE[i]; 241 242 try { 243 // 5.1.8.0 (2010/07/01) AutoReaderのCalc対応 244 if( "Excel".equalsIgnoreCase( readerClass ) || "Calc".equalsIgnoreCase( readerClass ) ) { 245 create( null ); 246 } 247 else { 248 pw = getBufferedReader(); 249 create( pw ); 250 } 251 // 成功すれば、エラーメッセージをクリアして、その場で抜ける。 252 tempMsg = null; 253 break; 254 } 255 // 3.8.5.3 (2006/08/07) readerClassが "Excel"でエラーが発生したとき、もう一度Defaultで再読取を行います。 256 // 5.1.9.0 (2010/08/01) RuntimeException系のExceptionがキャッチできないため、Throwableで受ける 257 catch( Throwable th ) { 258 tempMsg.append( "readerClass=[" ).append( readerClass ) 259 .append( "],encode=[" ).append( encode ) 260 .append( "] Error!" ).append( HybsSystem.CR ) 261 .append( th.getMessage() ).append( HybsSystem.CR ) ; 262 } 263 finally { 264 Closer.ioClose( pw ); // 4.0.0 (2006/01/31) close 処理時の IOException を無視 265 } 266 } 267 268 if( tempMsg != null ) { // 最後までエラーがあれば、例外処理を発行します。 269 String errMsg = tempMsg.toString(); 270 System.err.print( errMsg ); 271 throw new HybsSystemException( errMsg ); // 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 272 } 273 274 if( table != null ) { 275 // 3.6.0.2 (2004/10/04) 276 // 4.0.0.0 (2007/10/12) checkTableColumn 前に、modifyType 設定を行います。 277 executeCount = table.getRowCount(); 278 if( modifyType != null ) { 279 for( int row=0; row<executeCount; row++ ) { 280 table.setModifyType( row,modifyType ); 281 } 282 } 283 284 ErrorMessage errMsg = checkTableColumn( table ); 285 if( errMsg != null && ! errMsg.isOK()) { 286 jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg,getResource() ) ); 287 return SKIP_PAGE ; 288 } 289 290 } 291 // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。 292 if( ! commitTableObject( tableId, table ) ) { 293 jspPrint( "ReadTableTag Query処理が割り込まれました。DBTableModel は登録しません。" ); 294 return SKIP_PAGE ; 295 } 296 297 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL ); 298 299 // 実行件数の表示 command="NEW" のときのみ、displayMsg を表示させます。 300 // 4.0.0 (2005/11/30) 出力順の変更。一番最初に出力します。 301 if( CMD_NEW.equals( command ) ) { 302 if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) { 303 buf.append( executeCount ); 304 buf.append( getResource().getLabel( displayMsg ) ); 305 buf.append( HybsSystem.BR ); 306 } 307 else if( executeCount == 0 && notfoundMsg != null && notfoundMsg.length() > 0 ) { 308 buf.append( getResource().getLabel( notfoundMsg ) ); 309 buf.append( HybsSystem.BR ); 310 } 311 } 312 313 // 4.3.7.0 (2009/06/01) 読込件数を、"DB.COUNT" キーでリクエストにセットする。 314 setRequestAttribute( "DB.COUNT" , String.valueOf( executeCount ) ); 315 316 jspPrint( buf.toString() ); 317 } 318 319 // 4.3.7.0 (2009/06/01) stopZero機能を追加 320 final int rtnCode ; 321 if( executeCount == 0 && stopZero ) { 322 rtnCode = SKIP_PAGE; 323 } 324 else { 325 rtnCode = EVAL_PAGE; 326 } 327 328 return rtnCode ; 329 } 330 331 /** 332 * タグリブオブジェクトをリリースします。 333 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 334 * 335 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 336 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 337 * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。 338 * @og.rev 3.1.4.0 (2003/04/18) command 属性に、初期値(NEW)を設定する。 339 * @og.rev 3.5.4.2 (2003/12/15) EXCELのシート名を指定できるように変更。 340 * @og.rev 3.5.4.5 (2004/01/23) 外部よりカラム列(カンマ区切り)を指定できるようにする。 341 * @og.rev 3.6.0.2 (2004/10/04) checkColumns,adjustColumns,allColumnCheck 属性追加 342 * @og.rev 3.7.0.5 (2005/04/11) useNumber 属性を追加します。 343 * @og.rev 3.8.0.2 (2005/06/30) nullCheck 属性追加 344 * @og.rev 3.8.5.3 (2006/08/07) readerClass 属性の初期値をシステムリソースより取得します。 345 * @og.rev 4.3.7.0 (2009/06/01) stopZero属性追加 346 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。 347 * @og.rev 5.1.6.0 (2010/05/01) データの読み飛ばし設定 skipRowCount 属性追加 348 * @og.rev 5.2.1.0 (2010/10/01) 読取処理でコードリソースのラベル変換を行うかどうか useRenderer 属性追加 349 * @og.rev 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるように、sheetNos属性追加 350 * @og.rev 5.5.8.2 (2012/11/09) 固定値となるカラム名、アドレスの指定のための、sheetConstKeys、sheetConstAdrs属性追加 351 * @og.rev 5.5.8.2 (2012/11/09) カラム列に NULL が現れた時点で読み取りを中止する、nullBreakClm属性追加 352 */ 353 @Override 354 protected void release2() { 355 super.release2(); 356 separator = TableReader.TAB_SEPARATOR; // 項目区切り文字 357 fileURL = HybsSystem.sys( "FILE_URL" ); 358 filename = HybsSystem.sys( "FILE_FILENAME" ); // ファイル名 359 encode = HybsSystem.sys( "FILE_ENCODE" ); // ファイルエンコーディング "JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS" 360 readerClass = HybsSystem.sys( "TABLE_READER_DEFAULT_CLASS" ); // 3.8.5.3 (2006/08/07) 361 maxRowCount = -1; 362 displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" ); 363 notfoundMsg = "MSG0077"; // 対象データはありませんでした。 364 executeCount = -1; // 検索/実行件数 365 modifyType = null; 366 command = CMD_NEW; 367 table = null; 368 tableId = HybsSystem.TBL_MDL_KEY ; 369 sheetName = null; // 3.5.4.2 (2003/12/15) 370 sheetNos = null ; // 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるようにする。 371 sheetConstKeys = null ; // 5.5.8.2 (2012/11/09) 固定値となるカラム名(CSV形式) 372 sheetConstAdrs = null ; // 5.5.8.2 (2012/11/09) 固定値となるアドレス(行-列,行-列,・・・) 373 nullBreakClm = null; // 5.5.8.2 (2012/11/09) 取込み条件/Sheet BREAK条件 374 columns = null; // 3.5.4.5 (2004/01/23) 375 useNumber = true; // 3.7.0.5 (2005/04/11) 376 adjustColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 377 checkColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 378 nullCheck = null; // 3.8.0.2 (2005/06/30) 379 stopZero = false; // 4.3.7.0 (2009/06/01) soptZero追加 380 isMainTrans = true; // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 381 skipRowCount = 0; // 5.1.6.0 (2010/05/01) データの読み飛ばし設定 382 useRenderer = HybsSystem.sysBool( "USE_TABLE_READER_RENDERER" ); // 5.2.1.0 (2010/10/01) 383 } 384 385 /** 386 * TableReader の実オブジェクトを生成して,BufferedReader に書き込みます。 387 * 388 * @og.rev 3.5.4.1 (2003/12/01) 引数の BufferedReader を、InputStream に変更。 389 * @og.rev 3.5.4.2 (2003/12/15) TableReader のサブクラス名変更。 390 * @og.rev 3.5.4.2 (2003/12/15) EXCELのシート名を指定できるように変更。 391 * @og.rev 3.5.4.3 (2004/01/05) 引数の InputStream を、 BufferedReader に戻す。 392 * @og.rev 3.5.4.5 (2004/01/23) TableReader に、encode を渡すように変更。 393 * @og.rev 3.5.6.0 (2004/06/18) 各種プラグイン関連付け設定を、システムパラメータ に記述します。 394 * @og.rev 3.7.0.5 (2005/04/11) useNumber 属性を追加します。 395 * @og.rev 4.0.0.0 (2005/01/31) キーの指定を、TableReader. から、TableReader_ に変更します。 396 * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更 397 * @og.rev 5.1.6.0 (2010/05/01) データの読み飛ばし設定 skipRowCount 属性追加 398 * @og.rev 5.2.1.0 (2010/10/01) 読取処理でコードリソースのラベル変換を行うかどうか設定 useRenderer 属性追加 399 * @og.rev 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるように、sheetNos属性追加 400 * @og.rev 5.5.8.2 (2012/11/09) 固定値となるカラム名、アドレスの指定のための、sheetConstKeys、sheetConstAdrs属性追加 401 * @og.rev 5.5.8.2 (2012/11/09) カラム列に NULL が現れた時点で読み取りを中止する、nullBreakClm属性追加 402 * 403 * @param out 出力するBufferedReaderオブジェクト 404 */ 405 protected void create( final BufferedReader out ) { 406 String className = HybsSystem.sys( "TableReader_" + readerClass ) ; // 4.0.0 (2005/01/31) 407 TableReader reader = (TableReader)HybsSystem.newInstance( className ); // 3.5.5.3 (2004/04/09) 408 reader.setResourceManager( getResource() ); // 4.0.0 (2005/01/31) 409 reader.setSeparator( separator ); 410 reader.setEncode( encode ); // 3.5.4.5 (2004/01/23) 411 reader.setColumns( columns ); // 3.5.4.5 (2004/01/23) 412 reader.setUseNumber( useNumber ); // 3.7.0.5 (2005/04/11) 413 reader.setMaxRowCount( maxRowCount ); 414 reader.setSkipRowCount( skipRowCount ); // 5.1.6.0 (2010/05/01) 415 reader.setUseRenderer( useRenderer ); // 5.2.1.0 (2010/10/01) 416 reader.setDebug( isDebug() ); // 5.5.7.2 (2012/10/09) デバッグ情報を出力するかどうかを指定 417 if( reader.isExcel() ) { // 3.5.4.3 (2004/01/05) 418 reader.setFilename( HybsSystem.url2dir( StringUtil.urlAppend( fileURL,filename ))); 419 reader.setSheetName( sheetName ); // 3.5.4.2 (2003/12/15) 420 reader.setSheetNos( sheetNos ); // 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるようにする。 421 reader.setSheetConstData( sheetConstKeys,sheetConstAdrs ) ; // 5.5.8.2 (2012/11/09) 固定値となるカラム名、アドレスの指定 422 reader.setNullBreakClm( nullBreakClm ) ; // 5.5.8.2 (2012/11/09) 取込み条件/Sheet BREAK条件 423 reader.readDBTable(); 424 } 425 else { 426 reader.readDBTable( out ); 427 } 428 table = reader.getDBTableModel(); 429 } 430 431 /** 432 * BufferedReader を取得します。 433 * 434 * ここでは、一般的なファイル出力を考慮した BufferedReader を作成します。 435 * 436 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 437 * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。 438 * @og.rev 3.5.4.1 (2003/12/01) 引数の BufferedReader を、InputStream に変更。 439 * @og.rev 3.5.4.3 (2004/01/05) 引数の InputStream を、 BufferedReader に戻す。 440 * @og.rev 3.5.5.9 (2004/06/07) FileUtil.getBufferedReader を使用 441 * 442 * @return ファイル読取BufferedReaderオブジェクト 443 */ 444 private BufferedReader getBufferedReader() { 445 if( filename == null ) { 446 String errMsg = "ファイル名がセットされていません。"; 447 throw new HybsSystemException( errMsg ); 448 } 449 String directory = HybsSystem.url2dir( fileURL ); 450 File file = new File( StringUtil.urlAppend( directory,filename ) ); 451 452 BufferedReader out = FileUtil.getBufferedReader( file,encode ); 453 454 return out ; 455 } 456 457 /** 458 * カラム文字列(CSV形式)から、カラム番号配列を作成します。 459 * 簡易メソッドです。 460 * 引数が、"*" の場合は、全カラムを指定したことになります。 461 * null の場合は、サイズが 0 の配列を返します。 462 * 463 * @og.rev 4.0.0.0 (2007/05/25) 新規作成 464 * 465 * @param clms カラム文字列(CSV形式) 466 * @param table DBTableModelオブジェクト 467 * 468 * @return カラム番号配列(無い場合は、長さ0の配列) 469 */ 470 private int[] makeClmNos( final String clms,final DBTableModel table ) { 471 final int[] clmNo; 472 473 if( clms == null ) { 474 clmNo = new int[0]; 475 } 476 else if( "*".equals( clms ) ) { 477 int size = table.getColumnCount(); 478 clmNo = new int[size]; 479 for( int i=0; i<size; i++ ) { 480 clmNo[i] = i; 481 } 482 } 483 else { 484 String[] clmStr = StringUtil.csv2Array( clms ); 485 int size = clmStr.length; 486 clmNo = new int[size]; 487 for( int i=0; i<size; i++ ) { 488 clmNo[i] = table.getColumnNo( clmStr[i] ); 489 } 490 } 491 492 return clmNo; 493 } 494 495 /** 496 * checkColumns に指定されたカラムをチェックします。 497 * カラムオブジェクトのDBType属性に対応したチェックを行います。 498 * チェック結果で、エラーが発生した場合は、ErrorMessage オブジェクトを 499 * 返します。 500 * DBColumn#valueCheck( String ) の結果のErrorMessageをすべて append 501 * していきます。 502 * useAdjust==true で、かつ、エラーがない場合は、adjustColumns 処理結果を 503 * DBTableModel に反映させます。 504 * debug=true で、エラー時の詳細なデータを出力します。 505 * 506 * @og.rev 3.6.0.2 (2004/10/04) 新規作成 507 * @og.rev 3.8.0.2 (2005/06/30) nullチェック確認 508 * @og.rev 4.0.0.0 (2007/05/25) 処理順序書き換え 509 * 510 * @param table DBTableModelオブジェクト 511 * 512 * @return カラムキー + 値 のエラーメッセージオブジェクト 513 */ 514 private ErrorMessage checkTableColumn( final DBTableModel table ) { 515 ErrorMessage errMsg = new ErrorMessage( "Check Columns Error!" ); 516 517 int rowCnt = table.getRowCount(); 518 int[] adjClmNo = makeClmNos( adjustColumns,table ); 519 int[] chkClmNo = makeClmNos( checkColumns,table ); 520 int[] nllclmNo = makeClmNos( nullCheck,table ); 521 522 boolean useAdjust = adjClmNo.length > 0 ; 523 524 for( int row=0; row<rowCnt; row++ ) { 525 String[] vals = table.getValues( row ); 526 DBColumn[] dbClms = table.getDBColumns(); 527 boolean isError = false; // 5.5.7.2 (2012/10/09) エラー時のフラグ。ループでクリアする。 528 529 // adjustColumns 処理 530 for( int i=0; i<adjClmNo.length; i++ ) { 531 int no = adjClmNo[i]; 532 vals[no] = dbClms[no].valueSet( vals[no] ); 533 } 534 535 // checkColumns 処理 536 for( int i=0; i<chkClmNo.length; i++ ) { 537 int no = chkClmNo[i]; 538 ErrorMessage msg = dbClms[no].valueCheck( vals[no] ); 539 if( msg.getKekka() > ErrorMessage.OK ) { 540 isError = true; 541 errMsg.append( row+1,dbClms[no].valueCheck( vals[no] ) ); 542 } 543 } 544 545 // nullCheck 処理 546 for( int i=0; i<nllclmNo.length; i++ ) { 547 int no = nllclmNo[i]; 548 if( vals[no] == null || vals[no].length() == 0 ) { 549 isError = true; 550 String label = dbClms[no].getLabel(); 551 // ERR0012 : 指定のデータがセットされていません。(NULLエラー)。key={0} 552 errMsg.addMessage( row+1,ErrorMessage.NG,"ERR0012",label ); 553 } 554 } 555 556 // 5.5.7.2 (2012/10/09) エラー時のデバッグ出力 557 if( isDebug() && isError ) { 558 errMsg.addMessage( row+1,ErrorMessage.OK,"Debug Info",java.util.Arrays.toString(table.getValues(row) ) ); 559 } 560 561 // adjustColumns 処理結果を反映させます。 562 if( useAdjust && !isError ) { table.setValues( vals,row ); } 563 if( errMsg.size() > ERROR_ROW_COUNT ) { break; } 564 } 565 566 return errMsg; 567 } 568 569 /** 570 * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します 571 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。 572 * 573 * @og.tag 574 * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に 575 * 渡す場合に、通常は、session を利用します。その場合の登録キーです。 576 * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、 577 * この tableId 属性を利用して、メモリ空間を分けます。 578 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。 579 * 580 * @param id sessionに登録する時の ID 581 */ 582 public void setTableId( final String id ) { 583 tableId = nval( getRequestParameter( id ), tableId ); 584 } 585 586 /** 587 * 【TAG】可変長ファイルを作成するときの項目区切り文字をセットします。 588 * 589 * @og.tag 可変長ファイルを作成するときの項目区切り文字をセットします。 590 * 591 * @param separator 項目区切り文字 592 */ 593 public void setSeparator( final String separator ) { 594 this.separator = nval( getRequestParameter( separator ),this.separator ); 595 } 596 597 /** 598 * 【TAG】読み取り元ディレクトリ名を指定します 599 * (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])。 600 * 601 * @og.tag 602 * この属性で指定されるディレクトリより、ファイルを読み取ります。 603 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 604 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 605 * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、 606 * さらに、各個人ID別のフォルダを作成して、そこを操作します。 607 * (初期値:システム定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])。 608 * 609 * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用 610 * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。 611 * 612 * @param url 読み取り元ディレクトリ名 613 * @see org.opengion.hayabusa.common.SystemData#FILE_URL 614 */ 615 public void setFileURL( final String url ) { 616 String furl = nval( getRequestParameter( url ),null ); 617 if( furl != null ) { 618 char ch = furl.charAt( furl.length()-1 ); 619 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; } 620 fileURL = StringUtil.urlAppend( fileURL,furl ); 621 } 622 } 623 624 /** 625 * 【TAG】ファイルを作成するときのファイル名をセットします 626 * (初期値:FILE_FILENAME[={@og.value org.opengion.hayabusa.common.SystemData#FILE_FILENAME}])。 627 * 628 * @og.tag ファイルを作成するときのファイル名をセットします。 629 * (初期値:システム定数のFILE_FILENAME[={@og.value org.opengion.hayabusa.common.SystemData#FILE_FILENAME}])。 630 * 631 * @param filename ファイル名 632 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK 633 */ 634 public void setFilename( final String filename ) { 635 this.filename = nval( getRequestParameter( filename ),this.filename ); 636 } 637 638 /** 639 * 【TAG】ファイルを作成するときのファイルエンコーディング名をセットします 640 * (初期値:FILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。 641 * 642 * @og.tag 643 * Shift_JIS,MS932,Windows-31J,UTF-8,ISO-8859-1,UnicodeLittle 644 * (初期値:システム定数のFILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。 645 * 646 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 647 * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。 648 * 649 * @param enc ファイルエンコーディング名 650 * @see <a href="http://www.iana.org/assignments/character-sets">IANA Charset Registry</a> 651 * @see org.opengion.hayabusa.common.SystemData#FILE_ENCODE 652 */ 653 public void setEncode( final String enc ) { 654 encode = nval( getRequestParameter( enc ),encode ); 655 } 656 657 /** 658 * 【TAG】実際に読み出すクラス名の略称(TableReader_**** の ****)をセットします({@og.doc03Link readerClass 初期値:Default})。 659 * 660 * @og.tag 661 * 実際に読み出すクラス名(の略称)をセットします。 662 * これは、org.opengion.hayabusa.io 以下の TableReader_**** クラスの **** を 663 * 与えます。これらは、TableReader インターフェースを継承したサブクラスです。 664 * 属性クラス定義の {@link org.opengion.hayabusa.io.TableReader TableReader} を参照願います。 665 * {@og.doc03Link readerClass TableReader_**** クラス} 666 * 667 * @param readerClass クラス名(の略称) 668 * @see org.opengion.hayabusa.io.TableReader TableReaderのサブクラス 669 */ 670 public void setReaderClass( final String readerClass ) { 671 this.readerClass = nval( getRequestParameter( readerClass ),this.readerClass ); 672 } 673 674 /** 675 * 【TAG】読取時の最大取り込み件数をセットします 676 * (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。 677 * 678 * @og.tag 679 * DBTableModelのデータとして登録する最大件数をこの値に設定します。 680 * サーバーのメモリ資源と応答時間の確保の為です。 681 * 0 をセットすると、無制限(Integer.MAX_VALUE)になります。 682 * (初期値:ユーザー定数のDB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。 683 * 684 * @og.rev 5.5.8.5 (2012/11/27) 0を無制限として処理します。 685 * 686 * @param count 読取時の最大取り込み件数 687 * @see org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT 688 */ 689 public void setMaxRowCount( final String count ) { 690 maxRowCount = nval( getRequestParameter( count ),maxRowCount ); 691 if( maxRowCount == 0 ) { maxRowCount = Integer.MAX_VALUE ; } // 5.5.8.5 (2012/11/27) 692 } 693 694 /** 695 * 【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW)。 696 * 697 * @og.tag 698 * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される 699 * フィールド定数値のいづれかを、指定できます。 700 * 何も設定されない、または、null の場合は、"NEW" が初期値にセットされます。 701 * 702 * @param cmd コマンド(public static final 宣言されている文字列) 703 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ReadTableTag.CMD_NEW">コマンド定数</a> 704 */ 705 public void setCommand( final String cmd ) { 706 String cmd2 = getRequestParameter( cmd ); 707 if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); } 708 } 709 710 /** 711 * 【TAG】query の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0033[ 件検索しました])。 712 * 713 * @og.tag 714 * ここでは、検索結果の件数や登録された件数をまず出力し、 715 * その次に、ここで指定したメッセージをリソースから取得して 716 * 表示します。 717 * 表示させたくない場合は, displayMsg = "" をセットしてください。 718 * 初期値は、検索件数を表示します。 719 * 720 * @param id ディスプレイに表示させるメッセージ ID 721 */ 722 public void setDisplayMsg( final String id ) { 723 if( id != null ) { displayMsg = id; } 724 } 725 726 /** 727 * 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])。 728 * 729 * @og.tag 730 * ここでは、検索結果がゼロ件の場合のみ、特別なメッセージを表示させます。 731 * 従来は、displayMsg と兼用で、『0 件検索しました』という表示でしたが、 732 * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合のみ別に表示させます。 733 * 表示させたくない場合は, notfoundMsg = "" をセットしてください。 734 * 初期値は、MSG0077[対象データはありませんでした]です。 735 * 736 * @param id ディスプレイに表示させるメッセージ ID 737 */ 738 public void setNotfoundMsg( final String id ) { 739 String ids = getRequestParameter( id ); 740 if( ids != null ) { notfoundMsg = ids; } 741 } 742 743 /** 744 * 【TAG】ファイル取り込み時の モディファイタイプ(A(追加),C(更新),D(削除))を指定します。 745 * 746 * @og.tag 747 * ファイル読み込み時に、そのデータをA(追加)、C(更新)、D(削除)の 748 * モディファイタイプをつけた状態にします。 749 * その状態で、そのまま、update する事が可能になります。 750 * 751 * @param type ファイル取り込み時の モディファイタイプ(A,C,D属性) 752 */ 753 public void setModifyType( final String type ) { 754 modifyType = getRequestParameter( type ); 755 } 756 757 /** 758 * 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)。 759 * 760 * @og.tag 761 * EXCELファイルを読み込む時に、シート名を指定します。これにより、複数の形式の 762 * 異なるデータを順次読み込むことや、シートを指定して読み取ることが可能になります。 763 * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。 764 * 初期値は、指定なしです。 765 * 766 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 767 * 768 * @param sheet EXCELファイルのシート名 769 * @see #setSheetNos( String ) 770 */ 771 public void setSheetName( final String sheet ) { 772 sheetName = nval( getRequestParameter( sheet ),sheetName ); 773 } 774 775 /** 776 * 【TAG】EXCELファイルを読み込むときのシート番号を指定します(初期値:0)。 777 * 778 * @og.tag 779 * EXCEL読み込み時に複数シートをマージして取り込みます。 780 * シート番号は、0 から始まる数字で表します。 781 * ヘッダーは、最初のシートのカラム位置に合わせます。(ヘッダータイトルの自動認識はありません。) 782 * よって、指定するシートは、すべて同一レイアウトでないと取り込み時にカラムのずれが発生します。 783 * 784 * シート番号の指定は、カンマ区切りで、複数指定できます。また、N-M の様にハイフンで繋げることで、 785 * N 番から、M 番のシート範囲を一括指定可能です。また、"*" による、全シート指定が可能です。 786 * これらの組み合わせも可能です。( 0,1,3,5-8,10-* ) 787 * ただし、"*" に関しては例外的に、一文字だけで、すべてのシートを表すか、N-* を最後に指定するかの 788 * どちらかです。途中には、"*" は、現れません。 789 * シート番号は、重複(1,1,2,2)、逆転(3,2,1) での指定が可能です。これは、その指定順で、読み込まれます。 790 * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。 791 * 792 * 初期値は、0(第一シート) です。 793 * 794 * @og.rev 5.5.7.2 (2012/10/09) 新規追加 795 * 796 * @param sheet EXCELファイルのシート番号(0から始まる) 797 * @see #setSheetName( String ) 798 */ 799 public void setSheetNos( final String sheet ) { 800 sheetNos = nval( getRequestParameter( sheet ),sheetNos ); 801 if( sheetNos != null && sheetNos.length() > 0 ) { 802 boolean errFlag = false; 803 for( int i=0; i<sheetNos.length(); i++ ) { 804 char ch = sheetNos.charAt(i); 805 if( ch == '-' || ch == ',' ) { continue; } 806 if( ch == '*' && ( i==0 || i==sheetNos.length()-1 ) ) { continue; } 807 if( ch < '0' || ch > '9' ) { errFlag = true; break; } 808 } 809 if( errFlag ) { 810 String errMsg = "sheetNos の指定を見直してください。sheetNos=[" + sheetNos + "]"; 811 throw new HybsSystemException( errMsg ); 812 } 813 } 814 } 815 816 /** 817 * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのカラム名を指定します。 818 * 819 * @og.tag 820 * カラム名は、カンマ区切りで指定します。 821 * これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として 822 * 設定することができます。 823 * 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。 824 * このメソッドは、isExcel() == true の場合のみ利用されます。 825 * 826 * @og.rev 5.5.8.2 (2012/11/09) 新規追加 827 * 828 * @param constKeys 固定値となるカラム名(CSV形式) 829 * @see #setSheetConstAdrs( String ) 830 */ 831 public void setSheetConstKeys( final String constKeys ) { 832 sheetConstKeys = nval( getRequestParameter( constKeys ),null ); 833 } 834 835 /** 836 * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのカラム名に対応するアドレスを指定します。 837 * 838 * @og.tag 839 * アドレスは、EXCEL上の行-列をカンマ区切りで指定します。 840 * 行列は、EXCELオブジェクトに準拠するため、0から始まる整数です。 841 * 0-0 ⇒ A1 , 1-0 ⇒ A2 , 0-1 ⇒ B1 になります。 842 * これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として 843 * 設定することができます。 844 * 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。 845 * このメソッドは、isExcel() == true の場合のみ利用されます。 846 * 847 * 5.7.6.3 (2014/05/23) より、 848 * @EXCEL表記に準拠した、A1,A2,B1 の記述も処理できるように対応します。 849 * なお、A1,A2,B1 の記述は、必ず、英字1文字+数字 にしてください。(A〜Zまで) 850 * A処理中のEXCELシート名をカラムに割り当てるために、"SHEET" という記号に対応します。 851 * 例えば、sheetConstKeys="CLM,LANG,NAME" とし、sheetConstAdrs="0-0,A2,SHEET" とすると、 852 * NAMEカラムには、シート名を読み込むことができます。 853 * これは、内部処理の簡素化のためです。 854 * 855 * ちなみに、EXCELのセルに、シート名を表示させる場合の関数は、下記の様になります。 856 * =RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1))) 857 * 858 * @og.rev 5.5.8.2 (2012/11/09) 新規追加 859 * 860 * @param constAdrs 固定値となるアドレス(行-列,行-列,・・・) 861 * @see #setSheetConstKeys( String ) 862 */ 863 public void setSheetConstAdrs( final String constAdrs ) { 864 sheetConstAdrs = nval( getRequestParameter( constAdrs ),null ); 865 } 866 867 /** 868 * 【TAG】ここに指定されたカラム列に NULL が現れた時点で読み取りを中止します。 869 * 870 * @og.tag 871 * これは、指定のカラムは必須という事を条件に、そのレコードだけを読み取る処理を行います。 872 * 複数Sheetの場合は、次のSheetを読みます。 873 * 現時点では、Excel の場合のみ有効です。 874 * 875 * @og.rev 5.5.8.2 (2012/11/09) 新規追加 876 * 877 * @param clm カラム列 878 */ 879 public void setNullBreakClm( final String clm ) { 880 nullBreakClm = nval( getRequestParameter( clm ),null ); 881 } 882 883 /** 884 * 【TAG】読み取り元ファイルのカラム列を、外部(タグ)より指定します。 885 * 886 * @og.tag 887 * 読み取り元ファイルのカラム列を、外部(タグ)より指定します。 888 * ファイルに記述された #NAME より優先して使用されます。 889 * これは、元ファイルのカラムを順番に指定のカラム名に割り当てる機能で 890 * ファイルの特定のカラム列を抜き出して取り込む機能ではありません。 891 * 892 * @og.rev 3.5.4.5 (2004/01/23) 新規作成 893 * 894 * @param clms 読み取り元ファイルのカラム列(カンマ区切り文字) 895 */ 896 public void setColumns( final String clms ) { 897 columns = nval( getRequestParameter( clms ),columns ); 898 } 899 900 /** 901 * 【TAG】読み取り元ファイルの整合性チェックを行うカラム列をカンマ指定します。 902 * 903 * @og.tag 904 * カラムオブジェクトのDBType属性に対応したチェックを行います。 905 * 指定のカラム名をカンマ区切り(CSV)で複数指定できます。 906 * 全てのカラムのチェックを行う場合は、allColumnCheck = "true" を 907 * 指定して下さい。 908 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 909 * 910 * @og.rev 3.6.0.2 (2004/10/04) 新規追加 取り込み時チェック用 911 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV分解に戻します。 912 * 913 * @param clms 整合性チェックを行うカラム列(カンマ区切り文字) 914 */ 915 public void setCheckColumns( final String clms ) { 916 checkColumns = nval( getRequestParameter( clms ),checkColumns ); 917 } 918 919 /** 920 * 【TAG】読み取り元ファイルのデータ変換を行うカラム列をカンマ指定します。 921 * 922 * @og.tag 923 * カラムオブジェクトのDBType属性に対応したデータ変換を行います。 924 * 指定のカラム名をカンマ区切り(CSV)で複数指定できます。 925 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 926 * 927 * @og.rev 3.6.0.2 (2004/10/04) 新規追加 取り込み時データ変換 928 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV分解に戻します。 929 * 930 * @param clms データ変換を行うカラム列(カンマ区切り文字) 931 */ 932 public void setAdjustColumns( final String clms ) { 933 adjustColumns = nval( getRequestParameter( clms ),adjustColumns ); 934 } 935 936 /** 937 * 【TAG】NULL チェックすべきカラム列をカンマ区切り(CVS形式)で指定します。 938 * 939 * @og.tag nullCheck="AAA,BBB,CCC,DDD" 940 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 941 * 942 * @og.rev 3.8.0.2 (2005/06/30) 新規追加 943 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV分解に戻します。 944 * 945 * @param clms カラム列(CVS形式) 946 */ 947 public void setNullCheck( final String clms ) { 948 nullCheck = nval( getRequestParameter( clms ),nullCheck ); 949 } 950 951 /** 952 * 【TAG】行番号情報を、使用している/していない[true/false]を指定します(初期値:true)。 953 * 954 * @og.tag 955 * 通常のフォーマットでは、各行の先頭に行番号が出力されています。 956 * 読み取り時に、#NAME 属性を使用する場合は、この行番号を無視しています。 957 * #NAME 属性を使用せず、columns 属性でカラム名を指定する場合(他システムの 958 * 出力ファイルを読み取るケース等)では、行番号も存在しないケースがあり、 959 * その様な場合に、useNumber="false" を指定すれば、データの最初から読み取り始めます。 960 * この場合、出力データのカラムの並び順が変更された場合、columns 属性も 961 * 指定しなおす必要がありますので、できるだけ、#NAME 属性を使用するように 962 * してください。 963 * なお、EXCEL 入力には、この設定は適用されません。(暫定対応) 964 * 初期値は、true(使用する) です。 965 * 966 * @og.rev 3.7.0.5 (2005/04/11) 新規追加 967 * 968 * @param useNo 行番号情報 [true:使用する/false:使用しない] 969 */ 970 public void setUseNumber( final String useNo ) { 971 useNumber = nval( getRequestParameter( useNo ),useNumber ); 972 } 973 974 /** 975 * 【TAG】読込件数が0件のとき処理を続行するかどうか[true/false]を指定します(初期値:false[続行する])。 976 * 977 * @og.tag 978 * 初期値は、false(続行する)です。 979 * 980 * @og.rev 4.3.7.0 (2009/06/01) 新規追加 981 * 982 * @param cmd 読込件数が0件のとき、処理を [true:中止する/false:続行する] 983 */ 984 public void setStopZero( final String cmd ) { 985 stopZero = nval( getRequestParameter( cmd ), stopZero ); 986 } 987 988 /** 989 * 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。 990 * 991 * @og.tag 992 * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが 993 * ファイルダウンロードの対象の表になります。 994 * 995 * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。 996 * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい 997 * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から 998 * 除外することができます。 999 * 1000 * @og.rev 5.1.6.0 (2010/05/01) 新規作成 1001 * 1002 * @param flag メイントランザクションかどうか 1003 */ 1004 public void setMainTrans( final String flag ) { 1005 isMainTrans = nval( getRequestParameter( flag ),isMainTrans ); 1006 } 1007 1008 /** 1009 * 【TAG】(通常は使いません)データの読み飛ばし件数を設定します。 1010 * 1011 * @og.tag 1012 * TAB区切りテキストやEXCEL等のデータの読み始めの初期値を指定します。 1013 * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす 1014 * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。) 1015 * 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。 1016 * #NAME属性や、columns 属性は、有効です。 1017 * 1018 * @og.rev 5.1.6.0 (2010/05/01) 新規作成 1019 * 1020 * @param count 読み始めの初期値 1021 */ 1022 public void setSkipRowCount( final String count ) { 1023 skipRowCount = nval( getRequestParameter( count ),skipRowCount ); 1024 } 1025 1026 /** 1027 * 【TAG】読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します 1028 * (初期値:USE_TABLE_READER_RENDERER[={@og.value org.opengion.hayabusa.common.SystemData#USE_TABLE_READER_RENDERER}])。 1029 * 1030 * @og.tag 1031 * TableWriter_Renderer 系のクラスで出力した場合は、コードリソースがラベルで出力されます。 1032 * そのファイルを読み取ると、当然、エラーになります。 1033 * ここでは、コードリソースのカラムに対して、ラベルからコードを求める逆変換を行うことで、 1034 * Renderer 系で出力したファイルを取り込むことができるようにします。 1035 * 1036 * ここでは、TableWriter 系と同様に、TableReader_Renderer 系のクラスを作るのではなく、 1037 * 属性値のフラグで、制御します。 1038 * 将来的には、TableWriter 系も廃止して、同様のフラグで制御するように変更する予定です。 1039 * (初期値:システム定数のUSE_TABLE_READER_RENDERER[={@og.value org.opengion.hayabusa.common.SystemData#USE_TABLE_READER_RENDERER}])。 1040 * 1041 * @og.rev 5.2.1.0 (2010/10/01) 新規作成 1042 * 1043 * @param flag コードリソースのラベル逆変換を行うかどうか 1044 * @see org.opengion.hayabusa.common.SystemData#USE_TABLE_READER_RENDERER 1045 */ 1046 public void setUseRenderer( final String flag ) { 1047 useRenderer = nval( getRequestParameter( flag ),useRenderer ); 1048 } 1049 1050 /** 1051 * シリアライズ用のカスタムシリアライズ書き込みメソッド 1052 * 1053 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1054 * @serialData 一部のオブジェクトは、シリアライズされません。 1055 * 1056 * @param strm ObjectOutputStreamオブジェクト 1057 * @throws IOException 入出力エラーが発生した場合 1058 */ 1059 private void writeObject( final ObjectOutputStream strm ) throws IOException { 1060 strm.defaultWriteObject(); 1061 } 1062 1063 /** 1064 * シリアライズ用のカスタムシリアライズ読み込みメソッド 1065 * 1066 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 1067 * 1068 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1069 * @serialData 一部のオブジェクトは、シリアライズされません。 1070 * 1071 * @param strm ObjectInputStreamオブジェクト 1072 * @see #release2() 1073 * @throws IOException シリアライズに関する入出力エラーが発生した場合 1074 * @throws ClassNotFoundException クラスを見つけることができなかった場合 1075 */ 1076 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 1077 strm.defaultReadObject(); 1078 } 1079 1080 /** 1081 * このオブジェクトの文字列表現を返します。 1082 * 基本的にデバッグ目的に使用します。 1083 * 1084 * @return このクラスの文字列表現 1085 */ 1086 @Override 1087 public String toString() { 1088 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 1089 .println( "VERSION" ,VERSION ) 1090 .println( "separator" ,separator ) 1091 .println( "fileURL" ,fileURL ) 1092 .println( "filename" ,filename ) 1093 .println( "encode" ,encode ) 1094 .println( "readerClass" ,readerClass ) 1095 .println( "maxRowCount" ,maxRowCount ) 1096 .println( "displayMsg" ,displayMsg ) 1097 .println( "executeCount" ,executeCount ) 1098 .println( "modifyType" ,modifyType ) 1099 .println( "checkColumns" ,checkColumns ) 1100 .println( "adjustColumns" ,adjustColumns ) 1101 .println( "nullCheck" ,nullCheck ) 1102 .println( "command" ,command ) 1103 .println( "tableId" ,tableId ) 1104 .println( "sheetName" ,sheetName ) 1105 .println( "sheetNos" ,sheetNos ) // 5.5.7.2 (2012/10/09) 1106 .println( "columns" ,columns ) 1107 .println( "useNumber" ,useNumber ) 1108 .println( "Other..." ,getAttributes().getAttribute() ) 1109 .fixForm().toString() ; 1110 } 1111}