001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.fukurou.system.HybsConst; // 6.4.5.2 (2016/05/06) 021import org.opengion.fukurou.util.StringUtil; 022import org.opengion.fukurou.util.ToString; 023import org.opengion.fukurou.util.FileUtil; // 6.4.5.2 (2016/05/06) 024import org.opengion.fukurou.model.POIUtil; 025// import org.opengion.fukurou.model.JacobUtil; // 6.9.0.0 (2018/01/31) 廃止 026import org.opengion.fukurou.model.ExcelModel; 027 028import static org.opengion.fukurou.util.StringUtil.nval ; 029import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE; // 6.1.0.0 (2014/12/26) refactoring 030 031import java.util.Map; 032import java.util.LinkedHashMap; 033import java.util.Arrays; 034import java.io.File; 035import java.util.List ; // 6.4.5.2 (2016/05/06) 036import java.util.ArrayList; // 7.2.9.0 (2020/10/12) 037 038/** 039 * ExcelFileTag は、各種パラメータを指定して、Excelファイルの操作をおこなうタグです。 040 * 041 * 主に、ExcelModel、POIUtil の各機能をJSP上で使用できるようにしました。 042 * 入力の file1 を加工して、file2 を出力するというのが、基本パターンになります。 043 * file1 と、file2 を同じ値に指定した場合は、上書き保存されます。 044 * 045 * 6.9.0.0 (2018/01/31) 046 * JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。 047 * 048 * X ※ (saveAs,toPrint)属性は、JACOB(Java COM Bridge)の使用が前提です。 049 * X これは、JavaからのCOMオートメーションコンポーネント呼び出しを可能とする 050 * X JAVA-COMブリッジです。COMライブラリのネイティブな呼び出しにJNIを使います。 051 * X JACOBは、32bitおよび64bitのJVMをサポートするX86およびx64環境で動作します。 052 * X http://sourceforge.jp/projects/sfnet_jacob-project/ (日本語プロジェクト) 053 * X http://sourceforge.net/projects/jacob-project/ (本家) 054 * 055 * X 設定: 056 * X jacob-1.18-M2.zip をダウンロードし、 057 * X ①jacob-1.18-M2-x64.dll または、jacob-1.18-M2-x86.dll を、 058 * X Windowsのシステムディレクトリにコピーします。 (例:C:\Windows\System32) 059 * X ②jacob.jar を、クラスパスに登録します。 060 * X ここでは、名称を、jacob-1.18-M2.jar に変更し、jre\lib\ext にコピーしています。 061 * 062 * @og.formSample 063 * ●形式:<og:excelFile action="…" fileURL="…" ・・・ /> 064 * 065 * ●形式:<og:excelFile action="…" fileURL="…" ・・・ > lt;og:excelImageFileParam … /> </og:excelFile> 066 * ●body:あり 067 * 068 * ●Tag定義: 069 * <og:excelFile 070 * fileURL 【TAG】操作するファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/]) 071 * file1 ○【TAG】入力ファイル名を指定します(必須) 072 * file2 【TAG】出力ファイル名を指定します 073 * sheetName 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし) 074 * sheetNos 【TAG】EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0) 075 * sheetConstKeys 【TAG】EXCELファイルを読み込むときの固定値となるカラム名(CSV形式) 076 * sheetConstAdrs 【TAG】EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・) 077 * useActiveWorkbook 【TAG】EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false) 078 * addTitleSheet 【TAG】EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。 079 * addImageFile 【TAG】画像ファイルを挿入します(画像ファイル名 シート番号 行 列) 080 * valueType 【TAG】sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV,LIST,MAP) 081 * readText 【TAG】ファイルを読み込んで、内容を 引数の変数にセットします。 082 * readSheet 【TAG】ファイルを読み込んで、シート一覧を 引数の変数にセットします。 083 * readName 【TAG】ファイルを読み込んで、名前一覧を 引数の変数にセットします。 084 * readStyle 【TAG】ファイルを読み込んで、スタイル名を 引数の変数にセットします。 085 * useConverter 【TAG】file1 のシート、セル、オブジェクトのテキストを変換します。 086 * convFile 【TAG】useConverter=true 時に、変換対応表をファイルから読み取ります。 087 * convMap 【TAG】useConverter=true 時に、変換対応表をMapから読み取ります。 088 * scope 【TAG】キャッシュする場合のスコープ(request,session)を指定します(初期値:request) 089 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20) 090 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20) 091 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20) 092 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20) 093 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 094 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 095 * /> 096 * 097 * 【廃止】6.9.0.0 (2018/01/31) 物理削除 098 * X ※ saveAs 【廃止】file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。 099 * X ※ toPrint 【廃止】file1 を指定のプリンタに印刷します。 100 * 101 * 【追加】7.2.9.0 (2020/10/12) 102 * BODY部に excelImageFileParam を指定可能にします。 103 * これは、addImageFile属性のタグ版で複数登録可能です。 104 * 105 * ●使用例 106 * ・EXCEL を読み取って、シート名の一覧の目次を、先頭シートに追加します。 107 * <og:excelFile file1="input.xls" file2="input.xls" addTitleSheet="Title" /> 108 * 109 * @og.group その他部品 110 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 111 * 112 * @version 6.2 113 * @author Kazuhiko Hasegawa 114 * @since JDK8.0, 115 */ 116public class ExcelFileTag extends CommonTagSupport { 117 /** このプログラムのVERSION文字列を設定します。 {@value} */ 118 private static final String VERSION = "7.2.9.0 (2020/10/12)" ; 119 private static final long serialVersionUID = 729020201012L ; 120 121 /** sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP) */ 122 private enum TypeEnum { CSV , LIST , MAP ; } 123 124 private TypeEnum valueType = TypeEnum.CSV ; // sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP) 125 126 private String fileURL = HybsSystem.sys( "FILE_URL" ); 127 private String file1 ; 128 private String file2 ; 129 130 private String sheetName ; // EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし) 131 private String sheetNos ; // EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0) 132 private String sheetConstKeys ; // EXCELファイルを読み込むときの固定値となるカラム名(CSV形式) 133 private String sheetConstAdrs ; // EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・) 134 private boolean useActiveWorkbook ; // EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false) 135 private String addTitleSheet ; // EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。 136 private String addImageFile ; // 画像ファイルを挿入します(画像ファイル名 シート番号 行 列) 137 private String readText ; // ファイルを読み込んで、内容を 引数の変数にセットします。 138 private String readSheet ; // ファイルを読み込んで、シート一覧を 引数の変数にセットします。 139 private String readName ; // ファイルを読み込んで、名前一覧を 引数の変数にセットします。 140 private String readStyle ; // ファイルを読み込んで、スタイル名を 引数の変数にセットします。 141 142 private boolean useConverter ; // file1 のシート、セル、オブジェクトのテキストを変換します。 143 private String convFile ; // useConverter=true 時に、変換対応表をファイルから読み取ります。 144 private String convMap ; // useConverter=true 時に、変換対応表をMapから読み取ります。 145 146// private String saveAs ; // file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。 6.9.0.0 (2018/01/31) 廃止 147// private String toPrint ; // file1 を指定のプリンタに印刷します。 6.9.0.0 (2018/01/31) 廃止 148 149 private String scope = "request"; // "request","session" 150 private transient List<ImageFile> imgList ; // 7.2.9.0 (2020/10/12) 151 152 /** 153 * デフォルトコンストラクター 154 * 155 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 156 */ 157 public ExcelFileTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 158 159 /** 160 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 161 * 162 * @og.rev 7.2.9.0 (2020/10/12) ExcelImageFileParamTag から値を取り込みます。 163 * 164 * @return 後続処理の指示 165 */ 166 @Override 167 public int doStartTag() { 168 return useTag() ? EVAL_BODY_BUFFERED : SKIP_BODY; 169 } 170 171 /** 172 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 173 * 174 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 175 * @og.rev 6.3.1.0 (2015/06/28) readText の取得方法を変更する。 176 * @og.rev 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。 177 * @og.rev 7.2.9.0 (2020/10/12) ExcelImageFileParamTag から値を取り込みます。 178 * 179 * @return 後続処理の指示 180 */ 181 @Override 182 public int doEndTag() { 183 debugPrint(); // 4.0.0 (2005/02/28) 184 if( useTag() ) { 185 super.setScope( scope ); // デフォルトscope が "request" なので、再設定している。 186 187 final String directory = HybsSystem.url2dir( fileURL ); 188 final File inFile = new File( StringUtil.urlAppend( directory,file1 ) ); 189 190 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 191// if( toPrint == null ) { 192// if( saveAs == null ) { 193 final ExcelModel excel = new ExcelModel( inFile ); 194 if( addTitleSheet != null ) { excel.setAddTitleSheet( addTitleSheet ); } 195// if( addImageFile != null ) { putImageFile( excel ); } 196 putImageFile( excel ); // 7.2.9.0 (2020/10/12) 197 198 // 6.3.1.0 (2015/06/28) readText の取得方法を変更する。 199 // if( readText != null ) { setObject( readText , POIUtil.extractor( inFile ) ); } 200 if( readText != null ) { setObject( readText , getExcelText( excel ) ); } 201 if( readSheet != null ) { setAttriObject( readSheet , excel.getSheetNames() ); } 202 if( readName != null ) { setAttriObject( readName , excel.getNames() ); } 203 if( readStyle != null ) { setAttriObject( readStyle , excel.getStyleNames() ); } 204 205 if( sheetConstKeys != null && sheetConstAdrs != null ) { sheetConstSet( excel ); } 206 207 if( useConverter ) { textConverter( excel ); } 208 if( useActiveWorkbook ) { excel.activeWorkbook( true ); } // 引数のtrueは、「空セルを削除する」の指定 209 210 if( file2 != null ) { 211 final File outFile = new File( StringUtil.urlAppend( directory,file2 ) ); 212 excel.saveFile( outFile ); 213 } 214// } 215// else { 216// if( file2 != null ) { 217// final String errMsg = "file2とsaveAsは、同時に指定する事はできません。" + CR 218// + " file2=[" + file2 + "] , saveAs=[" + saveAs + "]"; 219// throw new HybsSystemException( errMsg ); 220// } 221// 222// final File outFile = new File( StringUtil.urlAppend( directory,saveAs ) ); 223// JacobUtil.saveAs( inFile,outFile ); 224// } 225// } 226// else { 227// JacobUtil.toPrint( inFile,toPrint ); 228// } 229 } 230 return EVAL_PAGE ; 231 } 232 233 /** 234 * タグリブオブジェクトをリリースします。 235 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 236 * 237 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 238 * @og.rev 6.9.0.0 (2018/01/31) JacobUtil 廃止に伴い、toPrint、saveAs を廃止します。 239 * 240 */ 241 @Override 242 protected void release2() { 243 super.release2(); 244 valueType = TypeEnum.CSV; // sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP) 245 fileURL = HybsSystem.sys( "FILE_URL" ); 246 file1 = null; 247 file2 = null; 248 sheetName = null; // EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし) 249 sheetNos = null; // EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0) 250 sheetConstKeys = null; // EXCELファイルを読み込むときの固定値となるカラム名(CSV形式) 251 sheetConstAdrs = null; // EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・) 252 useActiveWorkbook = false; // EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false) 253 addTitleSheet = null; // EXCEL出力時に、存在するSheet名一覧を作成する場合に、そのSheet名を指定します。 254 addImageFile = null; // 画像ファイルを挿入します(画像ファイル名 シート番号 行 列) 255 readText = null; // ファイルを読み込んで、内容を 引数の変数にセットします。 256 readSheet = null; // ファイルを読み込んで、シート一覧を 引数の変数にセットします。 257 readName = null; // ファイルを読み込んで、名前一覧を 引数の変数にセットします。 258 readStyle = null; // ファイルを読み込んで、スタイル名を 引数の変数にセットします。 259 useConverter = false; // file1 のシート、セル、オブジェクトのテキストを変換します。 260 convFile = null; // useConverter=true 時に、変換対応表をファイルから読み取ります。 261 convMap = null; // useConverter=true 時に、変換対応表をMapから読み取ります。 262// saveAs = null; // file1 を指定のファイルの拡張子に合わせた変換を行って保存します(xls,xlsx,pdf)。 263// toPrint = null; // file1 を指定のプリンタに印刷します。 264 scope = "request"; // "request","session" 265 imgList = null; // 7.2.9.0 (2020/10/12) ExcelImageFileParamTag からのパラメータを管理します。 266 } 267 268 /** 269 * addImageFile属性の実際の処理を行います。 270 * 271 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 272 * @og.rev 7.2.9.0 (2020/10/12) ExcelImageFileParamTag から値を取り込みます。 273 * 274 * @param excel ExcelModelオブジェクト 275 */ 276 private void putImageFile( final ExcelModel excel ) { 277 if( addImageFile != null ) { 278 final String[] org = addImageFile.split( " " ); // 連続するスペースは個別に "" に分割される。 279 280 final String[] vals = Arrays.copyOf( org , 10 ); // 10個の配列を用意します。 281 282 final String imgFile = nval( vals[0] , null ); // 挿入するイメージファイル名 283 final int shtNo = nval( vals[1] , 0 ); // シート番号 284 final int row1 = nval( vals[2] , 0 ); // 挿入する行(開始) 285 final int col1 = nval( vals[3] , 0 ); // 挿入する列(開始) 286 final int row2 = nval( vals[4] , row1 ); // 挿入する行(終了-含まず) 287 final int col2 = nval( vals[5] , col1 ); // 挿入する列(終了-含まず) 288 final int dx1 = nval( vals[6] , 0 ); // 開始セルのX軸座標のオフセット(ピクセル) 289 final int dy1 = nval( vals[7] , 0 ); // 開始セルのY軸座標のオフセット(ピクセル) 290 final int dx2 = nval( vals[8] , 0 ); // 終了セルのX軸座標のオフセット(ピクセル) 291 final int dy2 = nval( vals[9] , 0 ); // 終了セルのY軸座標のオフセット(ピクセル) 292 293 excel.addImageFile( imgFile,shtNo,row1,col1,row2,col2,dx1,dy1,dx2,dy2 ); 294 } 295 296 if( imgList != null ) { 297 for( final ImageFile imgFile : imgList ) { 298 imgFile.setExcelModel( excel ); 299 } 300 } 301 } 302 303 /** 304 * テキスト情報を取得します。 305 * 306 * EXCELファイルのテキスト情報として、シート名、セル値、オブジェクト文字列を取得します。 307 * POIUtil.extractor( File ) でもテキストを取得できますが、細かい点で、調整できません。 308 * 309 * @og.rev 6.3.1.0 (2015/06/28) 新規作成 310 * @og.rev 6.3.9.0 (2015/11/06) Java 8 ラムダ式に変更 311 * 312 * @param excel ExcelModelオブジェクト 313 * @return テキスト情報 314 */ 315 private String getExcelText( final ExcelModel excel ) { 316 final StringBuilder buf = new StringBuilder( BUFFER_LARGE ); 317 318 // 6.3.9.0 (2015/11/06) Java 8 ラムダ式に変更 319 excel.textConverter( 320 (val,cmnt) -> { 321 if( val != null ) { buf.append( val ).append( CR ); } 322 return null; 323 } 324 ); 325 326 return buf.toString(); 327 } 328 329 /** 330 * sheetConstKeys,sheetConstAdrs属性の実際の処理を行います。 331 * 332 * EXCELファイルを読み込むときの固定値となるカラム名(CSV形式)と 333 * アドレス(行-列,行-列,・・・) から、値を取得します。 334 * 取得した結果は、valueType 属性で指定した方法でセーブします。 335 * アドレスは、1シートに1箇所ですが、シートが複数存在する場合は、 336 * 複数の値が求められます。その値の設定方法は、valueType属性で指定します。 337 * 338 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 339 * 340 * @param excel ExcelModelオブジェクト 341 */ 342 private void sheetConstSet( final ExcelModel excel ) { 343 final Map<String,String> kvMap = getCSVParameter( sheetConstKeys , sheetConstAdrs ); 344 345 final int size = kvMap.size(); 346 final String[] keys = new String[size]; 347 final int[] rows = new int[size]; 348 final int[] cols = new int[size]; 349 350 // 行-列 文字列を、分解します。 351 int no = 0; 352 for( final Map.Entry<String,String> entry : kvMap.entrySet() ) { 353 keys[no] = entry.getKey(); 354 final String val = entry.getValue(); 355 final int[] rci = POIUtil.kigo2rowCol( val ); // A1,B5 などの形式 356 rows[no] = rci[0]; 357 cols[no] = rci[1]; 358 359 no++ ; 360 } 361 // size と、no は、同じ値のはず。 362 363 // EXCELからデータを抜き出します。 364 final int shtSize = excel.getNumberOfSheets(); 365 final String[][] kvAry = new String[size][shtSize]; 366 for( int shtNo=0; shtNo<shtSize; shtNo++ ) { 367 final String shtNm = excel.getSheetName( shtNo ); // シート名の取得と同時に、内部状態の Sheetオブジェクトを設定する。 368 for( int i=0; i<size; i++ ) { 369 if( rows[i] < 0 ) { 370 kvAry[i][shtNo] = shtNm; // rowNo が -1 の場合は、シート名を設定 371 } 372 else { 373 kvAry[i][shtNo] = excel.getValue( rows[i],cols[i] ); // 配列の配置がループと会わないが、後でセットするため。 374 } 375 } 376 } 377 378 // キーと、各シートから集めた値を設定します。 379 for( int i=0; i<size; i++ ) { 380 setAttriObject( keys[i] , kvAry[i] ) ; 381 } 382 } 383 384 /** 385 * シート、セル、オブジェクトのテキストを変換します。 386 * 387 * convFile : 変換対応表をファイルから読み取ります。 388 * convMap : 変換対応表をMapから読み取ります。 389 * 390 * このメソッドは、useConverter=true の時のみ、呼ばれます。 391 * また、convFileとconvMapの両方とも、定義されていない場合は、 392 * 何もしません。 393 * 両方とも定義されていた場合は、if文の関係で、convFileが優先されます。 394 * 395 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 396 * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。 397 * @og.rev 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更 398 * @og.rev 6.4.5.2 (2016/05/06) fukurou.util.FileString から、fukurou.util.FileUtil に移動。 399 * 400 * @param excel ExcelModelオブジェクト 401 */ 402 @SuppressWarnings(value={"unchecked"}) 403 private void textConverter( final ExcelModel excel ) { 404 Map<String,String> changeMap = null; 405 406 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 407 if( convFile == null ) { 408 if( convMap != null ) { 409 changeMap = (Map<String,String>)getObject( convMap ); // 警告: [unchecked] 無検査キャスト 410 } 411 } 412 else { 413 final String inFile = HybsSystem.url2dir( fileURL , convFile ); // 6.4.2.1 (2016/02/05) 414 415 // 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更 416 final List<String> list = FileUtil.getLineList( inFile , HybsConst.UTF_8 ); // 6.4.5.2 (2016/05/06) 417 418 changeMap = new LinkedHashMap<>(); 419 for( final String line : list ) { 420 final int indx = line.indexOf( '\t' ); 421 if( indx <= 0 ) { continue ; } // TAB が先頭や、存在しない行は読み飛ばす。 422 final String key = line.substring( 0,indx ); 423 final String cng = line.substring( indx+1 ); 424 changeMap.put( key,cng ); 425 } 426 } 427 428 // convFile も、convMap も定義されていない場合、changeMap は、null のまま。 429 if( changeMap != null ) { 430 excel.textConverter( changeMap ); 431 } 432 } 433 434 /** 435 * 【TAG】操作するファイルのディレクトリを指定します 436 * (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。 437 * 438 * @og.tag 439 * この属性で指定されるディレクトリのファイルを操作します。 440 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 441 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 442 * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。 443 * 444 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 445 * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。 446 * 447 * @param url ファイルURL 448 * @see org.opengion.hayabusa.common.SystemData#FILE_URL 449 */ 450 public void setFileURL( final String url ) { 451 final String furl = nval( getRequestParameter( url ),null ); 452 if( furl != null ) { 453 fileURL = StringUtil.urlAppend( fileURL,furl ); 454 } 455 } 456 457 /** 458 * 【TAG】基準となるファイル名を指定します(コマンドの左辺のファイル名です)。 459 * 460 * @og.tag 461 * コマンドの左辺のファイル名です。 462 * 463 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 464 * 465 * @param fname ファイル名1 466 */ 467 public void setFile1( final String fname ) { 468 file1 = nval( getRequestParameter( fname ),file1 ); 469 } 470 471 /** 472 * 【TAG】内部 Workbook オブジェクトをファイルに書き出します。 473 * 474 * @og.tag 475 * この属性を指定しない場合は、ファイルに出力されません。 476 * また、file1 と同じファイルを指定することは可能です。その場合は、 477 * 元のファイルが上書き保存されます。 478 * Excelの形式は、ここで指定する出力ファイルの拡張子ではなく、file1で 479 * 指定したファイルの拡張子で決まります。 480 * 異なる形式の拡張子を持つファイルを指定した場合、強制的に、オープンした 481 * Workbook の形式の拡張子を追加します。 482 * 483 * 拡張子は、Excel 2007以降の形式(.xlsx)か、Excel 2003以前の形式(.xls) が指定できます。 484 * 拡張子が未設定の場合は、オープンした Workbook の形式に合わせた拡張子を付与します。 485 * 486 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 487 * 488 * @param fname ファイル名2 489 */ 490 public void setFile2( final String fname ) { 491 file2 = nval( getRequestParameter( fname ),file2 ); 492 } 493 494 /** 495 * 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)。 496 * 497 * @og.tag 498 * EXCELファイルを読み込む時に、シート名を指定します。 499 * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。 500 * エラーにはならないのでご注意ください。 501 * 初期値は、指定なしです。 502 * 503 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 504 * 505 * @param sheet EXCELファイルのシート名 506 * @see #setSheetNos( String ) 507 */ 508 public void setSheetName( final String sheet ) { 509 sheetName = nval( getRequestParameter( sheet ),sheetName ); 510 } 511 512 /** 513 * 【TAG】EXCELファイルを読み込むときのシート番号を指定します(初期値:0)。 514 * 515 * @og.tag 516 * EXCEL読み込み時に複数シートをマージして取り込みます。 517 * シート番号は、0 から始まる数字で表します。 518 * 519 * シート番号の指定は、CSV形式で、複数指定できます。また、N-M の様にハイフンで繋げることで、 520 * N 番から、M 番のシート範囲を一括指定可能です。また、"*" による、全シート指定が可能です。 521 * これらの組み合わせも可能です。( 0,1,3,5-8,10-* ) 522 * ただし、"*" に関しては例外的に、一文字だけで、すべてのシートを表すか、N-* を最後に指定するかの 523 * どちらかです。途中には、"*" は、現れません。 524 * シート番号は、重複(1,1,2,2)、逆転(3,2,1) での指定が可能です。これは、その指定順で、読み込まれます。 525 * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。 526 * エラーにはならないのでご注意ください。 527 * 528 * 初期値は、0(第一シート) です。 529 * 530 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 531 * 532 * @param sheet EXCELファイルのシート番号(0から始まる) 533 * @see #setSheetName( String ) 534 */ 535 public void setSheetNos( final String sheet ) { 536 sheetNos = nval( getRequestParameter( sheet ),sheetNos ); 537 if( sheetNos != null && sheetNos.length() > 0 ) { 538 boolean errFlag = false; 539 for( int i=0; i<sheetNos.length(); i++ ) { 540 final char ch = sheetNos.charAt(i); 541 if( ch == '-' || ch == ',' ) { continue; } 542 if( ch == '*' && ( i==0 || i==sheetNos.length()-1 ) ) { continue; } 543 if( ch < '0' || ch > '9' ) { errFlag = true; break; } 544 } 545 if( errFlag ) { 546 final String errMsg = "sheetNos の指定を見直してください。sheetNos=[" + sheetNos + "]"; 547 throw new HybsSystemException( errMsg ); 548 } 549 } 550 } 551 552 /** 553 * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのキーをCSV形式で指定します。 554 * 555 * @og.tag 556 * カラム名は、CSV形式で指定します。 557 * これにより、シートの一か所に書かれている情報を、固定値として取得することができます。 558 * sheetConstAdrs 属性で指定したセル位置から取得した値を、sheetConstKeys で指定したキーに 559 * 設定します。 560 * 値の設定方法は、valueType 属性で指定します。 561 * 562 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 563 * 564 * @param constKeys 固定値となるキー(CSV形式) 565 * @see #setSheetConstAdrs( String ) 566 */ 567 public void setSheetConstKeys( final String constKeys ) { 568 sheetConstKeys = constKeys; 569 } 570 571 /** 572 * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのキーに対応するアドレスをCSV形式で指定します。 573 * 574 * @og.tag 575 * アドレスは、EXCEL上の行-列形式か、EXCEL表記に準拠した、A1,A2,B1形式が使用できます。 576 * また、特殊な文字として、"SHEET" という記号が使用できます。 577 * ①行-列形式 578 * 行列は、EXCELオブジェクトに準拠するため、0から始まる整数です。 579 * 0-0 ⇒ A1 , 1-0 ⇒ A2 , 0-1 ⇒ B1 になります。 580 * ②EXCEL表記 581 * EXCEL表記に準拠した、A1,A2,B1 の記述も処理できるように対応します。 582 * なお、A1,A2,B1 の記述は、必ず、英字1文字+数字 にしてください。(A~Zまで) 583 * ③EXCELシート名をキーに割り当てるために、"SHEET" という記号に対応します。 584 * readSheet 属性で、同等のことが出来まが、統一的に処理できるようにします。 585 * 586 * 例えば、sheetConstKeys="CLM,LANG,NAME" とし、sheetConstAdrs="0-0,A2,SHEET" とすると、 587 * NAMEカラムには、シート名を読み込むことができます。 588 * これは、内部処理の簡素化のためです。 589 * 590 * ちなみに、EXCELのセルに、シート名を表示させる場合の関数は、下記の様になります。 591 * =RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1))) 592 * 593 * これにより、シートの一か所に書かれている情報を、固定値として取得することができます。 594 * sheetConstAdrs 属性で指定したセル位置から取得した値を、sheetConstKeys で指定したキーに 595 * 設定します。 596 * 値の設定方法は、valueType 属性で指定します。 597 * 598 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 599 * 600 * @param constAdrs 固定値となるアドレス (行-列,行-列,・・・) 601 * @see #setSheetConstKeys( String ) 602 */ 603 public void setSheetConstAdrs( final String constAdrs ) { 604 sheetConstAdrs = constAdrs; 605 } 606 607 /** 608 * 【TAG】EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します(初期値:false)。 609 * 610 * @og.tag 611 * セルの有効範囲というのは、EXCELでの 空行、空列の存在しない範囲を指します(初期値:false)。 612 * 通常、空行でも、データとして残っている場合は、EXCELのセルオブジェクトは存在します。 613 * ここで、useActiveWorkbook="true" とすると、空行、空列を削除します。 614 * 初期値は、false:しない です。 615 * 616 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 617 * 618 * @param useActWB 有効範囲の設定 [true:する/false:しない] 619 */ 620 public void setUseActiveWorkbook( final String useActWB ) { 621 useActiveWorkbook = nval( getRequestParameter( useActWB ),useActiveWorkbook ); 622 } 623 624 /** 625 * 【TAG】EXCEL出力時に、Sheet一覧を作成する場合のSheet名を指定します。 626 * 627 * @og.tag 628 * これは、Workbook に含まれる Sheet 一覧を作成する場合に、ここに指定した 629 * シート名で、目次を作成します。 630 * 631 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 632 * 633 * @param sheetName タイトルシート名 634 */ 635 public void setAddTitleSheet( final String sheetName ) { 636 addTitleSheet = nval( getRequestParameter( sheetName ),addTitleSheet ); 637 } 638 639 /** 640 * 【TAG】指定のシートの行・列の箇所に、イメージファイルを挿入します。 641 * 642 * @og.tag 643 * 7.2.9.0 (2020/10/12) 以降は、ExcelImageFileParamTag を推奨いたします。 644 * 645 * ここでは、セル範囲ではなく、指定の行列の箇所に、アンカーを設定して、画像ファイルを 646 * 挿入します。一応、リサイズして、元の大きさ近くに戻しますが、縦横比が変わってしまいます。 647 * 正確に挿入する場合は、セル範囲の指定と、マージンを指定しなければなりませんが、 648 * 微調整が必要です。 649 * 引数は、スペース区切りで、下記の順番で指定します。 650 * 651 * imgFile 挿入するイメージファイル名 652 * shtNo シート番号 653 * row1 挿入する行(開始) 654 * col1 挿入する列(開始) 655 * [row2] 挿入する行(終了-含まず) (未指定時は、row1) 656 * [col2] 挿入する列(終了-含まず) (未指定時は、col1) 657 * [dx1 ] 開始セルのX軸座標のオフセット(ピクセル) (未指定時は、0) 658 * [dy1 ] 開始セルのY軸座標のオフセット(ピクセル) (未指定時は、0) 659 * [dx2 ] 終了セルのX軸座標のオフセット(ピクセル) (未指定時は、0) 660 * [dy2 ] 終了セルのY軸座標のオフセット(ピクセル) (未指定時は、0) 661 * 662 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 663 * 664 * @param imgFile (画像ファイル名 シート番号 開始行 開始列 [終了行 終了列 開始セルのX軸マージン 開始セルのY軸マージン 終了セルのX軸マージン 終了セルのY軸マージン]) 665 */ 666 public void setAddImageFile( final String imgFile ) { 667 addImageFile = nval( getRequestParameter( imgFile ),addImageFile ); 668 } 669 670 /** 671 * addImageFile属性の実際の処理を行います。 672 * 673 * @og.rev 6.2.6.0 (2015/06/19) 新規作成 674 * 675 * @param imgFile 挿入するイメージファイル名 676 * @param sheetName シート名 677 * @param sheetNo シート番号 678 * @param rowNo 挿入する行(開始) 679 * @param colNo 挿入する列(開始) 680 * @param rowEndNo 挿入する行(終了-含まず) 681 * @param colEndNo 挿入する列(終了-含まず) 682 * @param dx1 開始セルのX軸座標のオフセット(ピクセル) 683 * @param dy1 開始セルのY軸座標のオフセット(ピクセル) 684 * @param dx2 終了セルのX軸座標のオフセット(ピクセル) 685 * @param dy2 終了セルのY軸座標のオフセット(ピクセル) 686 */ 687 protected void addImgFile( final String imgFile , final String sheetName, final int sheetNo , 688 final int rowNo , final int colNo , final int rowEndNo , final int colEndNo , 689 final int dx1 , final int dy1 , final int dx2 , final int dy2 ) { 690 691 final ImageFile img = new ImageFile( imgFile,sheetName,sheetNo,rowNo,colNo,rowEndNo,colEndNo,dx1,dy1,dx2,dy2 ); 692 if( imgList == null ) { 693 imgList = new ArrayList<ImageFile>(); 694 } 695 696 imgList.add( img ); 697 } 698 699 /** 700 * 【TAG】sheetConstXXX,readXXXX のパラメータに登録する方法を指定します(CSV/LIST/MAP)。 701 * 702 * @og.tag 703 * キーに対して、値は複数存在する場合があります。 704 * その値を、設定する場合の、3つの方法を指定できます。 705 * 706 * CSV : キーに対して、値をCSV形式でセットします。valueタグや、{@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}