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}