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