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