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