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