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