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.io; 017 018import java.io.PrintWriter; 019import java.util.List; 020import java.util.Locale; 021import java.util.Map; 022import java.util.Map.Entry; 023 024import org.opengion.hayabusa.common.HybsSystem; 025import org.opengion.hayabusa.common.HybsSystemException; 026import org.opengion.hayabusa.db.DBTableModel; 027import org.opengion.hayabusa.db.DBColumn; 028import org.opengion.fukurou.util.StringUtil; 029import org.opengion.fukurou.util.HybsEntry; 030 031/** 032 * 区切り文字指定(初期値:タブ)ゼロカンマファイルの書き出しクラスです。 033 * 034 * ラベル,名前,データの出力部のみオーバーライドすれば,各種出力フォーマットに合わせた 035 * サブクラスを実現する事が可能です。 036 * ゼロカンマファイルとは、EXCELのゼロサプレス対策として、頭ゼロの文字型データを出力する 037 * 時に、先頭にカンマ(')を付けて、ゼロが削除(見えなくなる)現象を抑止しているファイルです。 038 * 039 * このクラスは,可変長タブ区切り文字ファイルの出力機能を実現しています。 040 * 041 * @og.group ファイル出力 042 * 043 * @version 4.0 044 * @author Kazuhiko Hasegawa 045 * @since JDK5.0, 046 */ 047public abstract class AbstractTableWriter implements TableWriter { 048 /** このプログラムのVERSION文字列を設定します。 {@value} */ 049 private static final String VERSION = "5.7.9.0 (2014/08/08)" ; 050 051 // 5.1.6.0 (2010/05/01) dbType の簡易的な設定 052 /** dbType の簡易的な設定 {@value} */ 053 public static final int STRING = 0; 054 /** dbType の簡易的な設定 {@value} */ 055 public static final int NVAR = 1; 056 /** dbType の簡易的な設定 {@value} */ 057 public static final int NUMBER = 2; 058 059 protected DBTableModel table = null; 060 protected DBColumn[] dbColumn = null; // table に対するカラムオブジェクト(キャッシュ) 061 protected int numberOfColumns = -1; // 4.0.0 (2005/01/31) 出力対象のカラム数 062 protected int[] clmNo = null; // 出力対象のカラム番号配列 063 protected int[] dbType = null; 064 065 private String separator = TAB_SEPARATOR; // 項目区切り文字 066 private String headerSequence = HybsSystem.sys( "WRITER_HEADER_SEQUENCE" ) ; 067 private boolean append = false; // 3.5.4.2 (2003/12/15) 068 private String lang = null; 069 private String columns = null; // 4.0.0 (2005/11/30) 外部指定のカラム名 070 private String encode = null; // 3.5.4.5 (2004/01/23) エンコード文字列指定 071 072 private boolean useNumber = true; // 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 073 private boolean useRenderer = false; // 5.2.1.0 (2010/10/01) 074 075 /** 076 * DBTableModel から 各形式のデータを作成して,PrintWriter に書き出します。 077 * このメソッドは、EXCEL 書き出し時に使用します。 078 * 079 * @see #isExcel() 080 */ 081 abstract public void writeDBTable(); 082 083 /** 084 * DBTableModel から データを作成して,PrintWriter に書き出します。 085 * 086 * @param writer PrintWriterオブジェクト 087 */ 088 abstract public void writeDBTable( final PrintWriter writer ); 089 090 /** 091 * numberOfColumns と DBColumn を初期化します。 092 * 内部的に、DBTableModel、lang , columns を使用して、 093 * numberOfColumns 、dbColumn、clmNo、dbType の値を初期化します。 094 * カラムが1項目もない場合、言語(lnag)が未指定、DBTableModelが未指定(null) 095 * の場合は、false を返します。その場合は、以下の処理は正常に行えません。 096 * データが0件の場合は、処理を行います。通常、ヘッダーのみのファイルを 097 * 作成することになります。(これを雛形として、取込データを登録する事が可能) 098 * 099 * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用 100 * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値を設定する。 101 * 102 * @return 初期化成功:true / 失敗:false 103 */ 104 protected boolean createDBColumn() { 105 106 boolean rtnFlag = false; 107 if( lang != null && table != null ) { 108 if( columns != null ) { 109 String[] clms = StringUtil.csv2Array( columns ); 110 numberOfColumns = clms.length; 111 clmNo = new int[numberOfColumns]; 112 for( int i=0; i<numberOfColumns; i++ ) { 113 int no = table.getColumnNo( clms[i] ); 114 clmNo[i] = no; 115 } 116 } 117 else { 118 numberOfColumns = table.getColumnCount(); 119 clmNo = new int[numberOfColumns]; 120 for( int i=0; i<numberOfColumns; i++ ) { 121 clmNo[i] = i; 122 } 123 } 124 125 dbColumn = table.getDBColumns(); 126 rtnFlag = (numberOfColumns > 0); // カラムが1項目以上あれば成功 127 128 // 5.1.6.0 (2010/05/01) DbType の初期値を設定する。 129 dbType = new int[numberOfColumns]; 130 for( int i=0; i<numberOfColumns; i++ ) { 131 String type = dbColumn[clmNo[i]].getDbType(); 132 133 if( "NVAR".equals( type ) ) { 134 dbType[i] = NVAR; 135 } 136 else if( "S9".equals( type ) || "R".equals( type ) ) { 137 dbType[i] = NUMBER; 138 } 139 else { 140 dbType[i] = STRING; 141 } 142 } 143 } 144 return rtnFlag; 145 } 146 147 /** 148 * PrintWriter に DBTableModelのヘッダー情報を書き込みます。 149 * 150 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 151 * 152 * @param writer PrintWriterオブジェクト 153 */ 154 protected void writeHeader( final PrintWriter writer ) { 155 // ここでは処理を行いません。 156 } 157 158 /** 159 * PrintWriter に DBTableModelのラベル情報を書き込みます。 160 * 第一カラム目は、ラベル情報を示す "#Label" を書き込みます。 161 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 162 * 163 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 164 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 165 * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用 166 * 167 * @param table DBTableModelオブジェクト 168 * @param writer PrintWriterオブジェクト 169 */ 170 protected void writeLabel( final DBTableModel table,final PrintWriter writer ) { 171 if( useNumber ) { 172 writer.print( "#Label" ); 173 writer.print( separator ); 174 } 175 else { 176 writer.print( "#" ); 177 } 178 179 for( int i=0; i<numberOfColumns; i++ ) { 180 if( i != 0 ) { writer.print( separator ); } 181 int clm = clmNo[i]; 182 writer.print( dbColumn[clm].getLabel() ); 183 } 184 writer.println(); 185 } 186 187 /** 188 * PrintWriter に DBTableModelの項目名情報を書き込みます。 189 * 第一カラム目は、項目名情報を示す "#Name" を書き込みます。 190 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 191 * 192 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 193 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 194 * 195 * @param table DBTableModelオブジェクト 196 * @param writer PrintWriterオブジェクト 197 */ 198 protected void writeName( final DBTableModel table,final PrintWriter writer ) { 199 if( useNumber ) { 200 writer.print( "#Name" ); 201 writer.print( separator ); 202 } 203 else { 204 writer.print( "#" ); 205 } 206 207 for( int i=0; i<numberOfColumns; i++ ) { 208 if( i != 0 ) { writer.print( separator ); } 209 int clm = clmNo[i]; 210 writer.print( table.getColumnName(clm) ); 211 } 212 writer.println(); 213 } 214 215 /** 216 * PrintWriter に DBTableModelのサイズ情報を書き込みます。 217 * 第一カラム目は、サイズ情報を示す "#Size" を書き込みます。 218 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 219 * 220 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 221 * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更 222 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 223 * 224 * @param table DBTableModelオブジェクト 225 * @param writer PrintWriterオブジェクト 226 */ 227 protected void writeSize( final DBTableModel table,final PrintWriter writer ) { 228 if( useNumber ) { 229 writer.print( "#Size" ); 230 writer.print( separator ); 231 } 232 else { 233 writer.print( "#" ); 234 } 235 236 for( int i=0; i<numberOfColumns; i++ ) { 237 if( i != 0 ) { writer.print( separator ); } 238 int clm = clmNo[i]; 239 writer.print( dbColumn[clm].getTotalSize() ); // 4.0.0 (2005/01/31) メソッド名変更 240 } 241 writer.println(); 242 } 243 244 /** 245 * PrintWriter に DBTableModelのクラス名情報を書き込みます。 246 * 第一カラム目は、サイズ情報を示す "#Class" を書き込みます。 247 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 248 * 249 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 250 * 251 * @param table DBTableModelオブジェクト 252 * @param writer PrintWriterオブジェクト 253 */ 254 protected void writeClass( final DBTableModel table,final PrintWriter writer ) { 255 if( useNumber ) { 256 writer.print( "#Class" ); 257 writer.print( separator ); 258 } 259 else { 260 writer.print( "#" ); 261 } 262 263 for( int i=0; i<numberOfColumns; i++ ) { 264 if( i != 0 ) { writer.print( separator ); } 265 int clm = clmNo[i]; 266 writer.print( dbColumn[clm].getClassName() ); 267 } 268 writer.println(); 269 } 270 271 /** 272 * PrintWriter に セパレーターを書き込みます。 273 * 第一カラム目は、サイズ情報を示す "#----" を書き込みます。 274 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 275 * 276 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 277 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 278 * 279 * @param table DBTableModelオブジェクト 280 * @param writer PrintWriterオブジェクト 281 */ 282 protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) { 283 String sep = "----" ; 284 if( useNumber ) { 285 writer.print( "#----" ); 286 writer.print( separator ); 287 } 288 else { 289 writer.print( "#" ); 290 } 291 292 for( int i=0; i<numberOfColumns; i++ ) { 293 if( i != 0 ) { writer.print( separator ); } 294 writer.print( sep ); 295 } 296 writer.println(); 297 } 298 299 /** 300 * PrintWriter に DBTableModelのテーブル情報を書き込みます。 301 * このクラスでは,データを ダブルコーテーション(")で囲みます。 302 * PrintWriter に DBTableModelのテーブル情報を書き込みます。 303 * 304 * @og.rev 2.0.0.5 (2002/09/30) 先頭が0 でかつ数字タイプ(S9 or R)でない場合に ' を出力するように修正。 305 * @og.rev 2.3.1.2 (2003/01/28) データ出力時に、改行が余分に出される箇所を修正。 306 * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出す 307 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 308 * @og.rev 3.3.3.1 (2003/07/18) ファイルリード/ライト時に後ろスペースの除去を行います。 309 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 310 * @og.rev 3.8.0.1 (2005/06/17) DBTypeが NVAR の場合は、元のUnicodeに戻します。 311 * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用する。 312 * @og.rev 5.2.1.0 (2010/10/01) このメソッドは、abstract 化します。 313 * 314 * @param table DBTableModelオブジェクト 315 * @param writer PrintWriterオブジェクト 316 */ 317 abstract protected void writeData( final DBTableModel table,final PrintWriter writer ) ; 318// protected void writeData( final DBTableModel table,final PrintWriter writer ) { 319// int numberOfRows = table.getRowCount(); 320// 321// for( int row=0; row<numberOfRows; row++ ) { 322// if( useNumber ) { 323// writer.print( row+1 ); 324// writer.print( separator ); 325// } 326// 327// for( int i=0; i<numberOfColumns; i++ ) { 328// if( i != 0 ) { writer.print( separator ); } 329// 330// int clm = clmNo[i]; 331// String val = table.getValue(row,clm); 332//// if( "NVAR".equals( dbColumn[clm].getDbType()) ) { 333// if( dbType[i] == NVAR ) { 334// val = StringUtil.getReplaceEscape( val ); 335// } 336// 337// if( val != null && val.length() > 0 && val.charAt(0) == '0' && 338//// NUMBER_TYPE_LIST.indexOf( dbColumn[clm].getDbType() ) < 0 ) { 339// dbType[i] == NUMBER ) { 340// writer.print( "'" ); // 開始日などの 00000000 を文字列タイプで渡す 341// } 342// writer.print( StringUtil.rTrim( val ) ); 343// } 344// writer.println(); 345// } 346// } 347 348 /** 349 * DBTableModel をセットします。 350 * 351 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 352 * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定します。 353 * 354 * @param table DBTableModelオブジェクト 355 * @param lang 言語コード 356 */ 357 public void setDBTableModel( final DBTableModel table, final String lang ) { 358 this.table = table; 359 this.lang = lang; 360 } 361 362 /** 363 * 内部の DBTableModel を返します。 364 * 365 * @return DBTableModelオブジェクト 366 */ 367 public DBTableModel getDBTableModel() { 368 return table; 369 } 370 371 /** 372 * DBTableModelの出力順をセットします。 373 * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで 374 * 出力順を設定します。 375 * 376 * なお,出力順に指定しない項目は出力されません 377 * 378 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 379 * 380 * @param hs 出力順 (LNSCD など) 381 */ 382 public void setHeaderSequence( final String hs ) { 383 if( hs != null ) { headerSequence = hs ; } 384 } 385 386 /** 387 * DBTableModelの出力順を返します。 388 * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで 389 * 出力順を設定します。 390 * 391 * なお,出力順に指定しない項目は出力されません 392 * 393 * @return 出力順 (LNSCD など) 394 */ 395 public String getHeaderSequence() { 396 return headerSequence ; 397 } 398 399 /** 400 * データを書き込む場合の,区切り文字をセットします。 401 * 402 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 403 * 404 * @param sep 区切り文字 405 */ 406 public void setSeparator( final String sep ) { 407 if( sep != null ) { this.separator = sep; } 408 } 409 410 /** 411 * データを書き込む場合の,区切り文字を返します。 412 * 413 * @return 区切り文字 414 */ 415 public String getSeparator() { 416 return separator; 417 } 418 419 /** 420 * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを設定します。 421 * 初期値は、false(新規モード)です。 422 * 423 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 424 * 425 * @param flag [true:追加モード/false:新規モード] 426 */ 427 public void setAppend( final boolean flag ) { 428 append = flag; 429 } 430 431 /** 432 * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを取得します。 433 * 初期値は、false(新規モード)です。 434 * 435 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 436 * 437 * @return true(追加モード)/false(新規モード) 438 */ 439 public boolean isAppend() { 440 return append ; 441 } 442 443 /** 444 * DBTableModelのデータとして読み込むときのシート名を設定します。 445 * 初期値は、"Sheet1" です。 446 * これは、EXCEL追加機能として実装されています。 447 * ※ このクラスでは実装されていません。 448 * 449 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 450 * @og.rev 3.5.4.3 (2004/01/05) 実装廃止(TableWriter_Excel へ移動) 451 * 452 * @param sheetName シート名 453 */ 454 public void setSheetName( final String sheetName ) { 455 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 456 throw new UnsupportedOperationException( errMsg ); 457 } 458 459 /** 460 * EXCEL雛型参考ファイルのシート名を設定します。 461 * これは、EXCEL追加機能として実装されています。 462 * 463 * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。 464 * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する 465 * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。 466 * 初期値は、null(第一シート) です。 467 * ※ このクラスでは実装されていません。 468 * 469 * @og.rev 3.5.4.3 (2004/01/05) 新規追加 470 * 471 * @param sheetName シート名 472 */ 473 public void setRefSheetName( final String sheetName ) { 474 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 475 throw new UnsupportedOperationException( errMsg ); 476 } 477 478 /** 479 * このクラスが、EXCEL対応機能を持っているかどうかを返します。 480 * 481 * EXCEL対応機能とは、シート名のセット、雛型参照ファイル名のセット、 482 * 書き込み元ファイルのFileオブジェクト取得などの、特殊機能です。 483 * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の 484 * 関係があり、問い合わせによる条件分岐で対応します。 485 * 486 * @og.rev 3.5.4.3 (2004/01/05) 新規追加 487 * 488 * @return EXCEL対応機能を持っているかどうか(ここでは、false固定です) 489 */ 490 public boolean isExcel() { 491 return false; 492 } 493 494 /** 495 * 出力先ファイル名をセットします。(DIR + Filename) 496 * これは、EXCEL追加機能として実装されています。 497 * ※ このクラスでは実装されていません。 498 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 499 * 500 * @og.rev 3.5.4.3 (2004/01/05) 新規作成 501 * 502 * @param filename EXCEL雛型参考ファイル名 503 */ 504 public void setFilename( final String filename ) { 505 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 506 throw new UnsupportedOperationException( errMsg ); 507 } 508 509 /** 510 * EXCEL雛型参考ファイル名をセットします。(DIR + Filename) 511 * これは、EXCEL追加機能として実装されています。 512 * ※ このクラスでは実装されていません。 513 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 514 * 515 * @og.rev 3.5.4.3 (2004/01/05) 新規作成 516 * 517 * @param filename EXCEL雛型参考ファイル名 518 */ 519 public void setRefFilename( final String filename ) { 520 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 521 throw new UnsupportedOperationException( errMsg ); 522 } 523 524 /** 525 * Excelで指定したシートが存在した場合に上書きするかどうか。 526 * 527 * @og.rev 5.9.12.1 (2016/09/09) 新規追加 528 * 529 * @param flag シートを上書きするかどうか[true:上書き/false:別名] 530 */ 531 public void setSheetOverwrite( final boolean flag ) { 532 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 533 throw new UnsupportedOperationException( errMsg ); 534 } 535 536 /** 537 * EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をカンマ区切りで指定します。 538 * 539 * @og.rev 5.9.12.1 (2016/09/09) 新規追加 540 * 541 * @param sheet 対象シート名 542 */ 543 public void setRecalcSheetName( final String sheet ){ 544 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 545 throw new UnsupportedOperationException( errMsg ); 546 } 547 548 /** 549 * EXCEL出力時のデフォルトフォント名を設定します。 550 * これは、EXCEL追加機能として実装されています。 551 * 552 * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。 553 * フォント名は、EXCELのフォント名をそのまま使用してください。 554 * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String ) 555 * に設定されます。 556 * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_NAME です。 557 * 558 * ※ このクラスでは実装されていません。 559 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 560 * 561 * @og.rev 3.8.5.3 (2006/08/07) 新規追加 562 * 563 * @param fontName フォント名 564 */ 565 public void setFontName( final String fontName ) { 566 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 567 throw new UnsupportedOperationException( errMsg ); 568 } 569 570 /** 571 * EXCEL出力時のデフォルトフォントポイント数を設定します。 572 * これは、EXCEL追加機能として実装されています。 573 * 574 * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。 575 * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short ) 576 * に設定されます。 577 * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。 578 * 579 * ※ このクラスでは実装されていません。 580 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 581 * 582 * @og.rev 3.8.5.3 (2006/08/07) 新規追加 583 * 584 * @param point フォントポイント数 585 */ 586 public void setFontPoint( final short point ) { 587 String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。"; 588 throw new UnsupportedOperationException( errMsg ); 589 } 590 591 /** 592 * 読み取り元ファイルのエンコード文字列を指定します。 593 * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、 594 * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで 595 * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト) 596 * 597 * @og.rev 3.5.4.5 (2004/01/23) 新規作成 598 * 599 * @param enc ファイルのエンコード文字列 600 */ 601 public void setEncode( final String enc ) { 602 encode = enc; 603 } 604 605 /** 606 * 読み取り元ファイルのエンコード文字列を取得します。 607 * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、 608 * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで 609 * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト) 610 * 611 * @og.rev 3.5.4.5 (2004/01/23) 新規作成 612 * 613 * @return ファイルのエンコード文字列 614 */ 615 protected String getEncode() { 616 return encode; 617 } 618 619 /** 620 * 行番号情報を、出力する(true)/しない(false)を指定します。 621 * 622 * 通常のフォーマットでは、各行の先頭に行番号を出力します。 623 * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。 624 * (#NAME 属性は、読み取り時には、必須です。) 625 * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、 626 * このシステムでは、#NAME 属性が出力されないため、読み込みできません。) 627 * この行番号を出力しないようにできます。 628 * 初期値は、true(出力する) です。 629 * 630 * @og.rev 3.7.0.2 (2005/02/14) 新規追加 631 * 632 * @param useNumber 行番号情報を [true:出力する/false:しない] 633 */ 634 public void setUseNumber( final boolean useNumber ) { 635 this.useNumber = useNumber; 636 } 637 638 /** 639 * 行番号情報を、出力する(true)/しない(false)を返します。 640 * 641 * 通常のフォーマットでは、各行の先頭に行番号を出力します。 642 * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。 643 * (#NAME 属性は、読み取り時には、必須です。) 644 * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、 645 * このシステムでは、#NAME 属性が出力されないため、読み込みできません。) 646 * この行番号を出力しないようにできます。 647 * 初期値は、true(出力する) です。 648 * 649 * @og.rev 3.7.0.2 (2005/02/14) 新規追加 650 * 651 * @return 行番号情報を、出力する(true)/しない(false) 652 */ 653 protected boolean isUseNumber() { 654 return useNumber; 655 } 656 657 /** 658 * パラメーターリストをセットします。 659 * 内部は、HybsEntry クラスを持っています。 660 * 引数が、null の場合は、何もしません。 661 * ※ このクラスでは実装されていません。 662 * 663 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 664 * 665 * @param listParam パラメーターリスト 666 */ 667 public void setParam( final List<HybsEntry> listParam ) { 668 String errMsg = "このメソッドは、XML追加機能ですので、使用できません。"; 669 throw new UnsupportedOperationException( errMsg ); 670 } 671 672 /** 673 * 出力先ファイルのカラム列を、外部(タグ)よりCSV形式の文字列で指定します。 674 * ただし、指定のカラム名は、DBTableModel上に存在している必要があります。 675 * 676 * @og.rev 4.0.0.0 (2005/11/30) 新規追加 677 * 678 * @param clms 出力先ファイルのカラム列(カンマ区切り文字) 679 */ 680 public void setColumns( final String clms ) { 681 columns = clms ; 682 } 683 684 /** 685 * データの書き込み開始行番号を設定します(初期値:0)。 686 * 687 * TAB区切りテキストやEXCEL等のデータの書き込みの開始行番号を指定します。 688 * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。 689 * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす 690 * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。) 691 * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、 692 * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。 693 * なお、この機能は、TableWriter_Excel のみに実装します。 694 * 695 * @og.rev 5.7.9.0 (2014/08/08) 新規作成 696 * 697 * @param skipRowCount 書き込み開始行番号 698 */ 699 public void setSkipRowCount( final int skipRowCount ) { 700 if( skipRowCount != 0 ) { 701 String errMsg = "このメソッドは、TableWriter_Excel のみの機能ですので、使用できません。"; 702 throw new UnsupportedOperationException( errMsg ); 703 } 704 } 705 706 /** 707 * 書込処理でコードリソースのラベル変換を行うかどうか[true/false]を指定します。 708 * 709 * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか 710 * 不明になります。 711 * これは、コードリソースをラベルに変換して出力するかどうかを指定します。 712 * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので 713 * TableReader 系で読み込む場合には、リスクが発生します。 714 * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、 715 * setUseRenderer メソッドで指定する必要があります。 716 * 717 * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、 718 * このメソッドの属性値のフラグで、制御します。 719 * 720 * @og.rev 5.2.1.0 (2010/10/01) 新規作成 721 * 722 * @param useRenderer コードリソースのラベル変換を行うかどうか [true:行う/false:行わない] 723 */ 724 public void setUseRenderer( final boolean useRenderer ) { 725 this.useRenderer = useRenderer; 726 } 727 728 /** 729 * 書き出し処理でコードリソースのラベル変換を行うかどうかを返します。 730 * 初期値は、false(行わない) です。 731 * 732 * @og.rev 5.2.1.0 (2010/10/01) 新規作成 733 * 734 * @return ラベル変換を行うかどうか(true:行う/false:行わない) 735 */ 736 protected boolean isUseRenderer() { 737 return useRenderer ; 738 } 739 740 /** 741 * データを ダブルコーテーション(")で囲みます。 742 * 743 * この処理では、前後をダブルクオートで囲うため、改行の有無は判定する 744 * 必要はありません。 745 * ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加します。 746 * 747 * @param data 元のString文字列 748 * 749 * @return ダブルコーテーションで囲まれた文字列 750 */ 751 protected String quotation( final String data ) { 752 return "\"" + StringUtil.replace( data,"\"","\"\"" ) + "\"" ; 753 } 754 755 /** 756 * データに対して 改行、ダブルクオート等の処理を行います。 757 * 758 * これは、データの前後をダブルクオートで括る quotation(String)と異なり 759 * 前後には、ダブルクオート を追加しません。 760 * ただし、以下の2つの条件で処理を行います。 761 * 1.改行を含む場合は、ダブルクオートを強制的に前後に追加する。 762 * 2.ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加する。 763 * 764 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 765 * 766 * @param data 元のString文字列 767 * 768 * @return 改行、ダブルクオート等の処理 769 */ 770 protected String quotation2( final String data ) { 771 String rtn = StringUtil.replace( data,"\"","\"\"" ); 772 if( rtn != null && rtn.indexOf( HybsSystem.CR ) >= 0 ) { 773 rtn = "\"" + rtn + "\"" ; 774 } 775 776 return rtn ; 777 } 778 779 /** 780 * keys の整合性チェックを行います。 781 * 782 * キーかkeysMapのどちらかが null の場合は、何もしません。 783 * チェックするキーは、内部で大文字に変換しておきます。 784 * keysMap に登録するキーは、大文字で登録しておいてください。 785 * ここのチェックでは、キーマップに存在しなければ、エラーになります。 786 * 787 * @og.rev 5.6.6.1 (2013/07/12) keys の整合性チェックを行います。 788 * 789 * @param key チェックするキー文字列(null の場合は、処理しない) 790 * @param keysMap 利用可能なキーのマップ(大文字に統一) 791 */ 792 protected void checkParam( final String key,final Map<String,String> keysMap ) { 793 // key か keysMap かどちらかが null の場合は、処理を行わない。 794 if( key == null || keysMap == null ) { return; } 795 796 String upKey = key.toUpperCase(Locale.JAPAN); 797 798 if( ! keysMap.containsKey( upKey ) ) { 799 String BR = "<br />" + HybsSystem.CR ; 800 StringBuilder errMsg = new StringBuilder(); 801 errMsg.append( BR ) 802 .append( "指定のキーは、この tableWriter では、使用できません。" ).append( BR ) 803 .append( " class=[" ).append( getClass().getName() ).append( "]" ).append( BR ) 804 .append( " key =[" ).append( key ).append( "]" ).append( BR ) 805 .append( " ======== usage keys ======== " ).append( BR ) ; 806 for( Map.Entry<String, String> entry : keysMap.entrySet() ) { 807 errMsg.append( " " ).append( entry.getKey() ).append( " : " ) 808 .append( entry.getValue() ).append( BR ) ; 809 } 810 errMsg.append( " ============================ " ).append( BR ); 811 812 throw new HybsSystemException( errMsg.toString() ); 813 } 814 } 815}