    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;
    022import java.util.Map.Entry;
    023
    024import org.opengion.hayabusa.common.HybsSystem;
    025import org.opengion.hayabusa.common.HybsSystemException;
    026import org.opengion.hayabusa.db.DBTableModel;
    027import org.opengion.hayabusa.db.DBColumn;
    028import org.opengion.fukurou.util.StringUtil;
    029import org.opengion.fukurou.util.HybsEntry;
    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 = "5.7.9.0 (2014/08/08)" ;
    050
    051        // 5.1.6.0 (2010/05/01) dbType の簡易的な設定
    052        /** dbType の簡易的な設定      {@value} */
    053        public static final int STRING  = 0;
    054        /** dbType の簡易的な設定      {@value} */
    055        public static final int NVAR    = 1;
    056        /** dbType の簡易的な設定      {@value} */
    057        public static final int NUMBER  = 2;
    058
    059        protected DBTableModel    table         = null;
    060        protected DBColumn[]      dbColumn      = null;                 // table に対するカラムオブジェクト(キャッシュ)
    061        protected int   numberOfColumns         = -1;                   // 4.0.0 (2005/01/31) 出力対象のカラム数
    062        protected int[]                   clmNo         = null;                 // 出力対象のカラム番号配列
    063        protected int[]                   dbType        = null;
    064
    065        private String  separator               = TAB_SEPARATOR;        // 項目区切り文字
    066        private String  headerSequence  = HybsSystem.sys( "WRITER_HEADER_SEQUENCE" ) ;
    067        private boolean append                  = false;                        // 3.5.4.2 (2003/12/15)
    068        private String  lang                    = null;
    069        private String  columns                 = null;                         // 4.0.0 (2005/11/30) 外部指定のカラム名
    070        private String  encode                  = null;                         // 3.5.4.5 (2004/01/23) エンコード文字列指定
    071
    072        private boolean useNumber               = true;                         // 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
    073        private boolean useRenderer             = false;                        // 5.2.1.0 (2010/10/01)
    074
    075        /**
    076         * DBTableModel から 各形式のデータを作成して,PrintWriter に書き出します。
    077         * このメソッドは、EXCEL 書き出し時に使用します。
    078         *
    079         * @see #isExcel()
    080         */
    081        abstract public void writeDBTable();
    082
    083        /**
    084         * DBTableModel から データを作成して,PrintWriter に書き出します。
    085         *
    086         * @param       writer PrintWriterオブジェクト
    087         */
    088        abstract public void writeDBTable( final PrintWriter writer );
    089
    090        /**
    091         * numberOfColumns と DBColumn を初期化します。
    092         * 内部的に、DBTableModel、lang , columns を使用して、
    093         * numberOfColumns 、dbColumn、clmNo、dbType の値を初期化します。
    094         * カラムが１項目もない場合、言語(lnag)が未指定、DBTableModelが未指定(null)
    095         * の場合は、false を返します。その場合は、以下の処理は正常に行えません。
    096         * データが０件の場合は、処理を行います。通常、ヘッダーのみのファイルを
    097         * 作成することになります。(これを雛形として、取込データを登録する事が可能)
    098         *
    099         * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用
    100         * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値を設定する。
    101         *
    102         * @return      初期化成功：true / 失敗：false
    103         */
    104        protected boolean createDBColumn() {
    105
    106                boolean rtnFlag = false;
    107                if( lang != null && table != null ) {
    108                        if( columns != null ) {
    109                                String[] clms = StringUtil.csv2Array( columns );
    110                                numberOfColumns = clms.length;
    111                                clmNo = new int[numberOfColumns];
    112                                for( int i=0; i<numberOfColumns; i++ ) {
    113                                        int no = table.getColumnNo( clms[i] );
    114                                        clmNo[i] = no;
    115                                }
    116                        }
    117                        else {
    118                                numberOfColumns = table.getColumnCount();
    119                                clmNo = new int[numberOfColumns];
    120                                for( int i=0; i<numberOfColumns; i++ ) {
    121                                        clmNo[i] = i;
    122                                }
    123                        }
    124
    125                        dbColumn = table.getDBColumns();
    126                        rtnFlag = (numberOfColumns > 0);     // カラムが１項目以上あれば成功
    127
    128                        // 5.1.6.0 (2010/05/01) DbType の初期値を設定する。
    129                        dbType = new int[numberOfColumns];
    130                        for( int i=0; i<numberOfColumns; i++ ) {
    131                                String type = dbColumn[clmNo[i]].getDbType();
    132
    133                                if( "NVAR".equals( type ) ) {
    134                                        dbType[i] = NVAR;
    135                                }
    136                                else if( "S9".equals( type ) || "R".equals( type )  ) {
    137                                        dbType[i] = NUMBER;
    138                                }
    139                                else {
    140                                        dbType[i] = STRING;
    141                                }
    142                        }
    143                }
    144                return rtnFlag;
    145        }
    146
    147        /**
    148         * PrintWriter に DBTableModelのヘッダー情報を書き込みます。
    149         *
    150         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    151         *
    152         * @param       writer PrintWriterオブジェクト
    153         */
    154        protected void writeHeader( final PrintWriter writer ) {
    155                // ここでは処理を行いません。
    156        }
    157
    158        /**
    159         * PrintWriter に DBTableModelのラベル情報を書き込みます。
    160         * 第一カラム目は、ラベル情報を示す "#Label" を書き込みます。
    161         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
    162         *
    163         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    164         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
    165         * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用
    166         *
    167         * @param       table DBTableModelオブジェクト
    168         * @param       writer PrintWriterオブジェクト
    169         */
    170        protected void writeLabel( final DBTableModel table,final PrintWriter writer ) {
    171                if( useNumber ) {
    172                        writer.print( "#Label" );
    173                        writer.print( separator );
    174                }
    175                else {
    176                        writer.print( "#" );
    177                }
    178
    179                for( int i=0; i<numberOfColumns; i++ ) {
    180                        if( i != 0 ) { writer.print( separator ); }
    181                        int clm = clmNo[i];
    182                        writer.print( dbColumn[clm].getLabel() );
    183                }
    184                writer.println();
    185        }
    186
    187        /**
    188         * PrintWriter に DBTableModelの項目名情報を書き込みます。
    189         * 第一カラム目は、項目名情報を示す "#Name" を書き込みます。
    190         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
    191         *
    192         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    193         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
    194         *
    195         * @param       table DBTableModelオブジェクト
    196         * @param       writer PrintWriterオブジェクト
    197         */
    198        protected void writeName( final DBTableModel table,final PrintWriter writer ) {
    199                if( useNumber ) {
    200                        writer.print( "#Name" );
    201                        writer.print( separator );
    202                }
    203                else {
    204                        writer.print( "#" );
    205                }
    206
    207                for( int i=0; i<numberOfColumns; i++ ) {
    208                        if( i != 0 ) { writer.print( separator ); }
    209                        int clm = clmNo[i];
    210                        writer.print( table.getColumnName(clm) );
    211                }
    212                writer.println();
    213        }
    214
    215        /**
    216         * PrintWriter に DBTableModelのサイズ情報を書き込みます。
    217         * 第一カラム目は、サイズ情報を示す "#Size" を書き込みます。
    218         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
    219         *
    220         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    221         * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更
    222         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
    223         *
    224         * @param       table DBTableModelオブジェクト
    225         * @param       writer PrintWriterオブジェクト
    226         */
    227        protected void writeSize( final DBTableModel table,final PrintWriter writer ) {
    228                if( useNumber ) {
    229                        writer.print( "#Size" );
    230                        writer.print( separator );
    231                }
    232                else {
    233                        writer.print( "#" );
    234                }
    235
    236                for( int i=0; i<numberOfColumns; i++ ) {
    237                        if( i != 0 ) { writer.print( separator ); }
    238                        int clm = clmNo[i];
    239                        writer.print( dbColumn[clm].getTotalSize() );   // 4.0.0 (2005/01/31) メソッド名変更
    240                }
    241                writer.println();
    242        }
    243
    244        /**
    245         * PrintWriter に DBTableModelのクラス名情報を書き込みます。
    246         * 第一カラム目は、サイズ情報を示す "#Class" を書き込みます。
    247         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
    248         *
    249         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    250         *
    251         * @param       table DBTableModelオブジェクト
    252         * @param       writer PrintWriterオブジェクト
    253         */
    254        protected void writeClass( final DBTableModel table,final PrintWriter writer ) {
    255                if( useNumber ) {
    256                        writer.print( "#Class" );
    257                        writer.print( separator );
    258                }
    259                else {
    260                        writer.print( "#" );
    261                }
    262
    263                for( int i=0; i<numberOfColumns; i++ ) {
    264                        if( i != 0 ) { writer.print( separator ); }
    265                        int clm = clmNo[i];
    266                        writer.print( dbColumn[clm].getClassName() );
    267                }
    268                writer.println();
    269        }
    270
    271        /**
    272         * PrintWriter に セパレーターを書き込みます。
    273         * 第一カラム目は、サイズ情報を示す "#----" を書き込みます。
    274         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
    275         *
    276         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    277         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
    278         *
    279         * @param       table DBTableModelオブジェクト
    280         * @param       writer PrintWriterオブジェクト
    281         */
    282        protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) {
    283                String sep = "----" ;
    284                if( useNumber ) {
    285                        writer.print( "#----" );
    286                        writer.print( separator );
    287                }
    288                else {
    289                        writer.print( "#" );
    290                }
    291
    292                for( int i=0; i<numberOfColumns; i++ ) {
    293                        if( i != 0 ) { writer.print( separator ); }
    294                        writer.print( sep );
    295                }
    296                writer.println();
    297        }
    298
    299        /**
    300         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
    301         * このクラスでは，データを ダブルコーテーション(")で囲みます。
    302         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
    303         *
    304         * @og.rev 2.0.0.5 (2002/09/30) 先頭が0 でかつ数字タイプ(S9 or R)でない場合に ' を出力するように修正。
    305         * @og.rev 2.3.1.2 (2003/01/28) データ出力時に、改行が余分に出される箇所を修正。
    306         * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出す
    307         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    308         * @og.rev 3.3.3.1 (2003/07/18) ファイルリード/ライト時に後ろスペースの除去を行います。
    309         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
    310         * @og.rev 3.8.0.1 (2005/06/17) DBTypeが NVAR の場合は、元のUnicodeに戻します。
    311         * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用する。
    312         * @og.rev 5.2.1.0 (2010/10/01) このメソッドは、abstract 化します。
    313         *
    314         * @param       table DBTableModelオブジェクト
    315         * @param       writer PrintWriterオブジェクト
    316         */
    317        abstract protected void writeData( final DBTableModel table,final PrintWriter writer ) ;
    318//      protected void writeData( final DBTableModel table,final PrintWriter writer ) {
    319//              int numberOfRows =      table.getRowCount();
    320//
    321//              for( int row=0; row<numberOfRows; row++ ) {
    322//                      if( useNumber ) {
    323//                              writer.print( row+1 );
    324//                              writer.print( separator );
    325//                      }
    326//
    327//                      for( int i=0; i<numberOfColumns; i++ ) {
    328//                              if( i != 0 ) { writer.print( separator ); }
    329//
    330//                              int clm = clmNo[i];
    331//                              String val = table.getValue(row,clm);
    332////                            if( "NVAR".equals( dbColumn[clm].getDbType()) ) {
    333//                              if( dbType[i] == NVAR ) {
    334//                                      val = StringUtil.getReplaceEscape( val );
    335//                              }
    336//
    337//                              if( val != null && val.length() > 0 && val.charAt(0) == '0' &&
    338////                                    NUMBER_TYPE_LIST.indexOf( dbColumn[clm].getDbType() ) < 0 ) {
    339//                                      dbType[i] == NUMBER ) {
    340//                                              writer.print( "'" );            // 開始日などの 00000000 を文字列タイプで渡す
    341//                              }
    342//                              writer.print( StringUtil.rTrim( val ) );
    343//                      }
    344//                      writer.println();
    345//              }
    346//      }
    347
    348        /**
    349         * DBTableModel をセットします。
    350         *
    351         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    352         * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定します。
    353         *
    354         * @param       table DBTableModelオブジェクト
    355         * @param       lang 言語コード
    356         */
    357        public void setDBTableModel( final DBTableModel table, final String lang ) {
    358                this.table = table;
    359                this.lang = lang;
    360        }
    361
    362        /**
    363         * 内部の DBTableModel を返します。
    364         *
    365         * @return      DBTableModelオブジェクト
    366         */
    367        public DBTableModel getDBTableModel() {
    368                return table;
    369        }
    370
    371        /**
    372         * DBTableModelの出力順をセットします。
    373         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
    374         * 出力順を設定します。
    375         *
    376         * なお，出力順に指定しない項目は出力されません
    377         *
    378         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    379         *
    380         * @param       hs 出力順 (LNSCD など)
    381         */
    382        public void setHeaderSequence( final String hs ) {
    383                if( hs != null ) { headerSequence = hs ; }
    384        }
    385
    386        /**
    387         * DBTableModelの出力順を返します。
    388         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
    389         * 出力順を設定します。
    390         *
    391         * なお，出力順に指定しない項目は出力されません
    392         *
    393         * @return      出力順 (LNSCD など)
    394         */
    395        public String getHeaderSequence() {
    396                return headerSequence ;
    397        }
    398
    399        /**
    400         * データを書き込む場合の,区切り文字をセットします。
    401         *
    402         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    403         *
    404         * @param       sep 区切り文字
    405         */
    406        public void setSeparator( final String sep ) {
    407                if( sep != null ) { this.separator = sep; }
    408        }
    409
    410        /**
    411         * データを書き込む場合の,区切り文字を返します。
    412         *
    413         * @return      区切り文字
    414         */
    415        public String getSeparator() {
    416                return separator;
    417        }
    418
    419        /**
    420         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを設定します。
    421         * 初期値は、false(新規モード)です。
    422         *
    423         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
    424         *
    425         * @param       flag    [true:追加モード/false:新規モード]
    426         */
    427        public void setAppend( final boolean flag ) {
    428                append = flag;
    429        }
    430
    431        /**
    432         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを取得します。
    433         * 初期値は、false(新規モード)です。
    434         *
    435         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
    436         *
    437         * @return      true(追加モード)/false(新規モード)
    438         */
    439        public boolean isAppend() {
    440                return append ;
    441        }
    442
    443        /**
    444         * DBTableModelのデータとして読み込むときのシート名を設定します。
    445         * 初期値は、"Sheet1" です。
    446         * これは、EXCEL追加機能として実装されています。
    447         * ※ このクラスでは実装されていません。
    448         *
    449         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
    450         * @og.rev 3.5.4.3 (2004/01/05) 実装廃止(TableWriter_Excel へ移動)
    451         *
    452         * @param   sheetName シート名
    453         */
    454        public void setSheetName( final String sheetName ) {
    455                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    456                throw new UnsupportedOperationException( errMsg );
    457        }
    458
    459        /**
    460         * EXCEL雛型参考ファイルのシート名を設定します。
    461         * これは、EXCEL追加機能として実装されています。
    462         *
    463         * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。
    464         * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する
    465         * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。
    466         * 初期値は、null(第一シート) です。
    467         * ※ このクラスでは実装されていません。
    468         *
    469         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
    470         *
    471         * @param   sheetName シート名
    472         */
    473        public void setRefSheetName( final String sheetName )  {
    474                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    475                throw new UnsupportedOperationException( errMsg );
    476        }
    477
    478        /**
    479         * このクラスが、EXCEL対応機能を持っているかどうかを返します。
    480         *
    481         * EXCEL対応機能とは、シート名のセット、雛型参照ファイル名のセット、
    482         * 書き込み元ファイルのFileオブジェクト取得などの、特殊機能です。
    483         * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の
    484         * 関係があり、問い合わせによる条件分岐で対応します。
    485         *
    486         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
    487         *
    488         * @return      EXCEL対応機能を持っているかどうか(ここでは、false固定です)
    489         */
    490        public boolean isExcel() {
    491                return false;
    492        }
    493
    494        /**
    495         * 出力先ファイル名をセットします。(DIR + Filename)
    496         * これは、EXCEL追加機能として実装されています。
    497         * ※ このクラスでは実装されていません。
    498         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
    499         *
    500         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
    501         *
    502         * @param   filename EXCEL雛型参考ファイル名
    503         */
    504        public void setFilename( final String filename ) {
    505                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    506                throw new UnsupportedOperationException( errMsg );
    507        }
    508
    509        /**
    510         * EXCEL雛型参考ファイル名をセットします。(DIR + Filename)
    511         * これは、EXCEL追加機能として実装されています。
    512         * ※ このクラスでは実装されていません。
    513         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
    514         *
    515         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
    516         *
    517         * @param   filename EXCEL雛型参考ファイル名
    518         */
    519        public void setRefFilename( final String filename ) {
    520                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    521                throw new UnsupportedOperationException( errMsg );
    522        }
    523
    524        /**
    525         * Excelで指定したシートが存在した場合に上書きするかどうか。
    526         *
    527         * @og.rev 5.9.12.1 (2016/09/09) 新規追加
    528         *
    529         * @param   flag シートを上書きするかどうか[true:上書き/false:別名]
    530         */
    531        public void setSheetOverwrite( final boolean flag ) {
    532                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    533                throw new UnsupportedOperationException( errMsg );
    534        }
    535
    536        /**
    537         * EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をカンマ区切りで指定します。
    538         *
    539         * @og.rev 5.9.12.1 (2016/09/09) 新規追加
    540         *
    541         * @param  sheet 対象シート名
    542         */
    543        public void setRecalcSheetName( final String sheet ){
    544                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    545                throw new UnsupportedOperationException( errMsg );
    546        }
    547
    548        /**
    549         * EXCEL出力時のデフォルトフォント名を設定します。
    550         * これは、EXCEL追加機能として実装されています。
    551         *
    552         * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。
    553         * フォント名は、EXCELのフォント名をそのまま使用してください。
    554         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
    555         * に設定されます。
    556         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_NAME です。
    557         *
    558         * ※ このクラスでは実装されていません。
    559         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
    560         *
    561         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
    562         *
    563         * @param   fontName フォント名
    564         */
    565        public void setFontName( final String fontName ) {
    566                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    567                throw new UnsupportedOperationException( errMsg );
    568        }
    569
    570        /**
    571         * EXCEL出力時のデフォルトフォントポイント数を設定します。
    572         * これは、EXCEL追加機能として実装されています。
    573         *
    574         * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。
    575         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
    576         * に設定されます。
    577         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。
    578         *
    579         * ※ このクラスでは実装されていません。
    580         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
    581         *
    582         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
    583         *
    584         * @param       point   フォントポイント数
    585         */
    586        public void setFontPoint( final short point ) {
    587                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
    588                throw new UnsupportedOperationException( errMsg );
    589        }
    590
    591        /**
    592         * 読み取り元ファイルのエンコード文字列を指定します。
    593         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
    594         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
    595         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、１バイト)
    596         *
    597         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
    598         *
    599         * @param   enc ファイルのエンコード文字列
    600         */
    601        public void setEncode( final String enc ) {
    602                encode = enc;
    603        }
    604
    605        /**
    606         * 読み取り元ファイルのエンコード文字列を取得します。
    607         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
    608         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
    609         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、１バイト)
    610         *
    611         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
    612         *
    613         * @return      ファイルのエンコード文字列
    614         */
    615        protected String getEncode() {
    616                return encode;
    617        }
    618
    619        /**
    620         * 行番号情報を、出力する(true)/しない(false)を指定します。
    621         *
    622         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
    623         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
    624         * (#NAME 属性は、読み取り時には、必須です。)
    625         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
    626         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
    627         * この行番号を出力しないようにできます。
    628         * 初期値は、true(出力する) です。
    629         *
    630         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
    631         *
    632         * @param   useNumber 行番号情報を [true:出力する/false:しない]
    633         */
    634        public void setUseNumber( final boolean useNumber ) {
    635                this.useNumber = useNumber;
    636        }
    637
    638        /**
    639         * 行番号情報を、出力する(true)/しない(false)を返します。
    640         *
    641         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
    642         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
    643         * (#NAME 属性は、読み取り時には、必須です。)
    644         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
    645         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
    646         * この行番号を出力しないようにできます。
    647         * 初期値は、true(出力する) です。
    648         *
    649         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
    650         *
    651         * @return   行番号情報を、出力する(true)/しない(false)
    652         */
    653        protected boolean isUseNumber() {
    654                return useNumber;
    655        }
    656
    657        /**
    658         * パラメーターリストをセットします。
    659         * 内部は、HybsEntry クラスを持っています。
    660         * 引数が、null の場合は、何もしません。
    661         * ※ このクラスでは実装されていません。
    662         *
    663         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
    664         *
    665         * @param   listParam   パラメーターリスト
    666         */
    667        public void setParam( final List<HybsEntry> listParam ) {
    668                String errMsg = "このメソッドは、XML追加機能ですので、使用できません。";
    669                throw new UnsupportedOperationException( errMsg );
    670        }
    671
    672        /**
    673         * 出力先ファイルのカラム列を、外部(タグ)よりCSV形式の文字列で指定します。
    674         * ただし、指定のカラム名は、DBTableModel上に存在している必要があります。
    675         *
    676         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    677         *
    678         * @param   clms 出力先ファイルのカラム列(カンマ区切り文字)
    679         */
    680        public void setColumns( final String clms ) {
    681                columns = clms ;
    682        }
    683
    684        /**
    685         * データの書き込み開始行番号を設定します(初期値:0)。
    686         *
    687         * TAB区切りテキストやEXCEL等のデータの書き込みの開始行番号を指定します。
    688         * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。
    689         * ファイルの先頭行が、０行としてカウントしますので、設定値は、読み飛ばす
    690         * 件数になります。(１と指定すると、１件読み飛ばし、２行目から読み込みます。)
    691         * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、
    692         * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。
    693         * なお、この機能は、TableWriter_Excel のみに実装します。
    694         *
    695         * @og.rev 5.7.9.0 (2014/08/08) 新規作成
    696         *
    697         * @param       skipRowCount 書き込み開始行番号
    698         */
    699        public void setSkipRowCount( final int skipRowCount ) {
    700                if( skipRowCount != 0 ) {
    701                        String errMsg = "このメソッドは、TableWriter_Excel のみの機能ですので、使用できません。";
    702                        throw new UnsupportedOperationException( errMsg );
    703                }
    704        }
    705
    706        /**
    707         * 書込処理でコードリソースのラベル変換を行うかどうか[true/false]を指定します。
    708         *
    709         * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか
    710         * 不明になります。
    711         * これは、コードリソースをラベルに変換して出力するかどうかを指定します。
    712         * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので
    713         * TableReader 系で読み込む場合には、リスクが発生します。
    714         * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、
    715         * setUseRenderer メソッドで指定する必要があります。
    716         *
    717         * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、
    718         * このメソッドの属性値のフラグで、制御します。
    719         *
    720         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
    721         *
    722         * @param       useRenderer     コードリソースのラベル変換を行うかどうか [true:行う/false:行わない]
    723         */
    724        public void setUseRenderer( final boolean useRenderer ) {
    725                this.useRenderer = useRenderer;
    726        }
    727
    728        /**
    729         * 書き出し処理でコードリソースのラベル変換を行うかどうかを返します。
    730         * 初期値は、false(行わない) です。
    731         *
    732         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
    733         *
    734         * @return      ラベル変換を行うかどうか(true:行う/false:行わない)
    735         */
    736        protected boolean isUseRenderer() {
    737                return useRenderer ;
    738        }
    739
    740        /**
    741         * データを ダブルコーテーション(")で囲みます。
    742         *
    743         * この処理では、前後をダブルクオートで囲うため、改行の有無は判定する
    744         * 必要はありません。
    745         * ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加します。
    746         *
    747         * @param        data 元のString文字列
    748         *
    749         * @return       ダブルコーテーションで囲まれた文字列
    750         */
    751        protected String quotation( final String data ) {
    752                return "\"" + StringUtil.replace( data,"\"","\"\"" ) + "\"" ;
    753        }
    754
    755        /**
    756         * データに対して 改行、ダブルクオート等の処理を行います。
    757         *
    758         * これは、データの前後をダブルクオートで括る quotation(String)と異なり
    759         * 前後には、ダブルクオート を追加しません。
    760         * ただし、以下の２つの条件で処理を行います。
    761         * １．改行を含む場合は、ダブルクオートを強制的に前後に追加する。
    762         * ２．ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加する。
    763         *
    764         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
    765         *
    766         * @param        data 元のString文字列
    767         *
    768         * @return       改行、ダブルクオート等の処理
    769         */
    770        protected String quotation2( final String data ) {
    771                String rtn = StringUtil.replace( data,"\"","\"\"" );
    772                if( rtn != null && rtn.indexOf( HybsSystem.CR ) >= 0 ) {
    773                        rtn = "\"" + rtn + "\"" ;
    774                }
    775
    776                return rtn ;
    777        }
    778
    779        /**
    780         * keys の整合性チェックを行います。
    781         *
    782         * キーかkeysMapのどちらかが null の場合は、何もしません。
    783         * チェックするキーは、内部で大文字に変換しておきます。
    784         * keysMap に登録するキーは、大文字で登録しておいてください。
    785         * ここのチェックでは、キーマップに存在しなければ、エラーになります。
    786         *
    787         * @og.rev 5.6.6.1 (2013/07/12) keys の整合性チェックを行います。
    788         *
    789         * @param   key チェックするキー文字列(null の場合は、処理しない)
    790         * @param   keysMap 利用可能なキーのマップ(大文字に統一)
    791         */
    792        protected void checkParam( final String key,final Map<String,String> keysMap ) {
    793                // key か keysMap かどちらかが null の場合は、処理を行わない。
    794                if( key == null || keysMap == null ) { return; }
    795
    796                String upKey = key.toUpperCase(Locale.JAPAN);
    797
    798                if( ! keysMap.containsKey( upKey ) ) {
    799                        String BR = "<br />" + HybsSystem.CR ;
    800                        StringBuilder errMsg = new StringBuilder();
    801                        errMsg.append( BR )
    802                                  .append( "指定のキーは、この tableWriter では、使用できません。" ).append( BR )
    803                                  .append( "  class=[" ).append( getClass().getName() ).append( "]" ).append( BR )
    804                                  .append( "  key  =[" ).append( key                              ).append( "]" ).append( BR )
    805                                  .append( "  ======== usage keys ======== " ).append( BR ) ;
    806                        for( Map.Entry<String, String> entry : keysMap.entrySet() ) {
    807                                errMsg.append( "  " ).append( entry.getKey() ).append( " : " )
    808                                                                         .append( entry.getValue() ).append( BR ) ;
    809                        }
    810                        errMsg.append( "  ============================ " ).append( BR );
    811
    812                        throw new HybsSystemException( errMsg.toString() );
    813                }
    814        }
    815}