    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.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.hayabusa.db.DBTableModel;
    021import org.opengion.hayabusa.io.TableWriter;
    022import org.opengion.fukurou.util.FileUtil;
    023import org.opengion.fukurou.util.HybsEntry;
    024import org.opengion.fukurou.system.Closer ;
    025import org.opengion.fukurou.util.StringUtil ;
    026import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    027
    028import static org.opengion.fukurou.util.StringUtil.nval ;
    029
    030// import javax.servlet.ServletResponse ;
    031// import javax.servlet.http.HttpServletResponse ;
    032// import javax.servlet.jsp.JspWriter ;
    033
    034import java.util.List;
    035import java.util.ArrayList;
    036import java.util.Locale;
    037import java.io.File;
    038import java.io.OutputStream;
    039import java.io.PrintWriter;
    040import java.io.FileOutputStream;
    041import java.io.BufferedOutputStream;                            // 6.0.4.0 (2014/11/28)
    042import java.io.ByteArrayOutputStream;
    043import java.io.IOException;
    044import java.io.InputStream;                                                     // 6.0.4.0 (2014/11/28)
    045import java.io.FileInputStream;                                         // 6.0.4.0 (2014/11/28)
    046import java.io.BufferedInputStream;                                     // 6.0.4.0 (2014/11/28)
    047
    048import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;                       // 6.0.4.0 (2014/11/28)
    049import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;        // 6.0.4.0 (2014/11/28)
    050import org.apache.commons.compress.utils.IOUtils;                                                       // 6.0.4.0 (2014/11/28)
    051
    052/**
    053 * DBTableModelオブジェクトを指定のファイルに出力するタグです。
    054 *
    055 * データ(DBTableModel)と、コントローラ(WriteTableTagForm)を与えて、
    056 * 外部からコントロールすることで、各種形式で データ(DBTableModel)を表示できます。
    057 * writeTableタグ に対して、コマンドを与えることにより、内部のコントローラの
    058 * 実装に対応した、 形式でデータを作成します。
    059 *
    060 * @og.formSample
    061 * ●形式：
    062 *     &lt;og:writeTable
    063 *         fileURL   = "{&#064;USER.ID}"    保存先ディレクトリ名
    064 *         filename  = "{&#064;filename}"   保存ファイル名
    065 *         encode    = "UnicodeLittle"      保存ファイルエンコード名
    066 *     /&gt;
    067 *
    068 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    069 *
    070 * ●Tag定義：
    071 *   &lt;og:writeTable
    072 *       writerClass        【TAG】実際に書き出すクラス名の略称(TableWriter_**** クラスの ****)を指定します
    073 *                                                                      (初期値:TABLE_WRITER_DEFAULT_CLASS[={@og.value SystemData#TABLE_WRITER_DEFAULT_CLASS}])
    074 *       separator          【TAG】可変長ファイルを作成するときの項目区切り文字をセットします(初期値:TableWriter#TAB_SEPARATOR[= ])
    075 *       headerSequence     【TAG】DBTableModelの出力順(LNSCD など)をセットします
    076 *       fileURL            【TAG】ファイル保存先ディレクトリ名を指定します(初期値:FILE_URL[={@og.value SystemData#FILE_URL}])
    077 *       filename           【TAG】ファイルを作成するときのファイル名をセットします(初期値:FILE_FILENAME[={@og.value SystemData#FILE_FILENAME}])
    078 *       beforeDelete       【TAG】事前にファイルを削除するかどうかをセットします (初期値:false)
    079 *       encode             【TAG】ファイルを作成するときのファイルエンコーディング名をセットします(初期値:FILE_ENCODE[={@og.value SystemData#FILE_ENCODE}])
    080 *       fileAppend         【TAG】追加モードで書き込むかどうか[true/false]を指定します(初期値:false[新規モード])
    081 *       zip                【TAG】結果をファイルに出力するときに、ZIPで圧縮するかどうか[true/false]を指定します(初期値:false)
    082 *       zipFilename        【TAG】ZIPファイルを作成するときのZIPファイル名をセットします(初期値:filename + ".zip")
    083 *       tableId            【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID
    084 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
    085 *       useNumber          【TAG】行番号情報を、出力する/しない[true/false]を指定します(初期値:true)
    086 *       columns            【TAG】書き込み先ファイルのカラム列を、外部(タグ)よりCSV形式で指定します
    087 *       omitNames          【TAG】書き込み対象外のカラム列を、外部(タグ)よりCSV形式で指定します
    088 *       useRenderer        【TAG】書込処理でコードリソースのラベル変換を行うかどうかを指定します
    089 *                                      (初期値:USE_TABLE_WRITER_RENDERER[={@og.value SystemData#USE_TABLE_WRITER_RENDERER}])
    090 *       selectedAll        【TAG】チェック行のみを対象にするかを指定します(初期値:true)
    091 *   ※  sheetName          【TAG】EXCELファイルを書き出すときのシート名を設定します
    092 *   ※  refFileURL         【TAG】EXCEL雛型参照ファイルのディレクトリ名をセットします
    093 *   ※  refFilename        【TAG】EXCEL雛型参考ファイル名をセットします
    094 *   ※  refSheetName       【TAG】EXCEL雛型参考ファイルのシート名を設定します
    095 *   ※  sheetOverwrite     【TAG】EXCELでsheetNameでの指定シート名に対して上書きを行うかどうかを指定します。
    096 *   ※  recalcSheetName    【TAG】EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をCSV形式で指定します。
    097 *   ※  fontName           【TAG】EXCEL出力時のデフォルトフォント名を設定します
    098 *                                      (初期値:TABLE_WRITER_DEFAULT_FONT_NAME[={@og.value SystemData#TABLE_WRITER_DEFAULT_FONT_NAME}])
    099 *   ※  fontPoint          【TAG】EXCEL出力時のデフォルトフォントポイント数を設定します
    100 *                                      (初期値:TABLE_WRITER_DEFAULT_FONT_POINTS[={@og.value SystemData#TABLE_WRITER_DEFAULT_FONT_POINTS}])
    101 *   ※  skipRowCount       【TAG】(通常は使いません)EXCEL出力時のデータの書き込み開始位置を設定します
    102 *   ※  useCellStyle       【TAG】EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します(初期値:false)
    103 *   ※  useAutoCellSize    【TAG】EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します(初期値:false)
    104 *   ※  useActiveWorkbook  【TAG】EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)
    105 *   ※  pageBreakColumn    【TAG】EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)
    106 *   ※  fileBreakColumn    【TAG】EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)
    107 *   ※  hyperLinkColumn    【TAG】EXCEL出力時に、Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定します
    108 *   ※  addTitleSheet      【TAG】EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。
    109 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    110 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
    111 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
    112 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
    113 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
    114 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    115 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    116 *   &gt;   ... Body ...
    117 *   &lt;/og:writeTable&gt;
    118 *
    119 * 【廃止】6.9.5.0 (2018/04/23) 物理削除
    120 *   //  direct             【廃止】結果をダイレクトにEXCEL起動するかどうか[true/false]を指定します(初期値:false[ファイル])  6.9.5.0 (2018/04/23) 物理削除
    121 *   //  disposition        【廃止】Content-Disposition (inline:埋め込む/attachment:ダイアログを起動)を指定します(初期値:attachment)  6.9.5.0 (2018/04/23) 物理削除
    122 *
    123 *
    124 * ●使用例
    125 *     &lt;og:writeTable ･････ &gt;
    126 *         &lt;og:writeTableParam
    127 *             key  = "Tablename"  value="GE12"
    128 *         /&gt;
    129 *         &lt;og:writeTableParam
    130 *             key  = "First"             First:最初に登録
    131 *         &gt;
    132 *                      insert into GE12bk
    133 *                         select * from GE12
    134 *                         where SYSTEM_ID='**'
    135 *         &lt;/og:writeTableParam
    136 *         &lt;og:writeTableParam
    137 *             key  = "First"             First:の２番目に登録
    138 *         &gt;
    139 *              delete from GE12 where SYSTEM_ID='**' and KBSAKU='0'
    140 *         &lt;/og:writeTableParam
    141 *         &lt;og:writeTableParam
    142 *             key  = "Last"              Last:最後に登録
    143 *         &gt;
    144 *              update GE12 set XXXX='YYYY' where SYSTEM_ID='**' and KBSAKU='0'
    145 *         &lt;/og:writeTableParam
    146 *     &lt;/og:writeTableParam
    147 *
    148 * @og.group ファイル出力
    149 *
    150 * @version  4.0
    151 * @author   Kazuhiko Hasegawa
    152 * @since    JDK5.0,
    153 */
    154public class WriteTableTag extends CommonTagSupport {
    155        /** このプログラムのVERSION文字列を設定します    {@value} */
    156        private static final String VERSION = "6.9.5.0 (2018/04/23)" ;
    157        private static final long serialVersionUID = 695020180423L ;
    158
    159        private final String  BASE_URL  = HybsSystem.sys( "FILE_URL" );
    160
    161        private String  separator               = TableWriter.TAB_SEPARATOR;     // 項目区切り文字
    162        private String  headerSequence  ;                                       // ヘッダー項目の並び順
    163        private String  fileURL                 = BASE_URL;
    164        private String  filename                = HybsSystem.sys( "FILE_FILENAME" );   // ファイル名
    165        private String  sheetName               = "Sheet1" ;            // 3.5.4.2 (2003/12/15)
    166        private String  refFileURL              = BASE_URL;                     // 3.5.4.3 (2004/01/05)
    167        private String  refFilename     ;                                       // 3.5.4.3 (2004/01/05)
    168        private String  refSheetName    ;                                       // 3.5.4.3 (2004/01/05)
    169        private String  fontName                = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_NAME" );                   // 3.8.5.3 (2006/08/07)
    170        private String  fontPoint               = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_POINTS" );                 // 3.8.5.3 (2006/08/07)
    171        private String  encode                  = HybsSystem.sys( "FILE_ENCODE" );      // ファイルエンコーディング  "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
    172        private String  writerClass     ;                                                                                                               // 6.2.0.0 (2015/02/27) 個人設定可
    173        private boolean fileAppend              ;                                       // ファイルをAPPENDモードで出力するか
    174//      private boolean direct                  ;                                       // 6.9.5.0 (2018/04/23) 廃止
    175        private boolean zip                     ;
    176        private String  zipFilename             ;                                       // 6.0.4.0 (2014/11/28) Zipファイル名を外部から与えられるように修正
    177//      private String  disposition     = "attachment";         // 3.8.0.9 (2005/10/17) Content-Disposition 初期値変更 inline ⇒ attachment 6.9.5.0 (2018/04/23) 廃止
    178
    179        private transient DBTableModel table ;
    180        private String  tableId                 = HybsSystem.TBL_MDL_KEY ;
    181        private String  directory               ;                                       // 3.8.6.0 (2006/08/23)
    182
    183        private transient List<HybsEntry> param ;                       // 4.0.0 (2005/02/28)
    184
    185        private boolean useNumber               = true;                         // 3.7.0.2 (2005/02/14)
    186        // 4.0.0 (2005/12/31) 外部よりカラム列(CSV形式)を指定できるようにする。
    187        private String          columns         ;
    188        // 6.1.0.0 (2014/12/26) 書き込み対象外のカラム列を、外部(タグ)より指定する。
    189        private String          omitNames       ;                                       // 6.1.0.0 (2014/12/26)
    190
    191        // 5.2.1.0 (2010/10/01) 書込処理でコードリソースのラベル変換を行うかどうか
    192        private boolean useRenderer             = HybsSystem.sysBool( "USE_TABLE_WRITER_RENDERER" );    // 5.2.1.0 (2010/10/01)
    193
    194        // 5.5.5.5 (2012/08/24) チェック対応
    195        private boolean selectedAll             = true;                         // 5.5.5.5 (2012/08/24)
    196
    197        // 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか。互換性のため、false に設定。推奨は、true
    198        private boolean beforeDelete    ;                                       // 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか。
    199
    200        private int             skipRowCount    ;                                       // 5.7.9.0 (2014/08/08) データの書き込み開始位置設定
    201
    202        // 5.9.12.1 (2016/09/09)
    203        private boolean sheetOverwrite;                                         // 5.9.12.1 (2016/09/09)
    204        private String recalcSheetName;                                         // 5.9.12.1 (2016/09/09)
    205
    206        // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    207        private boolean useCellStyle            ;                       // EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します
    208        private boolean useAutoCellSize         ;                       // EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します
    209        private boolean useActiveWorkbook       ;                       // EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します
    210        private String  pageBreakColumn         ;                       // EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)
    211        private String  fileBreakColumn         ;                       // EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)
    212        private String  hyperLinkColumn         ;                       // EXCEL出力時に、Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定します
    213        private String  addTitleSheet           ;                       // EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。
    214
    215        /**
    216         * デフォルトコンストラクター
    217         *
    218         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    219         */
    220        public WriteTableTag() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    221
    222        /**
    223         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    224         *
    225         * @og.rev 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか（beforeDelete）フラグを追加
    226         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    227         * @og.rev 6.0.4.0 (2014/11/28) Zipファイル名を、内部変数化。(将来的に引数化を容易にするため)
    228         *
    229         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    230         */
    231        @Override
    232        public int doStartTag() {
    233                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    234                if( !useTag() ) { return SKIP_BODY ; }
    235
    236                directory = HybsSystem.url2dir( fileURL );              // 5.5.9.1 (2012/12/07) doEndTag() から移動
    237                if( zip && zipFilename == null ) { zipFilename = filename + ".zip"; }           // 6.0.4.0 (2014/11/28)
    238
    239                // 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか
    240                if( beforeDelete && !fileAppend ) {
    241                        File delFile = null;
    242                        if( zip ) {
    243                                delFile = new File( directory,zipFilename );                            // 6.0.4.0 (2014/11/28)
    244                        }
    245                        else      {
    246                                delFile = new File( directory,filename );
    247                        }
    248                        // 6.0.2.4 (2014/10/17) RV  java.io.File.delete() の例外的戻り値を無視しています。
    249                        if( delFile.exists() && !delFile.delete() ) {
    250                                        final String errMsg = "事前にファイルを削除するのに失敗しました。filename=[" + delFile +"]" ;
    251                                        System.err.println( errMsg );
    252                        }
    253                }
    254
    255                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
    256        }
    257
    258        /**
    259         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    260         *
    261         * @og.rev 2.1.3.1 (2002/12/13) ContentType を、x-msexcel から vnd.ms-excel に変更した。
    262         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    263         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    264         * @og.rev 3.1.5.0 (2003/04/20) Content-Disposition を外部から指定できるように変更。
    265         * @og.rev 3.2.0.0 (2003/05/22) GZIPOutputStream を使用していたが、ZipOutputStream に変更。
    266         * @og.rev 3.5.4.1 (2003/12/01) 引数の PrintWriter を、OutputStream に変更。
    267         * @og.rev 3.5.4.3 (2004/01/05) 引数を、 PrintWriter に戻す。
    268         * @og.rev 3.6.0.2 (2004/10/04) EXCELダイレクト出力時にファイルエンドまで出力されない不具合対策
    269         * @og.rev 3.8.0.9 (2005/10/17) disposition属性を使用できるように変更します。
    270         * @og.rev 3.8.6.0 (2006/08/23) フォルダがない場合は、複数階層分のフォルダを自動で作成します。
    271         * @og.rev 4.3.4.3 (2008/12/22) Excel出力の判別方法を前方一致に変更
    272         * @og.rev 5.1.6.0 (2010/05/01) 画面帳票作成機能対応
    273         * @og.rev 5.5.2.0 (2012/05/01) ZIP時にもencodeが有効にする
    274         * @og.rev 5.5.5.5 (2012/08/24) selectedAllの処理を追加
    275         * @og.rev 5.5.9.1 (2012/12/07) beforeDeleteフラグの追加に伴う、ロジック変更
    276         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    277         * @og.rev 6.0.4.0 (2014/11/28) Zip処理を、ZipOutputStream → ZipArchiveOutputStream に変更
    278         * @og.rev 6.2.0.0 (2015/02/27) EXCEL出力のparamLevel初期値変更 3:標準推奨 → 4:個人設定可
    279         * @og.rev 6.9.5.0 (2018/04/23) direct 廃止(false固定)
    280         *
    281         * @return      後続処理の指示
    282         */
    283        @Override
    284        public int doEndTag() {
    285                debugPrint();           // 4.0.0 (2005/02/28)
    286
    287                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    288                if( !useTag() ) { return EVAL_PAGE ; }
    289
    290                table = (DBTableModel)getObject( tableId );
    291                if( ! selectedAll ){            // 5.5.5.5 (2012/08/24)
    292                        table = getSelRowsTable( table );
    293                }
    294                if( table != null && table.getRowCount() > 0 ) {
    295
    296                        final File dir = new File( directory );
    297                        if( ! dir.exists() && ! dir.mkdirs() ) {
    298                                final String errMsg = "ディレクトリの作成に失敗しました。[" + directory + "]";
    299                                throw new HybsSystemException( errMsg );
    300                        }
    301
    302                        // 6.2.0.0 (2015/02/27) EXCEL出力のparamLevel初期値変更 3:標準推奨 → 4:個人設定可
    303                        if( writerClass == null ) {
    304                                writerClass = nval( sys( "TABLE_WRITER_DEFAULT_CLASS" ) , "Default" );          // 6.2.0.0 (2015/02/27) 個人設定可
    305                        }
    306
    307                        PrintWriter pw = null;
    308                        ByteArrayOutputStream bt = null ;
    309                        try {
    310//                              // 6.9.5.0 (2018/04/23) 廃止(false固定)
    311//                              if( direct ) {
    312//                                      // 6.0.4.0 (2014/11/28) 共通処理を、if( zip ) の前後でまとめます。
    313//                                      bt = new ByteArrayOutputStream();
    314//                                      pw = new PrintWriter( bt );
    315//                                      create( pw ) ;
    316//                                      pw.flush();                             // 3.6.0.2 (2004/10/04)
    317//                                      final ServletResponse response = pageContext.getResponse() ;
    318//                                      if( zip ) {
    319//                                              ((HttpServletResponse)response).addHeader( "Content-Encoding","gzip" );
    320//
    321//                                              final ZipArchiveOutputStream gzip = new ZipArchiveOutputStream(bt);     // 6.0.4.0 (2014/11/28)
    322//                                              gzip.finish() ;
    323//                                              response.setContentLength( bt.size() );
    324//
    325//                                              gzip.closeArchiveEntry();       // 6.0.4.0 (2014/11/28)
    326//                                              gzip.finish() ;                         // 6.0.4.0 (2014/11/28)
    327//                                              Closer.ioClose( gzip );         // 6.0.4.0 (2014/11/28)
    328//
    329//                                      }
    330//                                      else {
    331//                                              response.setContentType( "application/vnd.ms-excel; charset=" + encode );
    332//      //                                      response.setContentType( "application/x-msexcel; charset=" + encode );
    333//      //                                      response.setContentType( "text/comma-separated-values ; charset=" + encode );
    334//      //                                      ((HttpServletResponse)response).setHeader( "contentType","application/x-msexcel; charset=Shift_JIS" );
    335//      //                                      ((HttpServletResponse)response).setHeader( "Content-Disposition","attachment; filename=\"" + filename + "\"" );
    336//      //                                      ((HttpServletResponse)response).setHeader( "Content-Disposition","inline; filename=\"" + filename + "\"" );
    337//                                              // 3.8.0.9 (2005/10/17) disposition属性を使用できるように変更します。
    338//                                              ((HttpServletResponse)response).setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" );
    339//
    340//                                      }
    341//                                      final JspWriter out = pageContext.getOut();
    342//                                      out.clear();
    343//                                      out.print( bt );
    344//                                      out.flush();                    // 3.6.0.2 (2004/10/04)
    345//                              }
    346//                              else {
    347                                        final boolean isExcel =  writerClass.toUpperCase(Locale.JAPAN).startsWith("EXCEL")
    348                                                                                  || writerClass.toUpperCase(Locale.JAPAN).startsWith("CALC");  // 6.0.4.0 (2014/11/28)
    349
    350                                        // 3.2.0.0 (2003/05/22) GZIPOutputStream を使用していたが、ZipOutputStream に変更。
    351                                        if( zip ) {
    352                                                InputStream is = null;                  // 6.0.4.0 (2014/11/28)
    353                                                if( isExcel ) {                                 // 6.0.4.0 (2014/11/28)
    354                                                        create( null );                         // 6.0.4.0 (2014/11/28)
    355                                                }
    356                                                else{
    357                                                        bt = new ByteArrayOutputStream();
    358                                                        pw = getPrintWriter( bt );      // 6.0.4.0 (2014/11/28)
    359                                                        create( pw ) ;                          // 6.0.4.0 (2014/11/28)
    360                                                        pw.flush();                                     // 6.0.4.0 (2014/11/28)
    361                                                }
    362
    363                                                // 6.0.4.0 (2014/11/28) Zip処理を、ZipOutputStream → ZipArchiveOutputStream に変更
    364                                                ZipArchiveOutputStream gzip = null;                     // 6.0.4.0 (2014/11/28)
    365                                                try {
    366                                                        gzip = new ZipArchiveOutputStream(
    367                                                                                new BufferedOutputStream (
    368                                                                                        new FileOutputStream (
    369                                                                                                new File( directory,zipFilename ))));   // 6.0.4.0 (2014/11/28)
    370                                                        gzip.setEncoding( "Windows-31J" );
    371                                                        gzip.putArchiveEntry( new ZipArchiveEntry( filename ) );
    372                                                        // 6.0.4.0 (2014/11/28) Excel処理とText処理が異なる。
    373                                                        // bt.writeTo( gzip );
    374                                                        if( isExcel ) {
    375                                                                // 6.0.4.0 (2014/11/28) Excel の場合は、直接書き込むのではなく、ファイルを読み込んで Zip化する。
    376                                                                final File xlsTemp = new File( directory,filename );
    377                                                                is = new BufferedInputStream( new FileInputStream( xlsTemp ) );
    378                                                                IOUtils.copy( is,gzip );
    379                                                                Closer.ioClose( is );
    380                                                                if( xlsTemp.exists() && !xlsTemp.delete() ) {
    381                                                                        final String errMsg = "ExcelをZip化する時のTempファイルを削除するのに失敗しました。filename=[" + xlsTemp +"]" ;
    382                                                                        System.err.println( errMsg );
    383                                                                }
    384                                                        }
    385                                                        else {
    386                                                                bt.writeTo( gzip );
    387                                                        }
    388                                                        gzip.closeArchiveEntry();                               // 6.0.4.0 (2014/11/28)
    389                                                        gzip.finish() ;
    390                                                }
    391                                                finally {
    392                                                        Closer.ioClose( gzip );         // 4.0.0.0 (2006/01/31) close 処理時の IOException を無視
    393                                                        Closer.ioClose( is );           // 6.0.4.0 (2014/11/28) is は、null でも処理する。
    394                                                }
    395                                        }
    396                                        else {
    397                                                if( isExcel ) {                                 // 6.0.4.0 (2014/11/28)
    398                                                        create( null );
    399                                                }
    400                                                else {
    401                                                        pw = getPrintWriter();
    402                                                        create( pw );
    403                                                        pw.flush();                             // 3.6.0.2 (2004/10/04)
    404                                                }
    405                                        }
    406//                              }
    407                        }
    408                        catch( final IOException ex ) {
    409                                final String errMsg = "テーブル出力時に、IOエラーが発生しました。" + toString();
    410                                throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    411                        }
    412                        finally {
    413                                Closer.ioClose( pw );           // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    414                                Closer.ioClose( bt );           // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    415                        }
    416                }
    417
    418                return EVAL_PAGE ;
    419        }
    420
    421        /**
    422         * タグリブオブジェクトをリリースします。
    423         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    424         *
    425         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    426         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    427         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    428         * @og.rev 3.1.5.0 (2003/04/20) Content-Disposition を外部から指定できるように変更。
    429         * @og.rev 3.5.4.2 (2003/12/15) EXCELのシート名を指定できるように変更。
    430         * @og.rev 3.5.4.3 (2004/01/05) EXCEL雛型参照ファイルのURL,filenameを追加します。
    431         * @og.rev 3.8.5.3 (2006/08/07) writerClass 属性の初期値をシステムリソースより取得します。
    432         * @og.rev 3.8.5.3 (2006/08/07) fontName 属性を追加します。
    433         * @og.rev 3.8.5.3 (2006/08/07) fontPoint 属性を追加します。
    434         * @og.rev 3.8.6.0 (2006/08/23) directory 属性を追加します。
    435         * @og.rev 4.0.0.0 (2005/02/28) XMLファイルにセットする、param を追加。
    436         * @og.rev 5.2.1.0 (2010/10/01) 書込処理でコードリソースのラベル変換を行うかどうか useRenderer 属性追加
    437         * @og.rev 5.5.5.5 (2012/08/24) selectedAll属性を追加
    438         * @og.rev 5.5.9.1 (2012/12/07) 事前にファイルを削除するかどうか。互換性のため、false に設定。推奨は、true
    439         * @og.rev 5.7.9.0 (2014/08/08) データの書き込み開始位置(skipRowCount)を設定
    440         * @og.rev 6.0.2.0 (2014/09/19) EXCEL関係機能追加(useCellStyle,useAutoCellSize,useActiveWorkbook,
    441         *                                                              pageBreakColumn,fileBreakColumn,hyperLinkColumn,addTitleSheet)
    442         * @og.rev 6.0.4.0 (2014/11/28) zipFilename属性を追加。
    443         * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加
    444         * @og.rev 6.2.0.0 (2015/02/27) EXCEL出力のparamLevel初期値変更 3:標準推奨 → 4:個人設定可
    445         * @og.rev 5.9.12.1 (2016/09/09) sheetOverwrite で、雛形シートの使用時に、元のシート名を使用します。
    446         * @og.rev 6.9.5.0 (2018/04/23) direct 廃止(false固定)
    447         */
    448        @Override
    449        protected void release2() {
    450                super.release2();
    451                separator               = TableWriter.TAB_SEPARATOR;   // 項目区切り文字
    452                headerSequence  = null;                         // ヘッダー項目の並び順
    453                fileURL                 = BASE_URL;
    454                filename                = HybsSystem.sys( "FILE_FILENAME" );   // ファイル名
    455                sheetName               = "Sheet1";                     // 3.5.4.2 (2003/12/15)
    456                beforeDelete    = false;                        // 5.5.9.1 (2012/12/07)
    457                refFileURL              = BASE_URL;                     // 3.5.4.3 (2004/01/05)
    458                refFilename     = null;                         // 3.5.4.3 (2004/01/05)
    459                refSheetName    = null;                         // 3.5.4.2 (2003/12/15)
    460                sheetOverwrite  = false;                        // 5.9.12.1 (2016/09/09)
    461                recalcSheetName = null;                         // 5.9.12.1 (2016/09/09)
    462                fontName                = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_NAME" );                   // 3.8.5.3 (2006/08/07)
    463                fontPoint               = HybsSystem.sys( "TABLE_WRITER_DEFAULT_FONT_POINTS" );                 // 3.8.5.3 (2006/08/07)
    464                encode                  = HybsSystem.sys( "FILE_ENCODE" );       // ファイルエンコーディング  "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
    465                writerClass     = null;                                                                                                 // 6.2.0.0 (2015/02/27) 個人設定可
    466                fileAppend              = false;                        // ファイルをAPPENDモードで出力するか
    467//              direct                  = false;                        // 6.9.5.0 (2018/04/23) direct 廃止(false固定)
    468                zip                     = false;
    469                zipFilename             = null;                         // 6.0.4.0 (2014/11/28)
    470                table                   = null;
    471                tableId                 = HybsSystem.TBL_MDL_KEY ;
    472//              disposition     = "attachment";         // 3.8.0.9 (2005/10/17) 初期値変更 inline ⇒ attachment 6.9.5.0 (2018/04/23) 廃止
    473                param                   = null ;                        // 4.0.0 (2005/01/31)
    474                useNumber               = true;                         // 3.7.0.2 (2005/02/14)
    475                skipRowCount    = 0;                            // 5.7.9.0 (2014/08/08) データの書き込み開始位置を設定
    476                directory               = null;                         // 3.8.6.0 (2006/08/23)
    477                columns                 = null;                         // 4.0.0 (2005/12/31)
    478                omitNames               = null;                         // 6.1.0.0 (2014/12/26)
    479                useRenderer             = HybsSystem.sysBool( "USE_TABLE_WRITER_RENDERER" );    // 5.2.1.0 (2010/10/01)
    480                selectedAll             = true;                         // 5.5.5.5 (2012/08/24)
    481                // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    482                useCellStyle            = false;                // EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します
    483                useAutoCellSize         = false;                // EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します
    484                useActiveWorkbook       = false;                // EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します
    485                pageBreakColumn         = null;                 // EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)
    486                fileBreakColumn         = null;                 // EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)
    487                hyperLinkColumn         = null;                 // EXCEL出力時に、Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定します
    488                addTitleSheet           = null;                 // EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。
    489        }
    490
    491        /**
    492         * TableWriter の実オブジェクトを生成して，引数のPrintWriter に書きだします。
    493         *
    494         * EXCEL系は、自身で出力先のOutputStreamを作成するので、引数のPrintWriterを
    495         * 使わず、directory , filename から、生成します。
    496         *
    497         * @og.rev 3.5.4.1 (2003/12/01) 引数の PrintWriter を、OutputStream に変更。
    498         * @og.rev 3.5.4.2 (2003/12/15) lang 引数も table と同時に設定します。
    499         * @og.rev 3.5.4.2 (2003/12/15) TableWriter のサブクラス名変更。
    500         * @og.rev 3.5.4.3 (2004/01/05) EXCEL雛型参考ファイルを指定するように変更。
    501         * @og.rev 3.5.4.3 (2004/01/05) 引数を、 PrintWriter に戻す。
    502         * @og.rev 3.5.4.5 (2004/01/23) 文字エンコードを渡すように変更する。
    503         * @og.rev 3.5.6.0 (2004/06/18) 各種プラグイン関連付け設定を、システムパラメータ に記述します。
    504         * @og.rev 3.8.5.3 (2006/08/07) EXCEL時に fontName と fontPoint 属性をセットします。
    505         * @og.rev 4.0.0.0 (2005/01/31) キーの指定を、TableWriter. から、TableWriter_ に変更します。
    506         * @og.rev 4.0.0.0 (2005/12/31) 外部よりカラム列(CSV形式)を指定できるようにする。
    507         * @og.rev 5.2.1.0 (2010/10/01) 書込処理でコードリソースのラベル変換を行うかどうか設定 useRenderer 属性追加
    508         * @og.rev 5.7.9.0 (2014/08/08) データの書き込み開始位置(skipRowCount)を設定
    509         * @og.rev 6.0.2.0 (2014/09/19) EXCEL関係機能追加(useCellStyle,useAutoCellSize,useActiveWorkbook,pageBreakColumn,fileBreakColumn)
    510         * @og.rev 6.0.4.0 (2014/11/28) NullPointerException が発生するので、事前にチェックします。
    511         * @og.rev 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定
    512         * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加
    513         * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。
    514         * @og.rev 6.4.3.3 (2016/03/04) HybsSystem.newInstance(String,String) への置き換え。
    515         * @og.rev 5.9.12.1 (2016/09/09) sheetOverwrite で、雛形シートの使用時に、元のシート名を使用します。
    516         *
    517         * @param   outPW 出力先のPrintWriterオブジェクト
    518         */
    519        private void create( final PrintWriter outPW )  {
    520                // 5.2.1.0 (2010/10/01) writerClass で Renderer系の場合は、useRendererフラグに変更する。
    521                if( "ExcelRenderer".equalsIgnoreCase( writerClass ) ) {
    522                        writerClass = "Excel" ;
    523                        useRenderer = true;
    524                }
    525                else if( "Renderer".equalsIgnoreCase( writerClass ) ) {
    526                        writerClass = "Default" ;
    527                        useRenderer = true;
    528                }
    529
    530                final TableWriter writer = HybsSystem.newInstance( "TableWriter_" , writerClass );      // 3.5.5.3 (2004/04/09)
    531                writer.setDBTableModel( table,getLanguage() );
    532                writer.setSeparator( separator );
    533                writer.setHeaderSequence( headerSequence );
    534                writer.setEncode( encode );                                     // 3.5.4.5 (2004/01/23)
    535                writer.setAppend( fileAppend );                         // 3.5.4.2 (2003/12/15)
    536                if( param != null ) { writer.setParam( param ); }       // 4.0.0 (2005/01/31)
    537                writer.setUseNumber( useNumber );                       // 3.7.0.2 (2005/02/14)
    538        //      if( columns == null ) {
    539        //              columns = (String)getSessionAttribute( HybsSystem.TBL_WRITER_CLMS );
    540        //              removeSessionAttribute( HybsSystem.TBL_WRITER_CLMS );
    541        //      }
    542                writer.setColumns( columns );                           // 4.0.0 (2005/12/31)
    543                writer.setOmitNames( omitNames );                       // 6.1.0.0 (2014/12/26)
    544                writer.setUseRenderer( useRenderer );           // 5.2.1.0 (2010/10/01)
    545                writer.setDebug( isDebug() );                           // 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定
    546                if( writer.isExcel() ) {                                        // 3.5.4.3 (2004/01/05)
    547                        writer.setSheetName( sheetName );
    548                        writer.setFilename( directory , filename );                                     // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    549                        if( refFileURL != null && refFilename != null ) {
    550                                writer.setRefFilename( HybsSystem.url2dir( refFileURL , refFilename ) );                        // 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加
    551                        }
    552                        if( refSheetName != null && refSheetName.length() > 0 ) {       // 5.7.9.0 (2014/08/08) nullチェック
    553                                writer.setRefSheetName( refSheetName );
    554                        }
    555                        writer.setFontName( fontName )  ;                                                       // 5.7.9.0 (2014/08/08) nvalはずし
    556                        if( fontPoint != null && fontPoint.length() > 0 ) {
    557                                writer.setFontPoint( Short.parseShort( fontPoint ) );   // 3.8.5.3 (2006/08/07)
    558                        }
    559                        writer.setSkipRowCount( skipRowCount );                                         // 5.7.9.0 (2014/08/08)
    560
    561                        writer.setSheetOverwrite( sheetOverwrite );                                     // 5.9.12.1 (2016/09/09)
    562                        writer.setRecalcSheetName( recalcSheetName );                           // 5.9.12.1 (2016/09/09)
    563
    564                        writer.setUseCellStyle( useCellStyle );                                         // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    565                        writer.setUseAutoCellSize( useAutoCellSize );                           // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    566                        writer.setUseActiveWorkbook( useActiveWorkbook );                       // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    567                        writer.setPageBreakColumn( pageBreakColumn );                           // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    568                        writer.setFileBreakColumn( fileBreakColumn );                           // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    569                        writer.setHyperLinkColumn( hyperLinkColumn );                           // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    570                        writer.setAddTitleSheet( addTitleSheet );                                       // 6.0.2.0 (2014/09/19) EXCEL関係機能追加
    571
    572                        writer.writeDBTable();
    573                }
    574                else {
    575                        writer.writeDBTable( outPW );
    576                }
    577        }
    578
    579        /**
    580         * PrintWriter を取得します。
    581         *
    582         * ここでは、一般的なファイル出力を考慮した PrintWriter を作成します。
    583         *
    584         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
    585         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    586         * @og.rev 3.5.4.1 (2003/12/01) PrintWriter を、OutputStream に変更。
    587         * @og.rev 3.5.5.9 (2004/06/07) FileUtil.getBufferedReader を使用
    588         * @og.rev 3.7.1.1 (2005/05/23) フォルダがない場合は、複数階層分のフォルダを自動で作成します。
    589         * @og.rev 3.8.0.0 (2005/06/07) FileUtil#getPrintWriter を利用。
    590         *
    591         * @return      ファイル書き出し用のPrintWriterオブジェクト
    592         */
    593        private PrintWriter getPrintWriter() {
    594                if( filename == null ) {
    595                        final String errMsg = "ファイル名がセットされていません。";
    596                        throw new HybsSystemException( errMsg );
    597                }
    598
    599                // 6.4.1.1 (2016/01/16) ワンクッションいれずに return します。
    600                return FileUtil.getPrintWriter( new File( directory,filename ),encode,fileAppend );
    601        }
    602
    603        /**
    604         * PrintWriter を取得します。
    605         *
    606         * 引数で指定したOutputStreamを利用して出力します。
    607         *
    608         * @og.rev 5.5.2.0 (2012/05/01) 新規作成
    609         *
    610         * @param       os      OutputStreamオブジェクト
    611         *
    612         * @return      指定したstreamに書き出すPrintWriter
    613         */
    614        private PrintWriter getPrintWriter( final OutputStream os ) {
    615                // 6.4.1.1 (2016/01/16) ワンクッションいれずに return します。
    616                return FileUtil.getPrintWriter( os,encode );
    617        }
    618
    619        /**
    620         * チェック分のテーブルモデルを再構成します。
    621         *
    622         * @og.rev 5.5.5.5 (2012/08/24) 新規作成
    623         * @og.rev 5.5.9.1 (2012/12/07) 内部処理変更
    624         *
    625         * @param       oldTable        コピー元テーブルモデル
    626         *
    627         * @return      チェックした分だけで再構成したテーブルモデル
    628         */
    629        private DBTableModel getSelRowsTable( final DBTableModel oldTable ) {
    630                if( oldTable == null ) { return null; }         // 5.5.9.1 (2012/12/07) 引数のDBTableModelが null の場合の処理。
    631
    632                final DBTableModel newTable = oldTable.newModel();
    633                final int[] rowNo = getParameterRows();
    634                final int rowCount = rowNo.length ;
    635
    636                for( int i=0; i<rowCount; i++ ) {
    637                        newTable.addValues( oldTable.getValues(rowNo[i]), i );
    638                }
    639                return newTable;
    640        }
    641
    642        /**
    643         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
    644         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。
    645         *
    646         * @og.tag
    647         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
    648         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
    649         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
    650         * この tableId 属性を利用して、メモリ空間を分けます。
    651         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。
    652         *
    653         * @param       id テーブルID (sessionに登録する時のID)
    654         */
    655        public void setTableId( final String id ) {
    656                tableId = nval( getRequestParameter( id ), tableId );
    657        }
    658
    659        /**
    660         * 【TAG】可変長ファイルを作成するときの項目区切り文字をセットします
    661         *              (初期値:TableWriter#TAB_SEPARATOR[={@og.value TableWriter#TAB_SEPARATOR}])。
    662         *
    663         * @og.tag 可変長ファイルを作成するときの項目区切り文字をセットします。
    664         * (初期値:TableWriter#TAB_SEPARATOR[={@og.value TableWriter#TAB_SEPARATOR}])。
    665         *
    666         * @param   separator 項目区切り文字
    667         * @see         org.opengion.hayabusa.io.TableWriter#TAB_SEPARATOR
    668         */
    669        public void setSeparator( final String separator ) {
    670                this.separator = nval( getRequestParameter( separator ),this.separator );
    671        }
    672
    673        /**
    674         * 【TAG】DBTableModelの出力順(LNSCD など)をセットします。
    675         *
    676         * @og.tag
    677         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
    678         * 出力順を設定します。
    679         *
    680         * @param   hs 出力順 (LNSCD など)
    681         */
    682        public void setHeaderSequence( final String hs ) {
    683                final String[] headers = getRequestParameterValues( hs );
    684                if( headers != null ) {
    685                        final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
    686                        for( int i=0; i<headers.length; i++ ) {
    687                                if( headers[i] != null ) { buf.append( headers[i] ); }
    688                        }
    689                        headerSequence = buf.toString();
    690                }
    691        }
    692
    693        /**
    694         * 【TAG】ファイル保存先ディレクトリ名を指定します
    695         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
    696         *
    697         * @og.tag
    698         * この属性で指定されるディレクトリに、ファイルをセーブします。
    699         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    700         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    701         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    702         * fileURL = "{&#064;USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
    703         * さらに、各個人ID別のフォルダを作成して、そこにセーブします。
    704         *
    705         * @og.rev 3.5.4.3 (2004/01/05) 内部処理を、makeFileURL に移動。
    706         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
    707         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
    708         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
    709         *
    710         * @param       url 保存先ディレクトリ名
    711         */
    712        public void setFileURL( final String url ) {
    713                final String furl = nval( getRequestParameter( url ),null );
    714                if( furl != null ) {
    715                        fileURL = StringUtil.urlAppend( fileURL,furl );
    716                }
    717        }
    718
    719        /**
    720         * 【TAG】ファイルを作成するときのファイル名をセットします
    721         *              (初期値:FILE_FILENAME[={@og.value SystemData#FILE_FILENAME}])。
    722         *
    723         * @og.tag ファイルを作成するときのファイル名をセットします。
    724         * (初期値:システム定数のFILE_ENCODE[={@og.value SystemData#FILE_FILENAME}])。
    725         *
    726         * @param   filename ファイル名
    727         * @see         org.opengion.hayabusa.common.SystemData#FILE_FILENAME
    728         */
    729        public void setFilename( final String filename ) {
    730                this.filename = nval( getRequestParameter( filename ),this.filename );
    731        }
    732
    733        /**
    734         * 【TAG】EXCELファイルを書き出すときのシート名を設定します(初期値:Sheet1)。
    735         *
    736         * @og.tag
    737         * EXCELファイルを書き出す時に、シート名を指定します。これにより、複数の形式の
    738         * 異なるデータを順次書き出したり(appendモードを併用)することや、シートを指定して
    739         * 新規にEXCELを作成することが可能になります。
    740         * 初期値は、Sheet1 です。
    741         *
    742         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
    743         *
    744         * @param   sheet シート名
    745         */
    746        public void setSheetName( final String sheet ) {
    747                sheetName = nval( getRequestParameter( sheet ),sheetName );
    748        }
    749
    750        /**
    751         * 【TAG】ファイルを作成するときのファイルエンコーディング名をセットします
    752         *              (初期値:FILE_ENCODE[={@og.value SystemData#FILE_ENCODE}])。
    753         *
    754         * @og.tag
    755         * "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
    756         * (初期値:システム定数のFILE_ENCODE[={@og.value SystemData#FILE_ENCODE}])。
    757         *
    758         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
    759         * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。
    760         *
    761         * @param   enc エンコーディング名 (例:DEFAULT,JISAutoDetect,JIS,EUC_JP,MS932,SJIS,Windows-31J,Shift_JIS)
    762         * @see     <a href="http://www.iana.org/assignments/character-sets">IANA Charset Registry</a>
    763         * @see         org.opengion.hayabusa.common.SystemData#FILE_ENCODE
    764         */
    765        public void setEncode( final String enc ) {
    766                encode = nval( getRequestParameter( enc ),encode );
    767        }
    768
    769        /**
    770         * 【TAG】実際に書き出すクラス名の略称({@og.doc03Link writerClass TableWriter_**** クラスの ****})を指定します
    771         *              (初期値:TABLE_WRITER_DEFAULT_CLASS[={@og.value SystemData#TABLE_WRITER_DEFAULT_CLASS}])。
    772         *
    773         * @og.tag
    774         * 実際に書き出すクラス名(の略称)をセットします。
    775         * org.opengion.hayabusa.io.TableWriter インターフェースを継承したサブクラスです。
    776         * これは、org.opengion.plugin.io 以下の TableWriter_**** クラスの **** を与えます。
    777         * 属性クラス定義の {@link org.opengion.hayabusa.io.TableWriter TableWriter} を参照願います。
    778         * {@og.doc03Link writerClass TableWriter_**** クラス}
    779         *
    780         * ExcelRenderer と、Renderer は、特別な名前で、useRenderer 属性に、"true" をセットするのと同じ効果があります。
    781         * 実際は、ExcelRenderer ⇒ Excel 、Renderer  ⇒ Default のクラスが呼ばれます。
    782         * (初期値:TABLE_WRITER_DEFAULT_CLASS[={@og.value SystemData#TABLE_WRITER_DEFAULT_CLASS}])。
    783         *
    784         * @param   writerClass クラス名(の略称)
    785         * @see         org.opengion.hayabusa.io.TableWriter  TableWriterのサブクラス
    786         */
    787        public void setWriterClass( final String writerClass ) {
    788                this.writerClass = nval( getRequestParameter( writerClass ),this.writerClass );
    789        }
    790
    791        /**
    792         * 【TAG】追加モードで書き込むかどうか[true/false]を指定します(初期値:false[新規モード])。
    793         *
    794         * @og.tag DBTableModelのファイルを、追加モードで書き込むかどうかをセットします。
    795         *
    796         * @param   flag 追加モードか [true:追加モード/それ以外:新規モード]
    797         */
    798        public void setFileAppend( final String flag ) {
    799                fileAppend = nval( getRequestParameter( flag ),fileAppend );
    800        }
    801
    802//      /**
    803//       * 【廃止】結果をダイレクトにEXCEL起動するかどうか[true/false]を指定します(初期値:false[ファイル])。
    804//       *
    805//       * @og.tag 結果をダイレクトに EXCEL ファイルとして出力するかどうかをセットします。
    806//       *
    807//       * @og.rev 6.9.5.0 (2018/04/23) 物理的に廃止
    808//       *
    809//       * @param  flag ダイレクト起動か [true:ダイレクト/それ以外:ファイル]
    810//       * @deprecated 結果をダイレクトするとエンコード等でおかしな動きをする可能性がある。
    811//       */
    812//      @Deprecated public void setDirect( final String flag ) {
    813//              direct = nval( getRequestParameter( flag ),direct );
    814//      }
    815
    816        /**
    817         * 【TAG】結果をファイルに出力するときに、ZIPで圧縮するかどうか[true/false]を指定します(初期値:false)。
    818         *
    819         * @og.tag
    820         * 初期値は、圧縮しないです。
    821         *
    822         * @param  flag ZIPで圧縮する [true:圧縮する/それ以外:しない]
    823         */
    824        public void setZip( final String flag ) {
    825                zip = nval( getRequestParameter( flag ),zip );
    826        }
    827
    828        /**
    829         * 【TAG】ZIPファイルを作成するときのZIPファイル名をセットします(初期値:filename + ".zip")。
    830         *
    831         * @og.tag
    832         * zip 属性に、true を指定した場合に、ZIPファイル化します。その場合のファイル名を指定します。
    833         * なにも指定しない場合は、filename + ".zip" になります。
    834         *
    835         * @og.rev 6.0.4.0 (2014/11/28) Zipファイル名を外部から与えられるように修正
    836         *
    837         * @param   zipFile ZIPファイル名
    838         * @see #setZip( String )
    839         */
    840        public void setZipFilename( final String zipFile ) {
    841                zipFilename = nval( getRequestParameter( zipFile ),zipFilename );
    842        }
    843
    844//      /**
    845//       * 【廃止】Content-Disposition [inline:埋め込む/attachment:ダイアログを起動]を指定します(初期値:attachment)。
    846//       *
    847//       * @og.tag
    848//       * Content-Disposition を指定することで、ブラウザにアプリケーションデータを
    849//       * 埋め込むのか(inline)、セーブ/オープンのダイアログを起動するのか(attachment)
    850//       * 指定します。
    851//       * この属性が有効なのは、direct="true" で、zip="false"(初期値)のときのみです。
    852//       * 値は、inline 、attachment が指定できます。
    853//       * 初期値は、attachment です。
    854//       * 注意：動作検証しましたが、inline と attachment で動作に差が現れませんでした。
    855//       *
    856//       * @og.rev 3.1.5.0 (2003/04/20) Content-Disposition を外部から指定できるように変更。
    857//       * @og.rev 3.8.0.9 (2005/10/17) Content-Disposition 初期値変更 inline ⇒ attachment
    858//       * @og.rev 6.9.5.0 (2018/04/23) 物理的に廃止
    859//       *
    860//       * @param  pos 埋め込みするかどうか [inline:埋め込む/attachment:ダイアログを起動]
    861//       */
    862//      public void setDisposition( final String pos ) {
    863//              disposition = nval( getRequestParameter( pos ),disposition );
    864//              if( !"inline".equals( disposition ) && !"attachment".equals( disposition ) ) {
    865//                      final String errMsg = "disposition には、inline か attachment 以外は指定できません。"
    866//                                              + "disposition=[" + disposition + "]" ;
    867//                      throw new HybsSystemException( errMsg );
    868//              }
    869//      }
    870
    871        /**
    872         * 【TAG】EXCEL雛型参照ファイルのディレクトリ名をセットします
    873         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
    874         *
    875         * @og.tag
    876         * この属性で指定されるディレクトリに、ファイルをセーブします。
    877         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    878         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    879         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    880         * fileURL = "{&#064;USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
    881         * さらに、各個人ID別のフォルダを作成して、そこにセーブします。
    882         *
    883         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
    884         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
    885         * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。
    886         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
    887         *
    888         * @param       url 雛型ﾃﾞｨﾚｸﾄﾘ名
    889         */
    890        public void setRefFileURL( final String url ) {
    891                final String furl = nval( getRequestParameter( url ),null );
    892                if( furl != null ) {
    893                        refFileURL = StringUtil.urlAppend( refFileURL,furl );
    894                }
    895        }
    896
    897        /**
    898         * 【TAG】EXCEL雛型参考ファイル名をセットします。
    899         *
    900         * @og.tag
    901         * 内部処理的には、雛形ファイルの雛形シートをメモリ上に構築し、
    902         * そのシートのセルに、データを追加していきます。
    903         * 最後には、雛形シートとして存在しない部分は、すべて削除します。
    904         * 雛形シートを使わない場合は、新規シートに追加していくことになります。
    905         * appendモードの場合は、オリジナルが雛形ファイルになります。
    906         * 雛形ファイルの指定は、無効になります。
    907         * ※ 互換性の為、同じ名前の設定は有効です。
    908         *
    909         * ※ Excel2007形式(XSSF)では、行全体を指定した色や罫線は、
    910         * セルとして認識されません。範囲指定で、罫線や色付けを行う必要があります。
    911         *
    912         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
    913         *
    914         * @param   filename 雛型ﾌｧｲﾙ名
    915         */
    916        public void setRefFilename( final String filename ) {
    917                refFilename = nval( getRequestParameter( filename ),refFilename );
    918        }
    919
    920        /**
    921         * 【TAG】EXCEL雛型参考ファイルのシート名を設定します。
    922         *
    923         * @og.tag
    924         * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。
    925         * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する
    926         * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。
    927         * 初期値は、null(第一シート) です。
    928         *
    929         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
    930         *
    931         * @param   sheet 雛型ｼｰﾄ名
    932         */
    933        public void setRefSheetName( final String sheet ) {
    934                refSheetName = nval( getRequestParameter( sheet ),refSheetName );
    935        }
    936
    937        /**
    938         * 【TAG】雛形のシート名を、そのまま使用する(true)か、新規、または、外部指定のシート名を使用する(false)を指定します。(初期値:false[外部指定のシート名を使用])。
    939         *
    940         * @og.tag
    941         * ※ Ver5では、追記モード時に、指定シートが存在した場合は上書きします(初期値:false[上書きしない])。5.9.12.1 (2016/09/09)
    942         *    Ver6では、追記モード時に、雛形を指定できないため、雛形のシート名を、そのまま使用する(true)か、
    943         *    新規、または、外部指定のシート名を使用する(false)を指定する属性になります。
    944         *
    945         * @og.rev 6.5.0.0 (2016/09/30) sheetOverwrite で、雛形シートの使用時に、元のシート名を使用します。
    946         *
    947         * @param   flag 元のシート名を使用するかどうか [true:使用する/false:新規、または、外部指定のシート名を使用]
    948         */
    949        public void setSheetOverwrite( final String flag ) {
    950                sheetOverwrite = nval( getRequestParameter( flag ),sheetOverwrite );
    951        }
    952
    953        /**
    954         * 【TAG】EXCELで、出力処理の最後に、セル内の計算式を再計算させるシート名をCSV形式で指定します。
    955         *
    956         * @og.tag
    957         * 通常は利用する必要はありません。
    958         * 一覧結果を利用した集計用シートを別に持っているような雛形を利用した出力で利用します。
    959         *
    960         * @og.rev 6.5.0.0 (2016/09/30) recalcSheetName で、セル内の計算式を再計算させるシート名を指定。5.9.12.1 (2016/09/09)
    961         *
    962         * @param   sheet 対象シート名(CSV形式文字)
    963         */
    964        public void setRecalcSheetName( final String sheet ) {
    965                recalcSheetName = nval( getRequestParameter( sheet ),recalcSheetName );
    966        }
    967
    968        /**
    969         * 【TAG】EXCEL出力時のデフォルトフォント名を設定します
    970         *              (初期値:TABLE_WRITER_DEFAULT_FONT_NAME[={@og.value SystemData#TABLE_WRITER_DEFAULT_FONT_NAME}])。
    971         *
    972         * @og.tag
    973         * これは、EXCEL追加機能として実装されています。
    974         *
    975         * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。
    976         * フォント名は、EXCELのフォント名をそのまま使用してください。
    977         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
    978         * に設定されます。
    979         * (初期値:システム定数のTABLE_WRITER_DEFAULT_FONT_NAME[={@og.value SystemData#TABLE_WRITER_DEFAULT_FONT_NAME}])。
    980         *
    981         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
    982         *
    983         * @param   name デフォルトフォント名
    984         * @see         org.opengion.hayabusa.common.SystemData#TABLE_WRITER_DEFAULT_FONT_NAME
    985         */
    986        public void setFontName( final String name ) {
    987                fontName = nval( getRequestParameter( name ),fontName );
    988        }
    989
    990        /**
    991         * 【TAG】EXCEL出力時のデフォルトフォントポイント数を設定します
    992         *              (初期値:TABLE_WRITER_DEFAULT_FONT_POINTS[={@og.value SystemData#TABLE_WRITER_DEFAULT_FONT_POINTS}])。
    993         *
    994         * @og.tag
    995         * これは、EXCEL追加機能として実装されています。
    996         *
    997         * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。
    998         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
    999         * に設定されます。
    1000         * (初期値:システム定数のTABLE_WRITER_DEFAULT_FONT_POINTS[={@og.value SystemData#TABLE_WRITER_DEFAULT_FONT_POINTS}])。
    1001         *
    1002         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
    1003         *
    1004         * @param   point フォントポイント数
    1005         * @see         org.opengion.hayabusa.common.SystemData#TABLE_WRITER_DEFAULT_FONT_POINTS
    1006         */
    1007        public void setFontPoint( final String point ) {
    1008                fontPoint = nval( getRequestParameter( point ),fontPoint );
    1009        }
    1010
    1011        /**
    1012         * 【TAG】ファイル出力時に、行番号情報を、出力する/しない[true/false]を指定します(初期値:true)。
    1013         *
    1014         * @og.tag
    1015         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
    1016         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
    1017         * (#NAME 属性は、読み取り時にあれば、自動的にカラムに割り当てられます。)
    1018         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力等)
    1019         * の為に出力する場合に、false を設定することで、行番号列を出力しない
    1020         * ようにできます。
    1021         * 初期値は、true(出力する) です。
    1022         *
    1023         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
    1024         *
    1025         * @param   useNo 行番号情報 [true:出力する/false:しない]
    1026         */
    1027        public void setUseNumber( final String useNo ) {
    1028                useNumber = nval( getRequestParameter( useNo ),useNumber );
    1029        }
    1030
    1031        /**
    1032         * 【TAG】書き込み先ファイルのカラム列を、外部(タグ)よりCSV形式で指定します。
    1033         *
    1034         * @og.tag
    1035         * この指定により、書き込むカラムを限定的に使用することが可能です。
    1036         * カラム名は、検索したDBTableModel上に含まれる名前で指定する必要があります。
    1037         * 別名で書き込みたい場合は、予めその名前で検索しておく必要があります。
    1038         * カラム名を指定しない場合(例えば ,,, など)は、カラムを書き飛ばします。
    1039         *
    1040         * @og.rev 4.0.0.0 (2005/12/31) 新規作成
    1041         *
    1042         * @param   clms 書込カラム列 (CSV形式)
    1043         */
    1044        public void setColumns( final String clms ) {
    1045                columns = nval( getRequestParameter( clms ),columns );
    1046        }
    1047
    1048        /**
    1049         * 【TAG】書き込み対象外のカラム列を、外部(タグ)よりCSV形式で指定します。
    1050         *
    1051         * @og.tag
    1052         * 指定するカラム名に対して、書き込み処理を行いません。
    1053         * ここで指定するカラム名は、検索したDBTableModel上に含まれる必要はありません。
    1054         * その場合は、ここでの指定は無視されます。
    1055         *
    1056         * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加
    1057         *
    1058         * @param   clms 書込対象外カラム列 (CSV形式)
    1059         */
    1060        public void setOmitNames( final String clms ) {
    1061                omitNames = nval( getRequestParameter( clms ),omitNames );
    1062        }
    1063
    1064        /**
    1065         * 【TAG】書込処理でコードリソースのラベル変換を行うかどうかを指定します
    1066         *              (初期値:USE_TABLE_WRITER_RENDERER[={@og.value SystemData#USE_TABLE_WRITER_RENDERER}])。
    1067         *
    1068         * @og.tag
    1069         * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか
    1070         * 不明になります。
    1071         * これは、コードリソースをラベルに変換して出力するかどうかを指定します。
    1072         * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので
    1073         * TableReader 系で読み込む場合には、リスクが発生します。
    1074         * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、
    1075         * setUseRenderer メソッドで指定する必要があります。
    1076         *
    1077         * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、
    1078         * このメソッドの属性値のフラグで、制御します。
    1079         * (初期値:システム定数のUSE_TABLE_WRITER_RENDERER[={@og.value SystemData#USE_TABLE_WRITER_RENDERER}])。
    1080         *
    1081         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
    1082         *
    1083         * @param  flag ラベル変換可否 [true:する/false:しない]
    1084         * @see         org.opengion.hayabusa.common.SystemData#USE_TABLE_WRITER_RENDERER
    1085         */
    1086        public void setUseRenderer( final String flag ) {
    1087                useRenderer = nval( getRequestParameter( flag ),useRenderer );
    1088        }
    1089
    1090        /**
    1091         * 【TAG】(通常は使いません)EXCEL出力時のデータの書き込み開始行番号を設定します(初期値:0)。
    1092         *
    1093         * @og.tag
    1094         * EXCELのデータの書き込みの開始行番号を指定します。
    1095         * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。
    1096         * ファイルの先頭行が、０行としてカウントしますので、設定値は、読み飛ばす
    1097         * 件数になります。(１と指定すると、１行読み飛ばし、２行目から読み込みます。)
    1098         * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、
    1099         * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。
    1100         * 現時点では、Excel の場合のみ有効です。
    1101         *
    1102         * @og.rev 5.7.9.0 (2014/08/08) 新規作成
    1103         *
    1104         * @param       count 書き込み開始行番号
    1105         */
    1106        public void setSkipRowCount( final String count ) {
    1107                skipRowCount = nval( getRequestParameter( count ),skipRowCount );
    1108        }
    1109
    1110        /**
    1111         * 【TAG】EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します(初期値:false)。
    1112         *
    1113         * @og.tag
    1114         * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている
    1115         * だけなので、ある程度加工が必要です。
    1116         * そこで、データのセットされたセルに罫線を入れることで、それなりのデータが
    1117         * 出力された感じになります。
    1118         * この設定と、useAutoCellSize="true" で、セルの幅を自動調整すれば、見栄えが良くなります。
    1119         * なお、この機能は、TableWriter_Excel のみに実装します。
    1120         *
    1121         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1122         *
    1123         * @param       useStyle 罫線追記 [true:する/false:しない]
    1124         * @see         #setUseAutoCellSize( String )
    1125         */
    1126        public void setUseCellStyle( final String useStyle ) {
    1127                useCellStyle = nval( getRequestParameter( useStyle ),useCellStyle );
    1128        }
    1129
    1130        /**
    1131         * 【TAG】EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します(初期値:false)。
    1132         *
    1133         * @og.tag
    1134         * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている
    1135         * だけなので、ある程度加工が必要です。
    1136         * そこで、データのセットされたセルの幅を自動調整することで、それなりのデータが
    1137         * 出力された感じになります。
    1138         * この設定と、useCellStyle="true" で、セルの罫線を自動設定すれば、見栄えが良くなります。
    1139         * なお、この機能は、TableWriter_Excel のみに実装します。
    1140         *
    1141         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1142         *
    1143         * @param       useAutoSize 幅の自動的調整 [true:する/false:しない]
    1144         * @see         #setUseCellStyle( String )
    1145         */
    1146        public void setUseAutoCellSize( final String useAutoSize ) {
    1147                useAutoCellSize = nval( getRequestParameter( useAutoSize ),useAutoCellSize );
    1148        }
    1149
    1150        /**
    1151         * 【TAG】EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)。
    1152         *
    1153         * @og.tag
    1154         * セルの有効範囲というのは、EXCELでの 空行、空列の存在しない範囲を指します(初期値:false)。
    1155         * 通常、空行でも、データとして残っている場合は、EXCELのセルオブジェクトは存在します。
    1156         * ここで、useActiveWorkbook="true" とすると、空行、空列を削除します。
    1157         *
    1158         * 雛形を使用した場合は、データより多めに設定した計算などは、この処理で
    1159         * 削除されますので、データサイズにフィットさせることができます。
    1160         * なお、この機能は、TableWriter_Excel のみに実装します。
    1161         *
    1162         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1163         *
    1164         * @param       useActWB 有効範囲の設定 [true:する/false:しない]
    1165         */
    1166        public void setUseActiveWorkbook( final String useActWB ) {
    1167                useActiveWorkbook = nval( getRequestParameter( useActWB ),useActiveWorkbook );
    1168        }
    1169
    1170        /**
    1171         * 【TAG】EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)。
    1172         *
    1173         * @og.tag
    1174         * EXCEL帳票では、帳票雛形に、PAGE_BRAKE キーを設定しましたが、TableWriterでは、
    1175         * メモリ上のカラムの値が変更したときに、シート変更させることができます。
    1176         * このカラムの値がキーブレイクすると、新しいシートに書き出し始めます。
    1177         * シート名は、このカラムの値（キーブレイクする値）です。
    1178         *
    1179         * 雛形ファイルを使用する場合、雛形シートもキーブレイクに伴って、＋１されます。
    1180         * つまり、雛形シートとデータシートは同時に変更されます。
    1181         * ただし、雛形シートは、最後の雛形シートで止まります。
    1182         * これは、雛形シートにヘッダー雛形とボディ雛形を用意しておき、最初のキーブレイクで
    1183         * ヘッダーからボディの書き込みにチェンジするイメージで使用できます。
    1184         * なお、この機能は、TableWriter_Excel のみに実装します。
    1185         *
    1186         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1187         *
    1188         * @param       pbColumn シート変更カラム名
    1189         * @see         #setFileBreakColumn( String )
    1190         */
    1191        public void setPageBreakColumn( final String pbColumn ) {
    1192                pageBreakColumn = nval( getRequestParameter( pbColumn ),pageBreakColumn );
    1193        }
    1194
    1195        /**
    1196         * 【TAG】EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)。
    1197         *
    1198         * @og.tag
    1199         * EXCEL帳票では、メモリ上のカラムの値が変更したときに、ファイル名を変更することができます。
    1200         * このカラムの値がキーブレイクすると、新しいファイルに書き出し始めます。
    1201         * ファイル名は、このカラムの値（キーブレイクする値）＋ 元の出力ファイル名の拡張子(.xlsなど)です。
    1202         * この設定を使用する場合は、出力ファイル名は無視されますが、拡張子だけは使用されます。
    1203         *
    1204         * 雛形ファイルを使用する場合、雛形ファイルもキーブレイクに伴って、再利用されます。
    1205         * 例えば、pageBreakColumn と併用する場合、キーブレイクで雛形シートも最初から適用になります。
    1206         * なお、この機能は、TableWriter_Excel のみに実装します。
    1207         *
    1208         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1209         *
    1210         * @param       fbColumn ファイルブレイクカラム
    1211         * @see         #setPageBreakColumn( String )
    1212         */
    1213        public void setFileBreakColumn( final String fbColumn ) {
    1214                fileBreakColumn = nval( getRequestParameter( fbColumn ),fileBreakColumn );
    1215        }
    1216
    1217        /**
    1218         * 【TAG】EXCEL出力時に、Hyperlinkを作成するキーとなる「カラム名:値」形式のカラム名を指定します。
    1219         *
    1220         * @og.tag
    1221         * ここで、作成するハイパーリンクは、EXCELのシートに対するハイパーリンクです。
    1222         * それ以外のリンク(本当のURLやファイル等)のリンクは(今は)作成できません。
    1223         * ハイパーリンクを作成するには、①作成するカラム と ②作成する値 が必要です。
    1224         * このメソッドで設定するのは、「①:②」という形式でカラム名を指定します。
    1225         * ②がなければ、①と同じとします。
    1226         * ②の値のシートの存在有無は、無視します。ハイパーリンクを作成するシートを作成する前に
    1227         * ハイパーリンクを作成するケースが存在します。
    1228         * (例えば、各シートへのリンクを持った一覧を作成してから、明細の各シートを作成する様なケース)
    1229         * なお、この機能は、TableWriter_Excel のみに実装します。
    1230         *
    1231         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1232         *
    1233         * @param       hlColumn リンク作成カラム名 (「カラム名:値」形式)
    1234         */
    1235        public void setHyperLinkColumn( final String hlColumn ) {
    1236                hyperLinkColumn = nval( getRequestParameter( hlColumn ),hyperLinkColumn );
    1237        }
    1238
    1239        /**
    1240         * 【TAG】EXCEL出力時に、Sheet一覧を作成する場合のSheet名を指定します。
    1241         *
    1242         * @og.tag
    1243         * これは、Workbook に含まれる Sheet 一覧を作成する場合に、利用可能です。
    1244         * なお、この機能は、TableWriter_Excel のみに実装します。
    1245         *
    1246         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
    1247         *
    1248         * @param       sheetName タイトルシート名
    1249         */
    1250        public void setAddTitleSheet( final String sheetName ) {
    1251                addTitleSheet = nval( getRequestParameter( sheetName ),addTitleSheet );
    1252        }
    1253
    1254        /**
    1255         * 【TAG】チェック行のみを対象にするかを指定します(初期値:true)。
    1256         *
    1257         * @og.tag
    1258         * falseを指定する事で、前画面でチェックした行のみを出力します。
    1259         * 初期値は全ての行を出力(true)です。
    1260         * 出力されるファイルの行番号は、1から振りなおされます。
    1261         *
    1262         * @og.rev 5.5.5.5 (2012/08/24) 新規作成
    1263         *
    1264         * @param   flag 対象にするか [true:全件/false:対象のみ]
    1265         */
    1266        public void setSelectedAll( final String flag ) {
    1267                selectedAll = nval( getRequestParameter( flag ),selectedAll );          // 5.5.9.1 (2012/12/07) バグ対応
    1268        }
    1269
    1270        /**
    1271         * 【TAG】事前にファイルを削除するかどうかを指定します(初期値:false)。
    1272         *
    1273         * @og.tag
    1274         * 出力元の DBTableModel が、存在しないか、０件の場合、過去に作成したファイルが
    1275         * そのまま、残っていると、不要なトラブルのもととなる為、実行前に削除するか
    1276         * どうかを指定できます。
    1277         * なお、fileAppend="true"（追加モードで書き込むを指定)時には、データが０件でも
    1278         * 事前削除は行いません。
    1279         * 初期値は互換性のため削除しない(false)です。
    1280         *
    1281         * @og.rev 5.5.9.1 (2012/12/07) 新規作成
    1282         *
    1283         * @param   flag 事前削除するかどうか [true:削除する/false:削除しない]
    1284         */
    1285        public void setBeforeDelete( final String flag ) {
    1286                beforeDelete = nval( getRequestParameter( flag ),beforeDelete );
    1287        }
    1288
    1289        /**
    1290         * WriteTable オブジェクトに渡すパラメータオブジェクトをセットします。
    1291         *
    1292         * WriteTableParamTag クラスよりセットされます。
    1293         *
    1294         * @og.rev 4.0.0.0 (2005/02/28) 新規追加
    1295         *
    1296         * @param   entry HybsEntryオブジェクト
    1297         */
    1298        protected void addParam( final HybsEntry entry ) {
    1299                if( param == null ) { param = new ArrayList<>(); }
    1300                param.add( entry );
    1301        }
    1302
    1303        /**
    1304         * このオブジェクトの文字列表現を返します。
    1305         * 基本的にデバッグ目的に使用します。
    1306         *
    1307         * @return このクラスの文字列表現
    1308         * @og.rtnNotNull
    1309         */
    1310        @Override
    1311        public String toString() {
    1312                return ToString.title( this.getClass().getName() )
    1313                                .println( "VERSION"                     ,VERSION                )
    1314                                .println( "BASE_URL"            ,BASE_URL               )
    1315                                .println( "separator"           ,separator              )
    1316                                .println( "headerSequence"      ,headerSequence )
    1317                                .println( "fileURL"                     ,fileURL                )
    1318                                .println( "filename"            ,filename               )
    1319                                .println( "refFileURL"          ,refFileURL             )
    1320                                .println( "refFilename"         ,refFilename    )
    1321                                .println( "encode"                      ,encode                 )
    1322                                .println( "writerClass"         ,writerClass    )
    1323                                .println( "fileAppend"          ,fileAppend             )
    1324//                              .println( "direct"                      ,direct                 )               // 6.9.5.0 (2018/04/23) 物理的に廃止
    1325                                .println( "zip"                         ,zip                    )
    1326                                .println( "zipFilename"         ,zipFilename    )               // 6.0.4.0 (2014/11/28)
    1327//                              .println( "disposition"         ,disposition    )               // 6.9.5.0 (2018/04/23) 物理的に廃止
    1328                                .println( "tableId"                     ,tableId                )
    1329                                .println( "sheetName"           ,sheetName              )
    1330                                .println( "refSheetName"        ,refSheetName   )
    1331                                .println( "useNumber"           ,useNumber              )
    1332                                .println( "Other..."    ,getAttributes().getAttribute() )
    1333                                .fixForm().toString() ;
    1334        }
    1335}