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