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