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