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.fukurou.system.HybsConst;                                           // 6.4.5.2 (2016/05/06)
021import org.opengion.fukurou.util.StringUtil;
022import org.opengion.fukurou.util.ToString;
023import org.opengion.fukurou.util.FileUtil;                                                      // 6.4.5.2 (2016/05/06)
024import org.opengion.fukurou.model.POIUtil;
025// import org.opengion.fukurou.model.JacobUtil;                                         // 6.9.0.0 (2018/01/31) 廃止
026import org.opengion.fukurou.model.ExcelModel;
027
028import static org.opengion.fukurou.util.StringUtil.nval ;
029import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE;       // 6.1.0.0 (2014/12/26) refactoring
030
031import java.util.Map;
032import java.util.LinkedHashMap;
033import java.util.Arrays;
034import java.io.File;
035import java.util.List ;                                                                                         // 6.4.5.2 (2016/05/06)
036import java.util.ArrayList;                                                                                     // 7.2.9.0 (2020/10/12)
037
038/**
039 * ExcelFileTag は、各種パラメータを指定して、Excelファイルの操作をおこなうタグです。
040 *
041 * 主に、ExcelModel、POIUtil の各機能をJSP上で使用できるようにしました。
042 * 入力の file1 を加工して、file2 を出力するというのが、基本パターンになります。
043 * file1 と、file2 を同じ値に指定した場合は、上書き保存されます。
044 *
045 * 6.9.0.0 (2018/01/31)
046 *   JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
047 *
048 * X ※ (saveAs,toPrint)属性は、JACOB(Java COM Bridge)の使用が前提です。
049 * X    これは、JavaからのCOMオートメーションコンポーネント呼び出しを可能とする
050 * X    JAVA-COMブリッジです。COMライブラリのネイティブな呼び出しにJNIを使います。
051 * X    JACOBは、32bitおよび64bitのJVMをサポートするX86およびx64環境で動作します。
052 * X    http://sourceforge.jp/projects/sfnet_jacob-project/  (日本語プロジェクト)
053 * X    http://sourceforge.net/projects/jacob-project/       (本家)
054 *
055 * X    設定:
056 * X       jacob-1.18-M2.zip をダウンロードし、
057 * X         ①jacob-1.18-M2-x64.dll または、jacob-1.18-M2-x86.dll を、
058 * X           Windowsのシステムディレクトリにコピーします。 (例:C:\Windows\System32)
059 * X         ②jacob.jar を、クラスパスに登録します。
060 * X           ここでは、名称を、jacob-1.18-M2.jar に変更し、jre\lib\ext にコピーしています。
061 *
062 * @og.formSample
063 * ●形式:<og:excelFile action="…" fileURL="…" ・・・ />
064 *
065 * ●形式:<og:excelFile action="…" fileURL="…" ・・・ > lt;og:excelImageFileParam … /> </og:excelFile>
066 * ●body:あり
067 *
068 * ●Tag定義:
069 *   <og:excelFile
070 *       fileURL            【TAG】操作するファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
071 *       file1            ○【TAG】入力ファイル名を指定します(必須)
072 *       file2              【TAG】出力ファイル名を指定します
073 *       sheetName          【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)
074 *       sheetNos           【TAG】EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0)
075 *       sheetConstKeys     【TAG】EXCELファイルを読み込むときの固定値となるカラム名(CSV形式)
076 *       sheetConstAdrs     【TAG】EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・)
077 *       useActiveWorkbook  【TAG】EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)
078 *       addTitleSheet      【TAG】EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。
079 *       addImageFile       【TAG】画像ファイルを挿入します(画像ファイル名 シート番号 行 列)
080 *       valueType          【TAG】sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV,LIST,MAP)
081 *       readText           【TAG】ファイルを読み込んで、内容を 引数の変数にセットします。
082 *       readSheet          【TAG】ファイルを読み込んで、シート一覧を 引数の変数にセットします。
083 *       readName           【TAG】ファイルを読み込んで、名前一覧を 引数の変数にセットします。
084 *       readStyle          【TAG】ファイルを読み込んで、スタイル名を 引数の変数にセットします。
085 *       useConverter       【TAG】file1 のシート、セル、オブジェクトのテキストを変換します。
086 *       convFile           【TAG】useConverter=true 時に、変換対応表をファイルから読み取ります。
087 *       convMap            【TAG】useConverter=true 時に、変換対応表をMapから読み取ります。
088 *       scope              【TAG】キャッシュする場合のスコープ(request,session)を指定します(初期値:request)
089 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
090 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
091 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
092 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
093 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
094 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
095 *   />
096 *
097 * 【廃止】6.9.0.0 (2018/01/31) 物理削除
098 * X ※  saveAs             【廃止】file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。
099 * X ※  toPrint            【廃止】file1 を指定のプリンタに印刷します。
100 *
101 * 【追加】7.2.9.0 (2020/10/12)
102 *   BODY部に excelImageFileParam を指定可能にします。
103 *   これは、addImageFile属性のタグ版で複数登録可能です。
104 *
105 * ●使用例
106 *    ・EXCEL を読み取って、シート名の一覧の目次を、先頭シートに追加します。
107 *        <og:excelFile  file1="input.xls" file2="input.xls" addTitleSheet="Title" />
108 *
109 * @og.group その他部品
110 * @og.rev 6.2.6.0 (2015/06/19) 新規作成
111 *
112 * @version  6.2
113 * @author       Kazuhiko Hasegawa
114 * @since    JDK8.0,
115 */
116public class ExcelFileTag extends CommonTagSupport {
117        /** このプログラムのVERSION文字列を設定します。   {@value} */
118        private static final String VERSION = "7.2.9.0 (2020/10/12)" ;
119        private static final long serialVersionUID = 729020201012L ;
120
121        /** sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP) */
122        private enum TypeEnum { CSV , LIST , MAP ; }
123
124        private TypeEnum valueType                      = TypeEnum.CSV ;        // sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP)
125
126        private String  fileURL                         = HybsSystem.sys( "FILE_URL" );
127        private String  file1                           ;
128        private String  file2                           ;
129
130        private String  sheetName                       ;               // EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)
131        private String  sheetNos                        ;               // EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0)
132        private String  sheetConstKeys          ;               // EXCELファイルを読み込むときの固定値となるカラム名(CSV形式)
133        private String  sheetConstAdrs          ;               // EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・)
134        private boolean useActiveWorkbook       ;               // EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)
135        private String  addTitleSheet           ;               // EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。
136        private String  addImageFile            ;               // 画像ファイルを挿入します(画像ファイル名 シート番号 行 列)
137        private String  readText                        ;               // ファイルを読み込んで、内容を 引数の変数にセットします。
138        private String  readSheet                       ;               // ファイルを読み込んで、シート一覧を 引数の変数にセットします。
139        private String  readName                        ;               // ファイルを読み込んで、名前一覧を 引数の変数にセットします。
140        private String  readStyle                       ;               // ファイルを読み込んで、スタイル名を 引数の変数にセットします。
141
142        private boolean useConverter            ;               // file1 のシート、セル、オブジェクトのテキストを変換します。
143        private String  convFile                        ;               // useConverter=true 時に、変換対応表をファイルから読み取ります。
144        private String  convMap                         ;               // useConverter=true 時に、変換対応表をMapから読み取ります。
145
146//      private String  saveAs                          ;               // file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。            6.9.0.0 (2018/01/31) 廃止
147//      private String  toPrint                         ;               // file1 を指定のプリンタに印刷します。                6.9.0.0 (2018/01/31) 廃止
148
149        private String  scope                           = "request";    // "request","session"
150        private transient List<ImageFile> imgList ;             // 7.2.9.0 (2020/10/12)
151
152        /**
153         * デフォルトコンストラクター
154         *
155         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
156         */
157        public ExcelFileTag() { super(); }              // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
158
159        /**
160         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
161         *
162         * @og.rev 7.2.9.0 (2020/10/12) ExcelImageFileParamTag から値を取り込みます。
163         *
164         * @return      後続処理の指示
165         */
166        @Override
167        public int doStartTag() {
168                return useTag() ? EVAL_BODY_BUFFERED : SKIP_BODY;
169        }
170
171        /**
172         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
173         *
174         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
175         * @og.rev 6.3.1.0 (2015/06/28) readText の取得方法を変更する。
176         * @og.rev 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
177         * @og.rev 7.2.9.0 (2020/10/12) ExcelImageFileParamTag から値を取り込みます。
178         *
179         * @return      後続処理の指示
180         */
181        @Override
182        public int doEndTag() {
183                debugPrint();           // 4.0.0 (2005/02/28)
184                if( useTag() ) {
185                        super.setScope( scope );                // デフォルトscope が "request" なので、再設定している。
186
187                        final String directory = HybsSystem.url2dir( fileURL );
188                        final File inFile = new File( StringUtil.urlAppend( directory,file1 ) );
189
190                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
191//                      if( toPrint == null ) {
192//                              if( saveAs == null ) {
193                                        final ExcelModel excel = new ExcelModel( inFile );
194                                        if( addTitleSheet != null ) { excel.setAddTitleSheet( addTitleSheet );  }
195//                                      if( addImageFile  != null ) { putImageFile( excel );                                    }
196                                        putImageFile( excel );                                                                  // 7.2.9.0 (2020/10/12)
197
198                                        // 6.3.1.0 (2015/06/28) readText の取得方法を変更する。
199                //                      if( readText    != null ) { setObject(      readText    , POIUtil.extractor( inFile )   ); }
200                                        if( readText    != null ) { setObject(      readText    , getExcelText( excel )                 ); }
201                                        if( readSheet   != null ) { setAttriObject( readSheet   , excel.getSheetNames()                 ); }
202                                        if( readName    != null ) { setAttriObject( readName    , excel.getNames()                              ); }
203                                        if( readStyle   != null ) { setAttriObject( readStyle   , excel.getStyleNames()                 ); }
204
205                                        if( sheetConstKeys != null && sheetConstAdrs != null ) { sheetConstSet( excel ); }
206
207                                        if( useConverter                ) { textConverter( excel );                     }
208                                        if( useActiveWorkbook   ) { excel.activeWorkbook( true );       }       // 引数のtrueは、「空セルを削除する」の指定
209
210                                        if( file2 != null ) {
211                                                final File outFile = new File( StringUtil.urlAppend( directory,file2 ) );
212                                                excel.saveFile( outFile );
213                                        }
214//                              }
215//                              else {
216//                                      if( file2 != null ) {
217//                                              final String errMsg = "file2とsaveAsは、同時に指定する事はできません。" + CR
218//                                                                              + "  file2=[" + file2 + "] , saveAs=[" + saveAs + "]";
219//                                              throw new HybsSystemException( errMsg );
220//                                      }
221//
222//                                      final File outFile = new File( StringUtil.urlAppend( directory,saveAs ) );
223//                                      JacobUtil.saveAs( inFile,outFile );
224//                              }
225//                      }
226//                      else {
227//                              JacobUtil.toPrint( inFile,toPrint );
228//                      }
229                }
230                return EVAL_PAGE ;
231        }
232
233        /**
234         * タグリブオブジェクトをリリースします。
235         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
236         *
237         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
238         * @og.rev 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
239         *
240         */
241        @Override
242        protected void release2() {
243                super.release2();
244                valueType                       = TypeEnum.CSV; // sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP)
245                fileURL                         = HybsSystem.sys( "FILE_URL" );
246                file1                           = null;
247                file2                           = null;
248                sheetName                       = null;                 // EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)
249                sheetNos                        = null;                 // EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0)
250                sheetConstKeys          = null;                 // EXCELファイルを読み込むときの固定値となるカラム名(CSV形式)
251                sheetConstAdrs          = null;                 // EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・)
252                useActiveWorkbook       = false;                // EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)
253                addTitleSheet           = null;                 // EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。
254                addImageFile            = null;                 // 画像ファイルを挿入します(画像ファイル名 シート番号 行 列)
255                readText                        = null;                 // ファイルを読み込んで、内容を 引数の変数にセットします。
256                readSheet                       = null;                 // ファイルを読み込んで、シート一覧を 引数の変数にセットします。
257                readName                        = null;                 // ファイルを読み込んで、名前一覧を 引数の変数にセットします。
258                readStyle                       = null;                 // ファイルを読み込んで、スタイル名を 引数の変数にセットします。
259                useConverter            = false;                // file1 のシート、セル、オブジェクトのテキストを変換します。
260                convFile                        = null;                 // useConverter=true 時に、変換対応表をファイルから読み取ります。
261                convMap                         = null;                 // useConverter=true 時に、変換対応表をMapから読み取ります。
262//              saveAs                          = null;                 // file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。
263//              toPrint                         = null;                 // file1 を指定のプリンタに印刷します。
264                scope                           = "request";    // "request","session"
265                imgList                         = null;                 // 7.2.9.0 (2020/10/12) ExcelImageFileParamTag からのパラメータを管理します。
266        }
267
268        /**
269         * addImageFile属性の実際の処理を行います。
270         *
271         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
272         * @og.rev 7.2.9.0 (2020/10/12) ExcelImageFileParamTag から値を取り込みます。
273         *
274         * @param       excel ExcelModelオブジェクト
275         */
276        private void putImageFile( final ExcelModel excel ) {
277                if( addImageFile  != null ) {
278                        final String[] org = addImageFile.split( " " );         // 連続するスペースは個別に "" に分割される。
279
280                        final String[] vals = Arrays.copyOf( org , 10 );        // 10個の配列を用意します。
281
282                        final String imgFile = nval( vals[0] , null );                                  // 挿入するイメージファイル名
283                        final int    shtNo       = nval( vals[1] , 0 );                                         // シート番号
284                        final int    row1        = nval( vals[2] , 0 );                                         // 挿入する行(開始)
285                        final int    col1        = nval( vals[3] , 0 );                                         // 挿入する列(開始)
286                        final int    row2        = nval( vals[4] , row1 );                                      // 挿入する行(終了-含まず)
287                        final int    col2        = nval( vals[5] , col1 );                                      // 挿入する列(終了-含まず)
288                        final int    dx1         = nval( vals[6] , 0 );                                         // 開始セルのX軸座標のオフセット(ピクセル)
289                        final int    dy1         = nval( vals[7] , 0 );                                         // 開始セルのY軸座標のオフセット(ピクセル)
290                        final int    dx2         = nval( vals[8] , 0 );                                         // 終了セルのX軸座標のオフセット(ピクセル)
291                        final int    dy2         = nval( vals[9] , 0 );                                         // 終了セルのY軸座標のオフセット(ピクセル)
292
293                        excel.addImageFile( imgFile,shtNo,row1,col1,row2,col2,dx1,dy1,dx2,dy2 );
294                }
295
296                if( imgList != null ) {
297                        for( final ImageFile imgFile : imgList ) {
298                                imgFile.setExcelModel( excel );
299                        }
300                }
301        }
302
303        /**
304         * テキスト情報を取得します。
305         *
306         * EXCELファイルのテキスト情報として、シート名、セル値、オブジェクト文字列を取得します。
307         * POIUtil.extractor( File ) でもテキストを取得できますが、細かい点で、調整できません。
308         *
309         * @og.rev 6.3.1.0 (2015/06/28) 新規作成
310         * @og.rev 6.3.9.0 (2015/11/06) Java 8 ラムダ式に変更
311         *
312         * @param       excel ExcelModelオブジェクト
313         * @return      テキスト情報
314         */
315        private String getExcelText( final ExcelModel excel ) {
316                final StringBuilder buf = new StringBuilder( BUFFER_LARGE );
317
318                // 6.3.9.0 (2015/11/06) Java 8 ラムダ式に変更
319                excel.textConverter(
320                        (val,cmnt) -> {
321                                if( val != null ) { buf.append( val ).append( CR ); }
322                                return null;
323                        }
324                );
325
326                return buf.toString();
327        }
328
329        /**
330         * sheetConstKeys,sheetConstAdrs属性の実際の処理を行います。
331         *
332         * EXCELファイルを読み込むときの固定値となるカラム名(CSV形式)と
333         * アドレス(行-列,行-列,・・・) から、値を取得します。
334         * 取得した結果は、valueType 属性で指定した方法でセーブします。
335         * アドレスは、1シートに1箇所ですが、シートが複数存在する場合は、
336         * 複数の値が求められます。その値の設定方法は、valueType属性で指定します。
337         *
338         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
339         *
340         * @param       excel ExcelModelオブジェクト
341         */
342        private void sheetConstSet( final ExcelModel excel ) {
343                final Map<String,String> kvMap = getCSVParameter( sheetConstKeys , sheetConstAdrs );
344
345                final int size = kvMap.size();
346                final String[] keys = new String[size];
347                final int[] rows = new int[size];
348                final int[] cols = new int[size];
349
350                // 行-列 文字列を、分解します。
351                int no = 0;
352                for( final Map.Entry<String,String> entry : kvMap.entrySet() ) {
353                        keys[no] = entry.getKey();
354                        final String val = entry.getValue();
355                        final int[] rci = POIUtil.kigo2rowCol( val );           // A1,B5 などの形式
356                        rows[no] = rci[0];
357                        cols[no] = rci[1];
358
359                        no++ ;
360                }
361                // size と、no は、同じ値のはず。
362
363                // EXCELからデータを抜き出します。
364                final int shtSize = excel.getNumberOfSheets();
365                final String[][] kvAry = new String[size][shtSize];
366                for( int shtNo=0; shtNo<shtSize; shtNo++ ) {
367                        final String shtNm = excel.getSheetName( shtNo );                       // シート名の取得と同時に、内部状態の Sheetオブジェクトを設定する。
368                        for( int i=0; i<size; i++ ) {
369                                if( rows[i] < 0 ) {
370                                        kvAry[i][shtNo] = shtNm;                                        // rowNo が -1 の場合は、シート名を設定
371                                }
372                                else {
373                                        kvAry[i][shtNo] = excel.getValue( rows[i],cols[i] );    // 配列の配置がループと会わないが、後でセットするため。
374                                }
375                        }
376                }
377
378                // キーと、各シートから集めた値を設定します。
379                for( int i=0; i<size; i++ ) {
380                        setAttriObject( keys[i] , kvAry[i] ) ;
381                }
382        }
383
384        /**
385         * シート、セル、オブジェクトのテキストを変換します。
386         *
387         * convFile : 変換対応表をファイルから読み取ります。
388         * convMap  : 変換対応表をMapから読み取ります。
389         *
390         * このメソッドは、useConverter=true の時のみ、呼ばれます。
391         * また、convFileとconvMapの両方とも、定義されていない場合は、
392         * 何もしません。
393         * 両方とも定義されていた場合は、if文の関係で、convFileが優先されます。
394         *
395         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
396         * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。
397         * @og.rev 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更
398         * @og.rev 6.4.5.2 (2016/05/06) fukurou.util.FileString から、fukurou.util.FileUtil に移動。
399         *
400         * @param       excel ExcelModelオブジェクト
401         */
402        @SuppressWarnings(value={"unchecked"})
403        private void textConverter( final ExcelModel excel ) {
404                Map<String,String> changeMap = null;
405
406                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
407                if( convFile == null ) {
408                        if( convMap != null ) {
409                                changeMap = (Map<String,String>)getObject( convMap );   // 警告: [unchecked] 無検査キャスト
410                        }
411                }
412                else {
413                        final String inFile = HybsSystem.url2dir( fileURL , convFile );                 // 6.4.2.1 (2016/02/05)
414
415                        // 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更
416                        final List<String> list = FileUtil.getLineList( inFile , HybsConst.UTF_8 );     // 6.4.5.2 (2016/05/06)
417
418                        changeMap = new LinkedHashMap<>();
419                        for( final String line : list ) {
420                                final int indx = line.indexOf( '\t' );
421                                if( indx <= 0 ) { continue ; }                                  // TAB が先頭や、存在しない行は読み飛ばす。
422                                final String key = line.substring( 0,indx );
423                                final String cng = line.substring( indx+1 );
424                                changeMap.put( key,cng );
425                        }
426                }
427
428                // convFile も、convMap も定義されていない場合、changeMap は、null のまま。
429                if( changeMap != null ) {
430                        excel.textConverter( changeMap );
431                }
432        }
433
434        /**
435         * 【TAG】操作するファイルのディレクトリを指定します
436         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
437         *
438         * @og.tag
439         * この属性で指定されるディレクトリのファイルを操作します。
440         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
441         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
442         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
443         *
444         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
445         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
446         *
447         * @param       url ファイルURL
448         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
449         */
450        public void setFileURL( final String url ) {
451                final String furl = nval( getRequestParameter( url ),null );
452                if( furl != null ) {
453                        fileURL = StringUtil.urlAppend( fileURL,furl );
454                }
455        }
456
457        /**
458         * 【TAG】基準となるファイル名を指定します(コマンドの左辺のファイル名です)。
459         *
460         * @og.tag
461         * コマンドの左辺のファイル名です。
462         *
463         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
464         *
465         * @param       fname ファイル名1
466         */
467        public void setFile1( final String fname ) {
468                file1 = nval( getRequestParameter( fname ),file1 );
469        }
470
471        /**
472         * 【TAG】内部 Workbook オブジェクトをファイルに書き出します。
473         *
474         * @og.tag
475         * この属性を指定しない場合は、ファイルに出力されません。
476         * また、file1 と同じファイルを指定することは可能です。その場合は、
477         * 元のファイルが上書き保存されます。
478         * Excelの形式は、ここで指定する出力ファイルの拡張子ではなく、file1で
479         * 指定したファイルの拡張子で決まります。
480         * 異なる形式の拡張子を持つファイルを指定した場合、強制的に、オープンした
481         * Workbook の形式の拡張子を追加します。
482         *
483         * 拡張子は、Excel 2007以降の形式(.xlsx)か、Excel 2003以前の形式(.xls) が指定できます。
484         * 拡張子が未設定の場合は、オープンした Workbook の形式に合わせた拡張子を付与します。
485         *
486         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
487         *
488         * @param       fname ファイル名2
489         */
490        public void setFile2( final String fname ) {
491                file2 = nval( getRequestParameter( fname ),file2 );
492        }
493
494        /**
495         * 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)。
496         *
497         * @og.tag
498         * EXCELファイルを読み込む時に、シート名を指定します。
499         * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。
500         * エラーにはならないのでご注意ください。
501         * 初期値は、指定なしです。
502         *
503         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
504         *
505         * @param   sheet EXCELファイルのシート名
506         * @see         #setSheetNos( String )
507         */
508        public void setSheetName( final String sheet ) {
509                sheetName = nval( getRequestParameter( sheet ),sheetName );
510        }
511
512        /**
513         * 【TAG】EXCELファイルを読み込むときのシート番号を指定します(初期値:0)。
514         *
515         * @og.tag
516         * EXCEL読み込み時に複数シートをマージして取り込みます。
517         * シート番号は、0 から始まる数字で表します。
518         *
519         * シート番号の指定は、CSV形式で、複数指定できます。また、N-M の様にハイフンで繋げることで、
520         * N 番から、M 番のシート範囲を一括指定可能です。また、"*" による、全シート指定が可能です。
521         * これらの組み合わせも可能です。( 0,1,3,5-8,10-* )
522         * ただし、"*" に関しては例外的に、一文字だけで、すべてのシートを表すか、N-* を最後に指定するかの
523         * どちらかです。途中には、"*" は、現れません。
524         * シート番号は、重複(1,1,2,2)、逆転(3,2,1) での指定が可能です。これは、その指定順で、読み込まれます。
525         * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。
526         * エラーにはならないのでご注意ください。
527         *
528         * 初期値は、0(第一シート) です。
529         *
530         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
531         *
532         * @param   sheet EXCELファイルのシート番号(0から始まる)
533         * @see         #setSheetName( String )
534         */
535        public void setSheetNos( final String sheet ) {
536                sheetNos = nval( getRequestParameter( sheet ),sheetNos );
537                if( sheetNos != null && sheetNos.length() > 0 ) {
538                        boolean errFlag = false;
539                        for( int i=0; i<sheetNos.length(); i++ ) {
540                                final char ch = sheetNos.charAt(i);
541                                if( ch == '-' || ch == ',' ) { continue; }
542                                if( ch == '*' && ( i==0 || i==sheetNos.length()-1 ) ) { continue; }
543                                if( ch < '0' || ch > '9' ) { errFlag = true; break; }
544                        }
545                        if( errFlag ) {
546                                final String errMsg = "sheetNos の指定を見直してください。sheetNos=[" + sheetNos + "]";
547                                throw new HybsSystemException( errMsg );
548                        }
549                }
550        }
551
552        /**
553         * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのキーをCSV形式で指定します。
554         *
555         * @og.tag
556         * カラム名は、CSV形式で指定します。
557         * これにより、シートの一か所に書かれている情報を、固定値として取得することができます。
558         * sheetConstAdrs 属性で指定したセル位置から取得した値を、sheetConstKeys で指定したキーに
559         * 設定します。
560         * 値の設定方法は、valueType 属性で指定します。
561         *
562         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
563         *
564         * @param   constKeys 固定値となるキー(CSV形式)
565         * @see         #setSheetConstAdrs( String )
566         */
567        public void setSheetConstKeys( final String constKeys ) {
568                sheetConstKeys = constKeys;
569        }
570
571        /**
572         * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのキーに対応するアドレスをCSV形式で指定します。
573         *
574         * @og.tag
575         * アドレスは、EXCEL上の行-列形式か、EXCEL表記に準拠した、A1,A2,B1形式が使用できます。
576         * また、特殊な文字として、"SHEET" という記号が使用できます。
577         *   ①行-列形式
578         *     行列は、EXCELオブジェクトに準拠するため、0から始まる整数です。
579         *     0-0 ⇒ A1 , 1-0 ⇒ A2 , 0-1 ⇒ B1 になります。
580         *   ②EXCEL表記
581         *     EXCEL表記に準拠した、A1,A2,B1 の記述も処理できるように対応します。
582         *     なお、A1,A2,B1 の記述は、必ず、英字1文字+数字 にしてください。(A~Zまで)
583         *   ③EXCELシート名をキーに割り当てるために、"SHEET" という記号に対応します。
584         *     readSheet 属性で、同等のことが出来まが、統一的に処理できるようにします。
585         *
586         * 例えば、sheetConstKeys="CLM,LANG,NAME" とし、sheetConstAdrs="0-0,A2,SHEET" とすると、
587         * NAMEカラムには、シート名を読み込むことができます。
588         * これは、内部処理の簡素化のためです。
589         *
590         * ちなみに、EXCELのセルに、シート名を表示させる場合の関数は、下記の様になります。
591         * =RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1)))
592         *
593         * これにより、シートの一か所に書かれている情報を、固定値として取得することができます。
594         * sheetConstAdrs 属性で指定したセル位置から取得した値を、sheetConstKeys で指定したキーに
595         * 設定します。
596         * 値の設定方法は、valueType 属性で指定します。
597         *
598         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
599         *
600         * @param   constAdrs 固定値となるアドレス (行-列,行-列,・・・)
601         * @see         #setSheetConstKeys( String )
602         */
603        public void setSheetConstAdrs( final String constAdrs ) {
604                sheetConstAdrs = constAdrs;
605        }
606
607        /**
608         * 【TAG】EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)。
609         *
610         * @og.tag
611         * セルの有効範囲というのは、EXCELでの 空行、空列の存在しない範囲を指します(初期値:false)。
612         * 通常、空行でも、データとして残っている場合は、EXCELのセルオブジェクトは存在します。
613         * ここで、useActiveWorkbook="true" とすると、空行、空列を削除します。
614         * 初期値は、false:しない です。
615         *
616         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
617         *
618         * @param       useActWB 有効範囲の設定 [true:する/false:しない]
619         */
620        public void setUseActiveWorkbook( final String useActWB ) {
621                useActiveWorkbook = nval( getRequestParameter( useActWB ),useActiveWorkbook );
622        }
623
624        /**
625         * 【TAG】EXCEL出力時に、Sheet一覧を作成する場合のSheet名を指定します。
626         *
627         * @og.tag
628         * これは、Workbook に含まれる Sheet 一覧を作成する場合に、ここに指定した
629         * シート名で、目次を作成します。
630         *
631         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
632         *
633         * @param       sheetName タイトルシート名
634         */
635        public void setAddTitleSheet( final String sheetName ) {
636                addTitleSheet = nval( getRequestParameter( sheetName ),addTitleSheet );
637        }
638
639        /**
640         * 【TAG】指定のシートの行・列の箇所に、イメージファイルを挿入します。
641         *
642         * @og.tag
643         * 7.2.9.0 (2020/10/12) 以降は、ExcelImageFileParamTag を推奨いたします。
644         *
645         * ここでは、セル範囲ではなく、指定の行列の箇所に、アンカーを設定して、画像ファイルを
646         * 挿入します。一応、リサイズして、元の大きさ近くに戻しますが、縦横比が変わってしまいます。
647         * 正確に挿入する場合は、セル範囲の指定と、マージンを指定しなければなりませんが、
648         * 微調整が必要です。
649         * 引数は、スペース区切りで、下記の順番で指定します。
650         *
651         *    imgFile   挿入するイメージファイル名
652         *    shtNo     シート番号
653         *    row1      挿入する行(開始)
654         *    col1      挿入する列(開始)
655         *   [row2]     挿入する行(終了-含まず)                  (未指定時は、row1)
656         *   [col2]     挿入する列(終了-含まず)                  (未指定時は、col1)
657         *   [dx1 ]     開始セルのX軸座標のオフセット(ピクセル)  (未指定時は、0)
658         *   [dy1 ]     開始セルのY軸座標のオフセット(ピクセル)  (未指定時は、0)
659         *   [dx2 ]     終了セルのX軸座標のオフセット(ピクセル)  (未指定時は、0)
660         *   [dy2 ]     終了セルのY軸座標のオフセット(ピクセル)  (未指定時は、0)
661         *
662         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
663         *
664         * @param       imgFile (画像ファイル名 シート番号 開始行 開始列 [終了行 終了列 開始セルのX軸マージン 開始セルのY軸マージン 終了セルのX軸マージン 終了セルのY軸マージン])
665         */
666        public void setAddImageFile( final String imgFile ) {
667                addImageFile = nval( getRequestParameter( imgFile ),addImageFile );
668        }
669
670        /**
671         * addImageFile属性の実際の処理を行います。
672         *
673         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
674         *
675         * @param       imgFile         挿入するイメージファイル名
676         * @param       sheetName       シート名
677         * @param       sheetNo         シート番号
678         * @param       rowNo           挿入する行(開始)
679         * @param       colNo           挿入する列(開始)
680         * @param       rowEndNo        挿入する行(終了-含まず)
681         * @param       colEndNo        挿入する列(終了-含まず)
682         * @param       dx1                     開始セルのX軸座標のオフセット(ピクセル)
683         * @param       dy1                     開始セルのY軸座標のオフセット(ピクセル)
684         * @param       dx2                     終了セルのX軸座標のオフセット(ピクセル)
685         * @param       dy2                     終了セルのY軸座標のオフセット(ピクセル)
686         */
687        protected void addImgFile( final String imgFile , final String sheetName, final int sheetNo ,
688                                                                 final int rowNo                , final int colNo               , final int rowEndNo    , final int colEndNo ,
689                                                                 final int dx1                  , final int dy1                 , final int dx2                 , final int dy2 ) {
690
691                final ImageFile img = new ImageFile( imgFile,sheetName,sheetNo,rowNo,colNo,rowEndNo,colEndNo,dx1,dy1,dx2,dy2 );
692                if( imgList == null ) {
693                        imgList = new ArrayList<ImageFile>();
694                }
695
696                imgList.add( img );
697        }
698
699        /**
700         * 【TAG】sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP)。
701         *
702         * @og.tag
703         * キーに対して、値は複数存在する場合があります。
704         * その値を、設定する場合の、3つの方法を指定できます。
705         *
706         *   CSV : キーに対して、値をCSV形式でセットします。valueタグや、{&#064;XXX} で、取り出せます。
707         *         キーが複数ある場合は、個別に指定する必要があります。
708         *   LIST: キーに対して、値をListオブジェクトにセーブします。
709         *         キーが複数ある場合は、個別に指定する必要があります。
710         *   MAP : キー自体を、Mapオブジェクトに設定します。値は、CSV形式の文字列です。
711         *
712         * 初期値は、CSV です。
713         *
714         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
715         *
716         * @param       type 保管方法(CSV/LIST/MAP)
717         */
718        public void setValueType( final String type ) {
719                final String tp = nval( getRequestParameter( type ),null );
720                if( tp != null ) {
721                        valueType = TypeEnum.valueOf( tp );
722                }
723        }
724
725        /**
726         * 【TAG】ファイルを読み込んで、内容を引数の変数にセットします。
727         *
728         * @og.tag
729         * EXCELのセルと、テキストボックスオブジェクトの値を取得します。
730         * 引数に、キーとなるパラメータを指定します。
731         * テキストは、一つのキーに設定されます。
732         * valueType 属性の指定とは無関係にパラメータに登録されます。
733         *
734         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
735         *
736         * @param       read 書き込む変数名
737         */
738        public void setReadText( final String read ) {
739                readText = nval( getRequestParameter( read ),readText );
740        }
741
742        /**
743         * 【TAG】ファイルを読み込んで、シート一覧を引数の変数にセットします。
744         *
745         * @og.tag
746         * EXCELのシート一覧を取得します。
747         * 引数に、キーとなるパラメータを指定します。
748         * 値の設定方法は、valueType 属性で指定します。
749         *
750         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
751         *
752         * @param       read 書き込む変数名
753         */
754        public void setReadSheet( final String read ) {
755                readSheet = nval( getRequestParameter( read ),readSheet );
756        }
757
758        /**
759         * 【TAG】ファイルを読み込んで、名前一覧を 引数の変数にセットします。
760         *
761         * @og.tag
762         * EXCELの名前一覧を取得します。
763         * 名前一覧に、不正な値や、他のファイルのリンク等が設定されていると、
764         * EXCELを開くのに時間がかかる場合があります。EXCEL帳票などでは、問題になります。
765         * そこで、この名前が不正かどうか判別するのに、名前一覧を使用します。
766         * 引数に、キーとなるパラメータを指定します。
767         * 値の設定方法は、valueType 属性で指定します。
768         *
769         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
770         *
771         * @param       read 書き込む変数名
772         */
773        public void setReadName( final String read ) {
774                readName = nval( getRequestParameter( read ),readName );
775        }
776
777        /**
778         * 【TAG】ファイルを読み込んで、スタイル名を 引数の変数にセットします。
779         *
780         * @og.tag
781         * EXCELのスタイル名を取得します。
782         * スタイル名に、不正な値が設定されていると、EXCELを開くのに
783         * 時間がかかる場合があります。EXCEL帳票などでは、問題になります。
784         * そこで、このスタイル名が不正かどうか判別するのに、使用します。
785         * 引数に、キーとなるパラメータを指定します。
786         * 値の設定方法は、valueType 属性で指定します。
787         *
788         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
789         *
790         * @param       read 書き込む変数名
791         */
792        public void setReadStyle( final String read ) {
793                readStyle = nval( getRequestParameter( read ),readStyle );
794        }
795
796        /**
797         * 【TAG】シート名、セル、オブジェクトのテキストを変換するかどうか指定します(初期値:false)。
798         *
799         * @og.tag
800         * この属性では、テキスト変換を行うかどうかを指定します。例え、convFile属性や
801         * convMap属性が指定されていても、この属性を true にしないと、変換は行われません。
802         * また、convFile属性と、convMap属性がどちらも指定されていない場合も、実行されません。
803         * 初期値は、false:行わない です。
804         *
805         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
806         *
807         * @param       useConv コンバータ処理を行うかどうか [true:行う/false:行わない]
808         */
809        public void setUseConverter( final String useConv ) {
810                useConverter = nval( getRequestParameter( useConv ),useConverter );
811        }
812
813        /**
814         * 【TAG】useConverter=true 時に、変換対応表をファイルから読み取ります。
815         *
816         * @og.tag
817         * この属性は、useConverter=true を指定しないと、無視されます。
818         * テキスト変換を行う変換対応表を、ファイルで指定します。
819         * このテキストファイルは、変換元と変換先の文字列をタブ区切りで定義された、UTF-8ファイルです。
820         *
821         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
822         *
823         * @param       cfile コンバータ処理の変換対応表ファイル
824         */
825        public void setConvFile( final String cfile ) {
826                convFile = nval( getRequestParameter( cfile ),convFile );
827        }
828
829        /**
830         * 【TAG】useConverter=true 時に、変換対応表をMapから読み取ります。
831         *
832         * @og.tag
833         * この属性は、useConverter=true を指定しないと、無視されます。
834         * テキスト変換を行う変換対応表を、Mapオブジェクトで指定します。
835         * メモリ上のMapオブジェクトの取得キーを、指定します。
836         * スコープは、scope 属性を使います。
837         *
838         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
839         *
840         * @param       cmap コンバータ処理の変換対応表Mapの取得キー
841         */
842        public void setConvMap( final String cmap ) {
843                convMap = nval( getRequestParameter( cmap ),convMap );
844        }
845
846//      /**
847//       * 【TAG】file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。
848//       *
849//       * @og.tag
850//       * この属性は、JACOB(Java COM Bridge)の使用が前提です。
851//       * file2と同時に指定する事はできません。
852//       * file2 属性と異なり、拡張子が異なるケースで、使用します。
853//       * また、xslx拡張子の場合でも、EXCELのバージョンや、設定によっては、POIでは
854//       * 読み取ることが出来ない場合があり、JACOBで変換することで、読み取ることが
855//       * できる形式に変換できます。
856//       * また、拡張子に、pdf を指定すると、PDFファイルに変換できます。
857//       * ※ この属性は単独でしか使用できません。(fileURL,file1 以外)
858//       *
859//       * @og.rev 6.2.6.0 (2015/06/19) 新規作成
860//       * @og.rev 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
861//       *
862//       * @param       name セーブするファイル名
863//       */
864//      public void setSaveAs( final String name ) {
865//              saveAs = nval( getRequestParameter( name ),saveAs );
866//      }
867
868//      /**
869//       * 【TAG】file1 を指定のプリンタに印刷します。
870//       *
871//       * @og.tag
872//       * この属性は、JACOB(Java COM Bridge)の使用が前提です。
873//       * サーバーから使用できるプリンタ名を指定してEXCELを印刷します。
874//       * ※ この属性は単独でしか使用できません。(fileURL,file1 以外)
875//       *
876//       * @og.rev 6.2.6.0 (2015/06/19) 新規作成
877//       * @og.rev 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
878//       *
879//       * @param       printer プリンタ名
880//       */
881//      public void setToPrint( final String printer ) {
882//              toPrint = nval( getRequestParameter( printer ),toPrint );
883//      }
884
885        /**
886         * 【TAG】キャッシュする場合のスコープ(request,session)を指定します(初期値:request)。
887         *
888         * @og.tag
889         * "request","session" が指定できます。
890         * 初期値は、 "request" です。
891         *
892         * @param       scp     スコープ
893         */
894        @Override
895        public void setScope( final String scp ) {
896                scope = nval( getRequestParameter( scp ),scope );
897        }
898
899        /**
900         * 指定のキーに、パラメータを登録します。
901         *
902         * キーに対して、値は複数存在する場合があります。
903         * その値を、設定する方法は、valueType属性 で指定します。
904         * 登録する場合の スコープも、scope属性 で指定します。
905         *
906         * @og.rev 6.2.6.0 (2015/06/19) 新規作成
907         * @og.rev 6.3.9.0 (2015/11/06) switch 文の2つの case のために同じコードを使用している(findbugs)
908         *
909         * @param       key  登録するキー
910         * @param       data 登録するデータ配列
911         */
912        private void setAttriObject( final String key,final String[] data ) {
913                // 6.3.9.0 (2015/11/06) switch 文の2つの case のために同じコードを使用している(findbugs)
914                if( valueType == TypeEnum.LIST ) {
915                        setObject( key , Arrays.asList ( data ) );
916                }
917                else {
918                        setObject( key , StringUtil.array2csv( data ) );
919                }
920        }
921
922        /**
923         * ImageFile を、ExcelImageFileParamTag から受け取るための内部クラス
924         *
925         * @og.rev 7.2.9.0 (2020/10/12) 新規追加
926         *
927         * @version  7.2
928         * @author   Kazuhiko Hasegawa
929         * @since    JDK11.0,
930         */
931        private static final class ImageFile {
932                private final String    imgFile         ;               // 挿入するイメージファイル名
933                private final String    sheetName               ;               // 挿入するシート名(null=先頭シート)
934                private final int               sheetNo                 ;               // 挿入するシート番号(初期値:-1)
935                private final int               rowNo                   ;               // 挿入する行(開始)(初期値:0)
936                private final int               colNo                   ;               // 挿入する列(開始)(初期値:0)
937                private final int               rowEndNo                ;               // 挿入する行(終了-含まず)(初期値:0)
938                private final int               colEndNo                ;               // 挿入する列(終了-含まず)(初期値:0)
939                private final int               dx1                             ;               // 開始セルのX軸座標(マージン)(初期値:0)
940                private final int               dy1                             ;               // 開始セルのY軸座標(マージン)(初期値:0)
941                private final int               dx2                             ;               // 終了セルのX軸座標(マージン)(初期値:0)
942                private final int               dy2                             ;               // 終了セルのY軸座標(マージン)(初期値:0)
943
944                /**
945                 * 引数指定のコンストラクター
946                 *
947                 * @og.rev 7.2.9.0 (2020/10/12) 新規追加
948                 *
949                 * @param       imgFile         挿入するイメージファイル名
950                 * @param       sheetName       挿入するシート名(null=先頭シート)
951                 * @param       sheetNo         挿入するシート番号(初期値:0)
952                 * @param       rowNo           挿入する行(開始)(初期値:0)
953                 * @param       colNo           挿入する列(開始)(初期値:0)
954                 * @param       rowEndNo        挿入する行(終了-含まず)(初期値:0)
955                 * @param       colEndNo        挿入する列(終了-含まず)(初期値:0)
956                 * @param       dx1             開始セルのX軸座標のオフセット(ピクセル)
957                 * @param       dy1             開始セルのY軸座標のオフセット(ピクセル)
958                 * @param       dx2             終了セルのX軸座標のオフセット(ピクセル)
959                 * @param       dy2             終了セルのY軸座標のオフセット(ピクセル)
960                 */
961                public ImageFile( final String imgFile  , final String sheetName, final int sheetNo ,
962                                                                 final int rowNo        , final int colNo               , final int rowEndNo    , final int colEndNo ,
963                                                                 final int dx1          , final int dy1                 , final int dx2                 , final int dy2 ) {
964                        this.imgFile            = imgFile       ;
965                        this.sheetName          = sheetName     ;
966                        this.sheetNo            = sheetNo       ;                                                                                       // -1 の場合は、sheetName と優先判定する。
967                        this.rowNo                      = rowNo         ;
968                        this.colNo                      = colNo    < 0 ? 0 : colNo ;                                                    // -1 の場合(未設定)は、0(先頭カラム) に変換
969                        this.rowEndNo           = rowEndNo < this.rowNo ? this.rowNo: rowEndNo ;                // rowEndNo は、rowNo と同じかそれ以上でないといけない。
970                        this.colEndNo           = colEndNo < this.colNo ? this.colNo: colEndNo ;                // colEndNo は、colNo と同じかそれ以上でないといけない。
971                        this.dx1                        = dx1           ;
972                        this.dy1                        = dy1           ;
973                        this.dx2                        = dx2           ;
974                        this.dy2                        = dy2           ;
975                }
976
977                /**
978                 * addImageFile属性の実際の処理を行います。
979                 *
980                 * @og.rev 7.2.9.0 (2020/10/12) ExcelModel にイメージファイルを設定します。
981                 *
982                 * @param       excel ExcelModelオブジェクト
983                 */
984                public void setExcelModel( final ExcelModel excel ) {
985                        int shtNo = sheetNo ;
986                        if( shtNo < 0 && sheetName != null ) {                  // sheetNo が未設定で、sheetName が書かれている場合のみ
987                                shtNo = excel.getSheetNo( sheetName );          // マッチしなければ、-1
988                        }
989                        if( shtNo < 0 ) { shtNo = 0; }                                  // どちらも未設定の場合は、先頭のシート
990
991                        excel.addImageFile( imgFile,shtNo,rowNo,colNo,rowEndNo,colEndNo,dx1,dy1,dx2,dy2 );
992                }
993        }
994
995        /**
996         * このオブジェクトの文字列表現を返します。
997         * 基本的にデバッグ目的に使用します。
998         *
999         * @return このクラスの文字列表現
1000         * @og.rtnNotNull
1001         */
1002        @Override
1003        public String toString() {
1004                return ToString.title( this.getClass().getName() )
1005                                .println( "VERSION"                             ,VERSION                        )
1006                                .println( "fileURL"                             ,fileURL                        )
1007                                .println( "file1"                               ,file1                          )
1008                                .println( "file2"                               ,file2                          )
1009                                .println( "sheetName"                   ,sheetName                      )
1010                                .println( "sheetNos"                    ,sheetNos                       )
1011                                .println( "sheetConstKeys"              ,sheetConstKeys         )
1012                                .println( "sheetConstAdrs"              ,sheetConstAdrs         )
1013                                .println( "useActiveWorkbook"   ,useActiveWorkbook      )
1014                                .println( "addTitleSheet"               ,addTitleSheet          )
1015                                .println( "addImageFile"                ,addImageFile           )
1016                                .println( "valueType"                   ,valueType                      )
1017                                .println( "readText"                    ,readText                       )
1018                                .println( "readSheet"                   ,readSheet                      )
1019                                .println( "readName"                    ,readName                       )
1020                                .println( "readStyle"                   ,readStyle                      )
1021                                .println( "useConverter"                ,useConverter           )
1022                                .println( "convFile"                    ,convFile                       )
1023                                .println( "convMap"                             ,convMap                        )
1024//                              .println( "saveAs"                              ,saveAs                         )       // 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
1025//                              .println( "toPrint"                             ,toPrint                        )       // 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。
1026                                .println( "Other..."    ,getAttributes().getAttribute() )
1027                                .fixForm().toString() ;
1028        }
1029}