    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 * ●形式：&lt;og:excelFile action="…" fileURL="…" ･･･ /&gt;
    064 *
    065 * ●形式：&lt;og:excelFile action="…" fileURL="…" ･･･ &gt; lt;og:excelImageFileParam … /&gt; &lt;/og:excelFile&gt;
    066 * ●body：あり
    067 *
    068 * ●Tag定義：
    069 *   &lt;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 *   /&gt;
    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 *        &lt;og:excelFile  file1="input.xls" file2="input.xls" addTitleSheet="Title" /&gt;
    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 );        // １０個の配列を用意します。
    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         * アドレスは、１シートに１箇所ですが、シートが複数存在する場合は、
    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) または、２文字目が、
    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 ファイル名１
    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 ファイル名２
    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オブジェクトに準拠するため、０から始まる整数です。
    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         * その値を、設定する場合の、３つの方法を指定できます。
    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}