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