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