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.fukurou.system.HybsConst ; // 6.1.0.0 (2014/12/26) 024import org.opengion.fukurou.util.StringUtil; 025import org.opengion.fukurou.util.HybsEntry; 026import org.opengion.hayabusa.common.HybsSystem; 027import org.opengion.hayabusa.common.HybsSystemException; 028import org.opengion.hayabusa.db.DBTableModel; 029import org.opengion.hayabusa.db.DBColumn; 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 = "7.2.6.1 (2020/07/17)" ; 050 051 /** システムの改行コードを設定します。*/ 052 protected static final String CR = HybsConst.CR; // 6.1.0.0 (2014/12/26) refactoring 053 /** StringBilderなどの初期値を設定します。 {@value} */ 054 protected static final int BUFFER_MIDDLE = HybsConst.BUFFER_MIDDLE; // 6.1.0.0 (2014/12/26) refactoring 055 056 /** dbType の簡易的な設定 {@value} */ 057 public static final int STRING = 0; 058 /** dbType の簡易的な設定 {@value} */ 059 public static final int NVAR = 1; 060 /** dbType の簡易的な設定 {@value} */ 061 public static final int NUMBER = 2; 062 063 /** 出力対象のカラム数 */ 064 protected int numberOfColumns = -1; // 4.0.0 (2005/01/31) 出力対象のカラム数 065 /** テーブルモデル */ 066 protected DBTableModel table ; 067 /** DBカラム */ 068 protected DBColumn[] dbColumn ; // table に対するカラムオブジェクト(キャッシュ) 069 /** カラム数 */ 070 protected int[] clmNo ; // 出力対象のカラム番号配列 071 /** DBタイプ */ 072 protected int[] dbType ; // 5.1.6.0 (2010/05/01) dbType の簡易的な設定 073 /** KeyLabel出力 */ 074 protected boolean[] isKeyLbl ; // 6.2.3.0 (2015/05/01) KeyLabel出力 075 076 private String separator = TAB_SEPARATOR; // 項目区切り文字 077 private String headerSequence = HybsSystem.sys( "WRITER_HEADER_SEQUENCE" ) ; 078 private boolean append ; // 3.5.4.2 (2003/12/15) 079 private String lang ; 080 private String columns ; // 4.0.0 (2005/11/30) 外部指定のカラム名 081 // 6.1.0.0 (2014/12/26) 書き込み対象外のカラム列を、外部(タグ)より指定する。 082 private String omitNames ; // 6.1.0.0 (2014/12/26) 083 private String encode ; // 3.5.4.5 (2004/01/23) エンコード文字列指定 084 085 private boolean useNumber = true; // 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 086 private boolean useRenderer ; // 5.2.1.0 (2010/10/01) 087 088 private boolean useDebug ; // 6.1.0.0 (2014/12/26) デバッグ情報の出力するかどうか 089 090 /** 091 * デフォルトコンストラクター 092 * 093 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 094 */ 095 protected AbstractTableWriter() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 096 097 /** 098 * DBTableModel から 各形式のデータを作成して,PrintWriter に書き出します。 099 * このメソッドは、EXCEL 書き出し時に使用します。 100 * 101 * @see #isExcel() 102 */ 103 @Override // TableWriter 104 public abstract void writeDBTable(); 105 106 /** 107 * DBTableModel から データを作成して,PrintWriter に書き出します。 108 * 109 * @param writer PrintWriterオブジェクト 110 */ 111 @Override // TableWriter 112 public abstract void writeDBTable( final PrintWriter writer ); 113 114 /** 115 * numberOfColumns と DBColumn を初期化します。 116 * 内部的に、DBTableModel、lang , columns を使用して、 117 * numberOfColumns 、dbColumn、clmNo、dbType の値を初期化します。 118 * カラムが1項目もない場合、言語(lnag)が未指定、DBTableModelが未指定(null) 119 * の場合は、false を返します。その場合は、以下の処理は正常に行えません。 120 * データが0件の場合は、処理を行います。通常、ヘッダーのみのファイルを 121 * 作成することになります。(これを雛形として、取込データを登録する事が可能) 122 * 123 * 6.0.1.2 (2014/08/08) 124 * clmNo 配列に、-1 がセットされた場合、DBTableModel に存在しないカラムとして 125 * そのカラム列は、書き込みしません。,,,, などを指定する事で、カラムを 126 * 飛ばして書き込むことが可能です。 127 * refFileURL、refFilename、refSheetName とともに使用すれば、ある程度の 128 * レイアウト設定が可能です。 129 * 130 * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用 131 * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値を設定 132 * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加 133 * @og.rev 6.0.2.0 (2014/09/19) EXCEL新機能対応(2回呼ばれない様にする) 134 * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加 135 * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加 136 * 137 * @return 初期化成功:true / 失敗:false 138 */ 139 protected boolean createDBColumn() { 140 if( numberOfColumns >= 0 ) { return true; } // 6.0.2.0 (2014/09/19) EXCEL新機能対応(2回呼ばれない様にする) 141 142 boolean rtnFlag = false; 143 if( lang != null && table != null ) { 144 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 145 if( columns == null ) { 146 numberOfColumns = table.getColumnCount(); 147 clmNo = new int[numberOfColumns]; 148 for( int i=0; i<numberOfColumns; i++ ) { 149 clmNo[i] = i; 150 } 151 } 152 else { 153 final String[] clms = StringUtil.csv2Array( columns ); 154 numberOfColumns = clms.length; 155 clmNo = new int[numberOfColumns]; 156 for( int i=0; i<numberOfColumns; i++ ) { 157 final int no = table.getColumnNo( clms[i],false ); // 6.0.1.2 (2014/08/08) カラム飛ばし 158 clmNo[i] = no; 159 } 160 } 161 162 // 6.1.0.0 (2014/12/26) 書き込み対象外のカラム列を、外部(タグ)より指定する。(omitNames属性) 163 if( omitNames != null ) { 164 final String[] omit = StringUtil.csv2Array( omitNames ); 165 for( int j=0; j<omit.length; j++ ) { 166 // omitNames は、カラム飛ばしの機能を利用 167 final int no = table.getColumnNo( omit[j],false ); 168 if( no >= 0 ) { 169 for( int i=0; i<numberOfColumns; i++ ) { 170 if( clmNo[i] == no ) { clmNo[i] = -1 ; break; } // omitカラムは、-1 を設定する。 171 } 172 } 173 } 174 } 175 176 dbColumn = table.getDBColumns(); 177 rtnFlag = numberOfColumns > 0 ; // カラムが1項目以上あれば成功 178 179 // 5.1.6.0 (2010/05/01) DbType の初期値を設定する。 180 dbType = new int[numberOfColumns]; 181 isKeyLbl = new boolean[numberOfColumns]; // 6.2.3.0 (2015/05/01) KeyLabel出力 182 for( int i=0; i<numberOfColumns; i++ ) { 183 final int clm = clmNo[i]; // 6.2.3.0 (2015/05/01) 184 // 6.0.1.2 (2014/08/08) カラム飛ばし の場合は、clmNo[i] には、-1 が設定されている。 185 if( clm < 0 ) { continue; } 186 187 final String type = dbColumn[clm].getDbType(); 188 if( "NVAR".equals( type ) ) { 189 dbType[i] = NVAR; 190 } 191 else if( "S9".equals( type ) || "R".equals( type ) ) { 192 dbType[i] = NUMBER; 193 } 194 else { 195 dbType[i] = STRING; 196 } 197 198 // 6.2.3.0 (2015/05/01) KeyLabel出力 199 isKeyLbl[i] = dbColumn[clm].isWriteKeyLabel(); // 6.2.3.0 (2015/05/01) KeyLabel出力 200 } 201 } 202 return rtnFlag; 203 } 204 205 /** 206 * PrintWriter に DBTableModelのヘッダー情報を書き込みます。 207 * 208 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 209 * 210 * @param writer PrintWriterオブジェクト 211 */ 212 protected void writeHeader( final PrintWriter writer ) { 213 // ここでは処理を行いません。 214 } 215 216 /** 217 * PrintWriter に DBTableModelのヘッダー情報を書き込みます。 218 * ここでは、ラベル情報と同じデータを出力しますが、# を外します。 219 * また、ラベルを文字列としてダブルコーテーションでくくります。 220 * 221 * @og.rev 7.2.6.1 (2020/07/17) H:Header(ヘッダー)属性追加。 222 * 223 * @param table DBTableModelオブジェクト 224 * @param writer PrintWriterオブジェクト 225 */ 226 protected void writeLabel2( final DBTableModel table,final PrintWriter writer ) { 227 if( useNumber ) { 228 writer.print( separator ); 229 } 230 231 for( int i=0; i<numberOfColumns; i++ ) { 232 if( i != 0 ) { writer.print( separator ); } 233 final int clm = clmNo[i]; 234 if( clm < 0 ) { continue; } // 6.0.1.2 (2014/08/08) カラム飛ばし 235 final String val = StringUtil.tagCut( dbColumn[clm].getLabel() ); // 6.2.4.2 (2015/05/29) 236 writer.print( quotation( val ) ); 237 // keyLabelの場合は、後ろのカラムのラベルを付けません。 238 if( isKeyLbl[i] ) { writer.print( separator ); } // 6.2.3.0 (2015/05/01) writeKeyLabel 属性 239 } 240 writer.println(); 241 } 242 243 /** 244 * PrintWriter に DBTableModelのラベル情報を書き込みます。 245 * 第一カラム目は、ラベル情報を示す "#Label" を書き込みます。 246 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 247 * 248 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 249 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 250 * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用 251 * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加 252 * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加 253 * @og.rev 6.2.4.2 (2015/05/29) StringUtil#tagCut(String) をラベルに適用します。 254 * 255 * @param table DBTableModelオブジェクト 256 * @param writer PrintWriterオブジェクト 257 */ 258 protected void writeLabel( final DBTableModel table,final PrintWriter writer ) { 259 if( useNumber ) { 260 writer.print( "#Label" ); 261 writer.print( separator ); 262 } 263 else { 264 writer.print( "#" ); 265 } 266 267 for( int i=0; i<numberOfColumns; i++ ) { 268 if( i != 0 ) { writer.print( separator ); } 269 final int clm = clmNo[i]; 270 if( clm < 0 ) { continue; } // 6.0.1.2 (2014/08/08) カラム飛ばし 271 final String val = StringUtil.tagCut( dbColumn[clm].getLabel() ); // 6.2.4.2 (2015/05/29) 272 writer.print( val ); 273 // keyLabelの場合は、後ろのカラムのラベルを付けません。 274 if( isKeyLbl[i] ) { writer.print( separator ); } // 6.2.3.0 (2015/05/01) writeKeyLabel 属性 275 } 276 writer.println(); 277 } 278 279 /** 280 * PrintWriter に DBTableModelの項目名情報を書き込みます。 281 * 第一カラム目は、項目名情報を示す "#Name" を書き込みます。 282 * useNumber=fale の場合は、最初のカラム名の先頭に、# が書き込まれます。 283 * 284 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 285 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 286 * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加 287 * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加 288 * 289 * @param table DBTableModelオブジェクト 290 * @param writer PrintWriterオブジェクト 291 */ 292 protected void writeName( final DBTableModel table,final PrintWriter writer ) { 293 if( useNumber ) { 294 writer.print( "#Name" ); 295 writer.print( separator ); 296 } 297 else { 298 writer.print( "#" ); 299 } 300 301 for( int i=0; i<numberOfColumns; i++ ) { 302 if( i != 0 ) { writer.print( separator ); } 303 final int clm = clmNo[i]; 304 if( clm < 0 ) { continue; } // 6.0.1.2 (2014/08/08) カラム飛ばし 305 writer.print( table.getColumnName(clm) ); 306 // keyLabelの場合は、後ろのカラムの名前を付けません。 307 if( isKeyLbl[i] ) { writer.print( separator ); } // 6.2.3.0 (2015/05/01) writeKeyLabel 属性 308 } 309 writer.println(); 310 } 311 312 /** 313 * PrintWriter に DBTableModelのサイズ情報を書き込みます。 314 * 第一カラム目は、サイズ情報を示す "#Size" を書き込みます。 315 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 316 * 317 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 318 * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更 319 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 320 * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加 321 * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加 322 * 323 * @param table DBTableModelオブジェクト 324 * @param writer PrintWriterオブジェクト 325 */ 326 protected void writeSize( final DBTableModel table,final PrintWriter writer ) { 327 if( useNumber ) { 328 writer.print( "#Size" ); 329 writer.print( separator ); 330 } 331 else { 332 writer.print( "#" ); 333 } 334 335 for( int i=0; i<numberOfColumns; i++ ) { 336 if( i != 0 ) { writer.print( separator ); } 337 final int clm = clmNo[i]; 338 if( clm < 0 ) { continue; } // 6.0.1.2 (2014/08/08) カラム飛ばし 339 writer.print( dbColumn[clm].getTotalSize() ); // 4.0.0 (2005/01/31) メソッド名変更 340 // keyLabelの場合は、後ろのカラムのサイズを付けません。 341 if( isKeyLbl[i] ) { writer.print( separator ); } // 6.2.3.0 (2015/05/01) writeKeyLabel 属性 342 } 343 writer.println(); 344 } 345 346 /** 347 * PrintWriter に DBTableModelのクラス名情報を書き込みます。 348 * 第一カラム目は、サイズ情報を示す "#Class" を書き込みます。 349 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 350 * 351 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 352 * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加 353 * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加 354 * 355 * @param table DBTableModelオブジェクト 356 * @param writer PrintWriterオブジェクト 357 */ 358 protected void writeClass( final DBTableModel table,final PrintWriter writer ) { 359 if( useNumber ) { 360 writer.print( "#Class" ); 361 writer.print( separator ); 362 } 363 else { 364 writer.print( "#" ); 365 } 366 367 for( int i=0; i<numberOfColumns; i++ ) { 368 if( i != 0 ) { writer.print( separator ); } 369 final int clm = clmNo[i]; 370 if( clm < 0 ) { continue; } // 6.0.1.2 (2014/08/08) カラム飛ばし 371 writer.print( dbColumn[clm].getClassName() ); 372 // keyLabelの場合は、後ろのカラムのクラスを付けません。 373 if( isKeyLbl[i] ) { writer.print( separator ); } // 6.2.3.0 (2015/05/01) writeKeyLabel 属性 374 } 375 writer.println(); 376 } 377 378 /** 379 * PrintWriter に セパレーターを書き込みます。 380 * 第一カラム目は、サイズ情報を示す "#----" を書き込みます。 381 * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。 382 * 383 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 384 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 385 * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加 386 * 387 * @param table DBTableModelオブジェクト 388 * @param writer PrintWriterオブジェクト 389 */ 390 protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) { 391 final String sep = "----" ; 392 if( useNumber ) { 393 writer.print( "#----" ); 394 writer.print( separator ); 395 } 396 else { 397 writer.print( "#" ); 398 } 399 400 for( int i=0; i<numberOfColumns; i++ ) { 401 if( i != 0 ) { writer.print( separator ); } 402 writer.print( sep ); 403 // keyLabelの場合は、後ろのカラムのセパレーターを付けません。 404 if( isKeyLbl[i] ) { writer.print( separator ); } // 6.2.3.0 (2015/05/01) writeKeyLabel 属性 405 } 406 writer.println(); 407 } 408 409 /** 410 * PrintWriter に DBTableModelのテーブル情報を書き込みます。 411 * このクラスでは,データを ダブルコーテーション(")で囲みます。 412 * PrintWriter に DBTableModelのテーブル情報を書き込みます。 413 * 414 * @og.rev 2.0.0.5 (2002/09/30) 先頭が0 でかつ数字タイプ(S9 or R)でない場合に ' を出力するように修正。 415 * @og.rev 2.3.1.2 (2003/01/28) データ出力時に、改行が余分に出される箇所を修正。 416 * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出す 417 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 418 * @og.rev 3.3.3.1 (2003/07/18) ファイルリード/ライト時に後ろスペースの除去を行います。 419 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 420 * @og.rev 3.8.0.1 (2005/06/17) DBTypeが NVAR の場合は、元のUnicodeに戻します。 421 * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用する。 422 * @og.rev 5.2.1.0 (2010/10/01) このメソッドは、abstract 化します。 423 * 424 * @param table DBTableModelオブジェクト 425 * @param writer PrintWriterオブジェクト 426 */ 427 protected abstract void writeData( final DBTableModel table,final PrintWriter writer ) ; 428 429 /** 430 * DBTableModel をセットします。 431 * 432 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 433 * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定します。 434 * 435 * @param table DBTableModelオブジェクト 436 * @param lang 言語コード 437 */ 438 @Override // TableWriter 439 public void setDBTableModel( final DBTableModel table, final String lang ) { 440 this.table = table; 441 this.lang = lang; 442 } 443 444 /** 445 * 内部の DBTableModel を返します。 446 * 447 * @return DBTableModelオブジェクト 448 */ 449 @Override // TableWriter 450 public DBTableModel getDBTableModel() { 451 return table; 452 } 453 454 /** 455 * DBTableModelの出力順をセットします。 456 * Name,Label,Size,Class,Data の各フィールドの頭文字のアルファベットで 457 * 出力順を設定します。 458 * 459 * ※ 7.2.6.1 (2020/07/17) H:Header(ヘッダー)属性追加 460 * 461 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 462 * 463 * @param hs 出力順 (LNSCD など) 464 */ 465 @Override // TableWriter 466 public void setHeaderSequence( final String hs ) { 467 if( hs != null ) { headerSequence = hs ; } 468 } 469 470 /** 471 * DBTableModelの出力順を返します。 472 * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで 473 * 出力順を設定します。 474 * 475 * なお,出力順に指定しない項目は出力されません 476 * 477 * @return 出力順 (LNSCD など) 478 */ 479 @Override // TableWriter 480 public String getHeaderSequence() { 481 return headerSequence ; 482 } 483 484 /** 485 * データを書き込む場合の,区切り文字をセットします。 486 * 487 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 488 * 489 * @param sep 区切り文字 490 */ 491 @Override // TableWriter 492 public void setSeparator( final String sep ) { 493 if( sep != null ) { this.separator = sep; } 494 } 495 496 /** 497 * データを書き込む場合の,区切り文字を返します。 498 * 499 * @return 区切り文字 500 */ 501 public String getSeparator() { 502 return separator; 503 } 504 505 /** 506 * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを設定します。 507 * 初期値は、false(新規モード)です。 508 * 509 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 510 * 511 * @param flag [true:追加モード/false:新規モード] 512 */ 513 @Override // TableWriter 514 public void setAppend( final boolean flag ) { 515 append = flag; 516 } 517 518 /** 519 * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを取得します。 520 * 初期値は、false(新規モード)です。 521 * 522 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 523 * 524 * @return true(追加モード)/false(新規モード) 525 */ 526 @Override // TableWriter 527 public boolean isAppend() { 528 return append ; 529 } 530 531 /** 532 * DBTableModelのデータとして読み込むときのシート名を設定します。 533 * 初期値は、"Sheet1" です。 534 * これは、EXCEL追加機能として実装されています。 535 * ※ このクラスでは実装されていません。 536 * 537 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 538 * @og.rev 3.5.4.3 (2004/01/05) 実装廃止(TableWriter_Excel へ移動) 539 * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。 540 * 541 * @param sheetName シート名 542 */ 543 @Override // TableWriter 544 public void setSheetName( final String sheetName ) { 545 final String errMsg = "sheetName は、EXCEL専用機能なので使用できません。[" + sheetName + "]"; 546 System.err.println( errMsg ); 547 } 548 549 /** 550 * EXCEL雛型参考ファイルのシート名を設定します。 551 * これは、EXCEL追加機能として実装されています。 552 * 553 * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。 554 * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する 555 * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。 556 * 初期値は、null(第一シート) です。 557 * ※ このクラスでは実装されていません。 558 * 559 * @og.rev 3.5.4.3 (2004/01/05) 新規追加 560 * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。 561 * 562 * @param sheetName シート名 563 */ 564 @Override // TableWriter 565 public void setRefSheetName( final String sheetName ) { 566 final String errMsg = "refSheetName は、EXCEL専用機能なので使用できません。[" + sheetName + "]"; 567 System.err.println( errMsg ); 568 } 569 570 /** 571 * このクラスが、EXCEL対応機能を持っているかどうかを返します。 572 * 573 * EXCEL対応機能とは、シート名のセット、雛型参照ファイル名のセット、 574 * 書き込み元ファイルのFileオブジェクト取得などの、特殊機能です。 575 * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の 576 * 関係があり、問い合わせによる条件分岐で対応します。 577 * 578 * @og.rev 3.5.4.3 (2004/01/05) 新規追加 579 * 580 * @return EXCEL対応機能を持っているかどうか(ここでは、false固定です) 581 */ 582 @Override // TableWriter 583 public boolean isExcel() { 584 return false; 585 } 586 587 /** 588 * 出力先ディレクトリとファイル名をセットします。 589 * これは、EXCEL追加機能として実装されています。 590 * ※ このクラスでは実装されていません。 591 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 592 * 593 * @og.rev 3.5.4.3 (2004/01/05) 新規作成 594 * @og.rev 6.0.2.0 (2014/09/19) ディレクトリとファイルを分けて管理します。 595 * 596 * @param directory 出力先ディレクトリ名 597 * @param filename 出力先ファイル名 598 */ 599 @Override // TableWriter 600 public void setFilename( final String directory , final String filename ) { 601 final String errMsg = "filename は、メソッドは、EXCEL追加機能ですので、使用できません。"; 602 throw new UnsupportedOperationException( errMsg ); 603 } 604 605 /** 606 * EXCEL雛型参考ファイル名をセットします。(DIR + Filename) 607 * これは、EXCEL追加機能として実装されています。 608 * ※ このクラスでは実装されていません。 609 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 610 * 611 * @og.rev 3.5.4.3 (2004/01/05) 新規作成 612 * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。 613 * 614 * @param filename EXCEL雛型参考ファイル名 615 */ 616 @Override // TableWriter 617 public void setRefFilename( final String filename ) { 618 final String errMsg = "refFilename は、EXCEL専用機能なので使用できません。[" + filename + "]"; 619 System.err.println( errMsg ); 620 } 621 622 /** 623 * 雛形のシート名を、そのまま使用する(true)か、新規、または、外部指定のシート名を使用する(false)を指定します。(初期値:false[外部指定のシート名を使用])。 624 * 625 * ※ Ver5では、追記モード時に、指定シートが存在した場合は上書きします(初期値:false[上書きしない])。5.9.12.1 (2016/09/09) 626 * Ver6では、追記モード時に、雛形を指定できないため、雛形のシート名を、そのまま使用する(true)か、 627 * 新規、または、外部指定のシート名を使用する(false)を指定する属性になります。 628 * 629 * @og.rev 6.5.0.0 (2016/09/30) sheetOverwrite で、雛形シートの使用時に、元のシート名を使用します。 630 * 631 * @param flag 元のシート名を使用するかどうか[true:使用する/false:新規、または、外部指定のシート名を使用] 632 */ 633 @Override // TableWriter 634 public void setSheetOverwrite( final boolean flag ) { 635 final String errMsg = "sheetOverwrite は、このメソッドは、EXCEL追加機能ですので、使用できません。"; 636 System.err.println( errMsg ); 637 } 638 639 /** 640 * EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をCSV形式で指定します。 641 * 642 * @og.rev 6.5.0.0 (2016/09/30) recalcSheetName で、セル内の計算式を再計算させるシート名を指定。5.9.12.1 (2016/09/09) 643 * 644 * @param sheet 対象シート名をCSV形式で指定 645 */ 646 @Override // TableWriter 647 public void setRecalcSheetName( final String sheet ){ 648 final String errMsg = "recalcSheetName は、メソッドは、EXCEL追加機能ですので、使用できません。"; 649 System.err.println( errMsg ); 650 } 651 652 /** 653 * EXCEL出力時のデフォルトフォント名を設定します。 654 * これは、EXCEL追加機能として実装されています。 655 * 656 * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。 657 * フォント名は、EXCELのフォント名をそのまま使用してください。 658 * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String ) 659 * に設定されます。 660 * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_NAME です。 661 * 662 * ※ このクラスでは実装されていません。 663 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 664 * 665 * @og.rev 3.8.5.3 (2006/08/07) 新規追加 666 * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。 667 * 668 * @param fontName フォント名 669 */ 670 @Override // TableWriter 671 public void setFontName( final String fontName ) { 672 final String errMsg = "fontName は、EXCEL専用機能なので使用できません。[" + fontName + "]"; 673 System.err.println( errMsg ); 674 } 675 676 /** 677 * EXCEL出力時のデフォルトフォントポイント数を設定します。 678 * これは、EXCEL追加機能として実装されています。 679 * 680 * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。 681 * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short ) 682 * に設定されます。 683 * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。 684 * 685 * ※ このクラスでは実装されていません。 686 * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。 687 * 688 * @og.rev 3.8.5.3 (2006/08/07) 新規追加 689 * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。 690 * 691 * @param point フォントポイント数 692 */ 693 @Override // TableWriter 694 public void setFontPoint( final short point ) { 695 final String errMsg = "fontPoint は、EXCEL専用機能なので使用できません。[" + point + "]"; 696 System.err.println( errMsg ); 697 } 698 699 /** 700 * 読み取り元ファイルのエンコード文字列を指定します。 701 * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、 702 * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで 703 * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト) 704 * 705 * @og.rev 3.5.4.5 (2004/01/23) 新規作成 706 * 707 * @param enc ファイルのエンコード文字列 708 */ 709 @Override // TableWriter 710 public void setEncode( final String enc ) { 711 encode = enc; 712 } 713 714 /** 715 * 読み取り元ファイルのエンコード文字列を取得します。 716 * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、 717 * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで 718 * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト) 719 * 720 * @og.rev 3.5.4.5 (2004/01/23) 新規作成 721 * 722 * @return ファイルのエンコード文字列 723 */ 724 protected String getEncode() { 725 return encode; 726 } 727 728 /** 729 * 行番号情報を、出力する(true)/しない(false)を指定します。 730 * 731 * 通常のフォーマットでは、各行の先頭に行番号を出力します。 732 * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。 733 * (#NAME 属性は、読み取り時には、必須です。) 734 * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、 735 * このシステムでは、#NAME 属性が出力されないため、読み込みできません。) 736 * この行番号を出力しないようにできます。 737 * 初期値は、true(出力する) です。 738 * 739 * @og.rev 3.7.0.2 (2005/02/14) 新規追加 740 * 741 * @param useNumber 行番号情報を [true:出力する/false:しない] 742 */ 743 @Override // TableWriter 744 public void setUseNumber( final boolean useNumber ) { 745 this.useNumber = useNumber; 746 } 747 748 /** 749 * 行番号情報を、出力する(true)/しない(false)を返します。 750 * 751 * 通常のフォーマットでは、各行の先頭に行番号を出力します。 752 * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。 753 * (#NAME 属性は、読み取り時には、必須です。) 754 * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、 755 * このシステムでは、#NAME 属性が出力されないため、読み込みできません。) 756 * この行番号を出力しないようにできます。 757 * 初期値は、true(出力する) です。 758 * 759 * @og.rev 3.7.0.2 (2005/02/14) 新規追加 760 * 761 * @return 行番号情報を、出力する(true)/しない(false) 762 */ 763 protected boolean isUseNumber() { 764 return useNumber; 765 } 766 767 /** 768 * パラメーターリストをセットします。 769 * 内部は、HybsEntry クラスを持っています。 770 * 引数が、null の場合は、何もしません。 771 * ※ このクラスでは実装されていません。 772 * 773 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 774 * 775 * @param listParam パラメーターリスト 776 */ 777 @Override // TableWriter 778 public void setParam( final List<HybsEntry> listParam ) { 779 final String errMsg = "param は、XML追加機能ですので、使用できません。"; 780 throw new UnsupportedOperationException( errMsg ); 781 } 782 783 /** 784 * 出力先ファイルのカラム列を、外部(タグ)よりCSV形式の文字列で指定します。 785 * ただし、指定のカラム名は、DBTableModel上に存在している必要があります。 786 * 787 * @og.rev 4.0.0.0 (2005/11/30) 新規追加 788 * 789 * @param clms 出力先ファイルのカラム列(CSV形式) 790 */ 791 @Override // TableWriter 792 public void setColumns( final String clms ) { 793 columns = clms ; 794 } 795 796 /** 797 * 書き込み対象外のカラム列を、外部(タグ)よりCSV形式で指定します。 798 * 799 * 指定するカラム名に対して、書き込み処理を行いません。 800 * ここで指定するカラム名は、検索したDBTableModel上に含まれる必要はありません。 801 * その場合は、ここでの指定は無視されます。 802 * 803 * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加 804 * 805 * @param clms 書き込み対象外のカラム列(CSV形式) 806 */ 807 @Override // TableWriter 808 public void setOmitNames( final String clms ) { 809 omitNames = clms; 810 } 811 812 /** 813 * データの書き込み開始行番号を設定します(初期値:0)。 814 * 815 * TAB区切りテキストやEXCEL等のデータの書き込みの開始行番号を指定します。 816 * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。 817 * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす 818 * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。) 819 * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、 820 * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。 821 * なお、この機能は、TableWriter_Excel のみに実装します。 822 * 823 * @og.rev 5.7.9.0 (2014/08/08) 新規作成 824 * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。 825 * 826 * @param skipRowCount 書き込み開始行番号 827 */ 828 @Override // TableWriter 829 public void setSkipRowCount( final int skipRowCount ) { 830 if( skipRowCount != 0 ) { 831 final String errMsg = "skipRowCount は、EXCEL専用機能なので使用できません。[" + skipRowCount + "]"; 832 System.err.println( errMsg ); 833 } 834 } 835 836 /** 837 * EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します。 838 * 839 * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている 840 * だけなので、ある程度加工が必要です。 841 * そこで、データのセットされたセルに罫線を入れることで、それなりのデータが 842 * 出力された感じになります。 843 * この設定と、useAutoCellSize="true" で、セルの幅を自動調整すれば、見栄えが良くなります。 844 * なお、この機能は、TableWriter_Excel のみに実装します。 845 * 846 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 847 * 848 * @param useCellStyle 罫線を入れるかどうか(true:入れる/false:入れない) 849 * @see #setUseAutoCellSize( boolean ) 850 */ 851 @Override // TableWriter 852 public void setUseCellStyle( final boolean useCellStyle ) { 853 final String errMsg = "useCellStyle は、EXCEL専用機能なので使用できません。[" + useCellStyle + "]"; 854 System.err.println( errMsg ); 855 } 856 857 /** 858 * EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します。 859 * 860 * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている 861 * だけなので、ある程度加工が必要です。 862 * そこで、データのセットされたセルの幅を自動調整することで、それなりのデータが 863 * 出力された感じになります。 864 * この設定と、useCellStyle="true" で、セルの罫線を自動設定すれば、見栄えが良くなります。 865 * なお、この機能は、TableWriter_Excel のみに実装します。 866 * 867 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 868 * 869 * @param useAutoCellSize データの幅に自動的に合わせるかどうか(true:自動調整/false:何もしない) 870 * @see #setUseCellStyle( boolean ) 871 */ 872 @Override // TableWriter 873 public void setUseAutoCellSize( final boolean useAutoCellSize ) { 874 final String errMsg = "useAutoCellSize は、EXCEL専用機能なので使用できません。[" + useAutoCellSize + "]"; 875 System.err.println( errMsg ); 876 } 877 878 /** 879 * EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します。 880 * 881 * セルの有効範囲というのは、EXCELでの 空行、空列の存在しない範囲を指します。 882 * 通常、空行でも、データとして残っている場合は、EXCELのセルオブジェクトは存在します。 883 * ここで、useActiveWorkbook="true" とすると、空行、空列を削除します。 884 * 885 * 雛形を使用した場合は、データより多めに設定した計算などは、この処理で 886 * 削除されますので、データサイズにフィットさせることができます。 887 * なお、この機能は、TableWriter_Excel のみに実装します。 888 * 889 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 890 * 891 * @param useActiveWorkbook セルの有効範囲を設定するかどうか(true:設定する/false:そのまま) 892 */ 893 @Override // TableWriter 894 public void setUseActiveWorkbook( final boolean useActiveWorkbook ) { 895 final String errMsg = "useActiveWorkbook は、EXCEL専用機能なので使用できません。[" + useActiveWorkbook + "]"; 896 System.err.println( errMsg ); 897 } 898 899 /** 900 * EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)。 901 * 902 * EXCEL帳票では、帳票雛形に、PAGE_BRAKE キーを設定しましたが、TableWriterでは、 903 * メモリ上のカラムの値が変更したときに、シート変更させることができます。 904 * このカラムの値がキーブレイクすると、新しいシートに書き出し始めます。 905 * シート名は、このカラムの値(キーブレイクする値)です。 906 * 907 * 雛形ファイルを使用する場合、雛形シートもキーブレイクに伴って、+1されます。 908 * つまり、雛形シートとデータシートは同時に変更されます。 909 * ただし、雛形シートは、最後の雛形シートで止まります。 910 * これは、雛形シートにヘッダー雛形とボディ雛形を用意しておき、最初のキーブレイクで 911 * ヘッダーからボディの書き込みにチェンジするイメージで使用できます。 912 * なお、この機能は、TableWriter_Excel のみに実装します。 913 * 914 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 915 * 916 * @param pageBreakColumn シート変更するキーとなるカラム名を指定 917 * @see #setFileBreakColumn( String ) 918 */ 919 @Override // TableWriter 920 public void setPageBreakColumn( final String pageBreakColumn ) { 921 final String errMsg = "pageBreakColumn は、EXCEL専用機能なので使用できません。[" + pageBreakColumn + "]"; 922 System.err.println( errMsg ); 923 } 924 925 /** 926 * EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)。 927 * 928 * EXCEL帳票では、メモリ上のカラムの値が変更したときに、ファイル名を変更することができます。 929 * このカラムの値がキーブレイクすると、新しいファイルに書き出し始めます。 930 * ファイル名は、このカラムの値(キーブレイクする値)+ 元の出力ファイル名の拡張子(.xlsなど)です。 931 * この設定を使用する場合は、出力ファイル名は無視されますが、拡張子だけは使用されます。 932 * 933 * 雛形ファイルを使用する場合、雛形ファイルもキーブレイクに伴って、再利用されます。 934 * 例えば、pageBreakColumn と併用する場合、キーブレイクで雛形シートも最初から適用になります。 935 * なお、この機能は、TableWriter_Excel のみに実装します。 936 * 937 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 938 * 939 * @param fileBreakColumn ファイル名を変更するキーとなるカラム名を指定 940 * @see #setPageBreakColumn( String ) 941 */ 942 @Override // TableWriter 943 public void setFileBreakColumn( final String fileBreakColumn ) { 944 final String errMsg = "fileBreakColumn は、EXCEL専用機能なので使用できません。[" + fileBreakColumn + "]"; 945 System.err.println( errMsg ); 946 } 947 948 /** 949 * EXCEL出力時に、Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定します。 950 * 951 * ここで、作成するハイパーリンクは、EXCELのシートに対するハイパーリンクです。 952 * それ以外のリンク(本当のURLやファイル等)のリンクは(今は)作成できません。 953 * ハイパーリンクを作成するには、①作成するカラム と ②作成する値 が必要です。 954 * このメソッドで設定するのは、「①:②」という形式でカラム名を指定します。 955 * ②がなければ、①と同じとします。 956 * ②の値のシートの存在有無は、無視します。ハイパーリンクを作成するシートを作成する前に 957 * ハイパーリンクを作成するケースが存在します。 958 * (例えば、各シートへのリンクを持った一覧を作成してから、明細の各シートを作成する様なケース) 959 * なお、この機能は、TableWriter_Excel のみに実装します。 960 * 961 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 962 * 963 * @param hyperLinkColumn Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定 964 */ 965 @Override // TableWriter 966 public void setHyperLinkColumn( final String hyperLinkColumn ) { 967 final String errMsg = "hyperLinkColumn は、EXCEL専用機能なので使用できません。[" + hyperLinkColumn + "]"; 968 System.err.println( errMsg ); 969 } 970 971 /** 972 * EXCEL出力時に、Sheet一覧を先頭Sheetに作成する場合のSheet名を指定します。 973 * 974 * これは、Workbook に含まれる Sheet 一覧を作成する場合に、利用可能です。 975 * なお、この機能は、TableWriter_Excel のみに実装します。 976 * 977 * @og.rev 6.0.2.0 (2014/09/19) 新規作成 978 * 979 * @param sheetName EXCELファイルのシート名 980 */ 981 @Override // TableWriter 982 public void setAddTitleSheet( final String sheetName ) { 983 final String errMsg = "addTitleSheet は、EXCEL専用機能なので使用できません。[" + sheetName + "]"; 984 System.err.println( errMsg ); 985 } 986 987 /** 988 * 書込処理でコードリソースのラベル変換を行うかどうか[true/false]を指定します。 989 * 990 * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか 991 * 不明になります。 992 * これは、コードリソースをラベルに変換して出力するかどうかを指定します。 993 * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので 994 * TableReader 系で読み込む場合には、リスクが発生します。 995 * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、 996 * setUseRenderer メソッドで指定する必要があります。 997 * 998 * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、 999 * このメソッドの属性値のフラグで、制御します。 1000 * 1001 * @og.rev 5.2.1.0 (2010/10/01) 新規作成 1002 * 1003 * @param useRenderer コードリソースのラベル変換を行うかどうか [true:行う/false:行わない] 1004 */ 1005 @Override // TableWriter 1006 public void setUseRenderer( final boolean useRenderer ) { 1007 this.useRenderer = useRenderer; 1008 } 1009 1010 /** 1011 * 書き出し処理でコードリソースのラベル変換を行うかどうかを返します。 1012 * 初期値は、false(行わない) です。 1013 * 1014 * @og.rev 5.2.1.0 (2010/10/01) 新規作成 1015 * 1016 * @return ラベル変換を行うかどうか(true:行う/false:行わない) 1017 */ 1018 protected boolean isUseRenderer() { 1019 return useRenderer ; 1020 } 1021 1022 /** 1023 * データを ダブルコーテーション(")で囲みます。 1024 * 1025 * この処理では、前後をダブルクオートで囲うため、改行の有無は判定する 1026 * 必要はありません。 1027 * ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加します。 1028 * 1029 * @param data 元のString文字列 1030 * 1031 * @return ダブルコーテーションで囲まれた文字列 1032 * @og.rtnNotNull 1033 */ 1034 protected String quotation( final String data ) { 1035 return "\"" + StringUtil.replace( data,"\"","\"\"" ) + "\"" ; 1036 } 1037 1038 /** 1039 * データに対して 改行、ダブルクオート等の処理を行います。 1040 * 1041 * これは、データの前後をダブルクオートで括る quotation(String)と異なり 1042 * 前後には、ダブルクオート を追加しません。 1043 * ただし、以下の2つの条件で処理を行います。 1044 * 1.改行を含む場合は、ダブルクオートを強制的に前後に追加する。 1045 * 2.ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加する。 1046 * 1047 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 1048 * 1049 * @param data 元のString文字列 1050 * 1051 * @return 改行、ダブルクオート等の処理 1052 */ 1053 protected String quotation2( final String data ) { 1054 String rtn = StringUtil.replace( data,"\"","\"\"" ); 1055 if( rtn != null && rtn.indexOf( CR ) >= 0 ) { 1056 rtn = "\"" + rtn + "\"" ; 1057 } 1058 1059 return rtn ; 1060 } 1061 1062 /** 1063 * keys の整合性チェックを行います。 1064 * 1065 * キーかkeysMapのどちらかが null の場合は、何もしません。 1066 * チェックするキーは、内部で大文字に変換しておきます。 1067 * keysMap に登録するキーは、大文字で登録しておいてください。 1068 * ここのチェックでは、キーマップに存在しなければ、エラーになります。 1069 * 1070 * @og.rev 5.6.6.1 (2013/07/12) keys の整合性チェックを行います。 1071 * @og.rev 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。 1072 * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。 1073 * 1074 * @param key チェックするキー文字列(null の場合は、処理しない) 1075 * @param keysMap 利用可能なキーのマップ(大文字に統一) 1076 */ 1077 protected void checkParam( final String key,final Map<String,String> keysMap ) { 1078 // key か keysMap かどちらかが null の場合は、処理を行わない。 1079 if( key == null || keysMap == null ) { return; } 1080 1081 final String upKey = key.toUpperCase(Locale.JAPAN); 1082 1083 if( ! keysMap.containsKey( upKey ) ) { 1084// final String BR = "<br />" + CR ; 1085 final String BR = "<br>" + CR ; // 7.0.1.0 (2018/10/15) 1086 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 1087 // 6.0.2.5 (2014/10/31) char を append する。 1088 .append( BR ) 1089 .append( "指定のキーは、この tableWriter では、使用できません。" ).append( BR ) 1090 .append( " class=[" ).append( getClass().getName() ).append( ']' ).append( BR ) 1091 .append( " key =[" ).append( key ).append( ']' ).append( BR ) 1092 .append( " ======== usage keys ======== " ).append( BR ) ; 1093 1094 // 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。 1095 keysMap.forEach( (k,v) -> errMsg.append( ' ' ).append( k ).append( ':' ).append( v ).append( BR ) ); 1096 errMsg.append( " ============================ " ).append( BR ); 1097 1098 throw new HybsSystemException( errMsg.toString() ); 1099 } 1100 } 1101 1102 /** 1103 * デバッグ情報を出力するかどうか[true:する/false:しない]を指定します。 1104 * 1105 * EXCELなどを書き出す場合、シートブレイクやファイルブレイク時の行番号が、検索時の行番号と 1106 * 異なる為、エラー時の判定が難しくなります。 1107 * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。 1108 * 通常は使用しませんので、設定を無視します。 1109 * 初期値は、false:デバッグ情報を出力しない です。 1110 * 1111 * @og.rev 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定 1112 * 1113 * @param useDebug デバッグ出力するか [true:する/false:しない] 1114 */ 1115 @Override // TableWriter 1116 public void setDebug( final boolean useDebug ) { 1117 this.useDebug = useDebug; 1118 } 1119 1120 /** 1121 * デバッグ情報を出力するかどうか[true:する/false:しない]を取得します。 1122 * 1123 * EXCELなどを書き出す場合、シートブレイクやファイルブレイク時の行番号が、検索時の行番号と 1124 * 異なる為、エラー時の判定が難しくなります。 1125 * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。 1126 * 1127 * @og.rev 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定 1128 * 1129 * @return デバッグ出力 [true:する/false:しない] 1130 */ 1131 protected boolean isDebug() { 1132 return useDebug ; 1133 } 1134}