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 */ 016 package org.opengion.plugin.io; 017 018 import java.io.File; 019 import java.io.FileInputStream; 020 import java.io.FileOutputStream; 021 import java.io.IOException; 022 import java.io.OutputStream; 023 import java.io.PrintWriter; 024 import java.util.Locale; 025 026 import org.apache.poi.ss.usermodel.Cell; 027 import org.apache.poi.ss.usermodel.CreationHelper; 028 import org.apache.poi.ss.usermodel.Font; 029 import org.apache.poi.ss.usermodel.RichTextString; 030 import org.apache.poi.ss.usermodel.Row; 031 import org.apache.poi.ss.usermodel.Sheet; 032 import org.apache.poi.ss.usermodel.Workbook; 033 import org.apache.poi.ss.usermodel.WorkbookFactory; 034 import org.opengion.fukurou.model.NativeType; 035 import org.opengion.fukurou.util.Closer; 036 import org.opengion.fukurou.util.StringUtil; 037 import org.opengion.hayabusa.common.HybsSystemException; 038 import org.opengion.hayabusa.db.DBTableModel; 039 040 /** 041 * ネイ?ブEXCELファイルの書き?しクラスです? 042 * 043 * DefaultTableWriter を継承して?す?で?ラベル?名前,データの出力部のみ 044 * オーバ?ライドして?MIcrosoft Excelファイルの出力機?を実現して?す? 045 * 046 * 出力形式?、openXML形式にも対応して?す? 047 * 出力ファイルの拡張子が?xlsならExcel2003のバイナリ形式?.xlsxならExcel2007の 048 * openXML形式で出力されます? 049 * 050 * @og.group ファイル出? 051 * 052 * @og.rev 4.3.4.3 (2008/12/22) ?protected? 053 * @og.rev 4.3.6.7 (2009/05/22) ooxml形式対? 054 * 055 * @version 4.0 056 * @author Kazuhiko Hasegawa 057 * @since JDK5.0, 058 */ 059 public class TableWriter_Excel extends TableWriter_Default { 060 //* こ?プログラ??VERSION??を設定します? {@value} */ 061 private static final String VERSION = "5.2.1.0 (2010/10/01)" ; 062 063 private Workbook wb = null; 064 private Sheet sheet = null; 065 // protected OutputStream out = null; // 5.5.2.6 (2012/05/25) findbugs対? 066 protected int nRowIndex = 0; 067 private String sheetName = "Sheet1"; // 3.5.4.3 (2004/01/05) 068 private String refSheetName = null; // 3.5.4.3 (2004/01/05) 069 private String filename = null; // 3.5.4.3 (2004/01/05) 070 private String refFilename = null; // 3.5.4.3 (2004/01/05) 071 private String fontName = null; // 3.8.5.3 (2006/08/07) 072 private short fontPoint = -1; // 3.8.5.3 (2006/08/07) 073 private CreationHelper createHelper = null; // poi.xssf対? 074 // 5.1.4.0 (2010/03/01) 行番号??を?出力す?true)/しな?false)を指? 075 private boolean useNumber = true; 076 077 /** 078 * DBTableModel から ?式???タを作?して,PrintWriter に書き?します? 079 * こ?メソ?は、EXCEL 書き?し時に使用します? 080 * 081 * @og.rev 4.0.0.0 (2006/09/31) 新規追? 082 * @og.rev 5.1.4.0 (2010/03/01) columns 対?、useNumber属?対? 083 * 084 * @see #isExcel() 085 */ 086 @Override 087 public void writeDBTable() { 088 if( ! createDBColumn() ) { return ; } 089 090 useNumber = isUseNumber(); 091 092 // numberOfColumns = getDBTableModel().getColumnCount(); 093 094 // if( numberOfColumns <= 0 ) { return; } 095 096 // 3.5.6.0 (2004/06/18) 移? 097 if( filename == null ) { 098 String errMsg = "ファイルが指定されて?せん?; 099 throw new HybsSystemException(errMsg ); 100 } 101 102 // メモリにEXCEL??タを作る 103 boolean isRefFileExisted = false; 104 boolean isRefFile = false; 105 boolean isWorkFileExisted = checkAvailabity(filename); 106 boolean hasFile = isWorkFileExisted; 107 String nameUse = filename; 108 109 // 同じワークブ?ク中に雛型シートが存在してある場? 110 boolean hasRefSheet = ((null != refSheetName) && (0 <= refSheetName.length())); 111 112 if( hasRefSheet && (null != refFilename) && (0 < refFilename.length())) { 113 if(isWorkFileExisted ) { 114 if( 0 == refFilename.compareToIgnoreCase(filename) ) { 115 nameUse = filename; 116 hasFile = true; 117 } 118 else { 119 String errMsg = "追??時?雛型ファイル名と出力ファイル名が同じしか対応して?かった[" + refFilename + "]" ; 120 throw new HybsSystemException( errMsg ); 121 } 122 } 123 else { 124 nameUse = refFilename; 125 hasFile = true; 126 isRefFile = true; 127 } 128 } 129 130 if( hasFile ) { 131 wb = createWorkbook(nameUse); 132 } 133 else { 134 // 新規?場合?ファイル名に.xlsxで終?た?合.xlsx形式ファイル作?、その他.xls形式ファイル作? 135 if(filename.toLowerCase(Locale.JAPAN).endsWith( ".xlsx" ) ) { 136 wb = new org.apache.poi.xssf.usermodel.XSSFWorkbook(); 137 } 138 else { 139 wb = new org.apache.poi.hssf.usermodel.HSSFWorkbook(); 140 } 141 142 // 3.8.6.0 (2006/08/07) フォント名?ォントサイズの?? 143 Font font = wb.getFontAt((short)0); 144 if( fontName != null ) { 145 font.setFontName( fontName ); // "?? ?ゴシ?" など 146 } 147 if( fontPoint > 0 ) { 148 font.setFontHeightInPoints( fontPoint ); 149 } 150 } 151 152 int nSheetIndex = wb.getSheetIndex(sheetName); 153 int nSheetPattern = -1; 154 155 if( isRefFileExisted ) { 156 sheet = wb.createSheet(); 157 } 158 else { 159 if( hasRefSheet ) { nSheetPattern = wb.getSheetIndex(refSheetName); } 160 161 if( isRefFile ) { 162 if(-1 >= nSheetPattern ) { 163 String errMsg = "雛型の中に参?としてのシートが存在しません[" + refFilename + "]" ; 164 throw new HybsSystemException( errMsg ); 165 } 166 while(true) { 167 int nTotalSheets = wb.getNumberOfSheets(); 168 169 if( 1 == nTotalSheets ) { break; } 170 171 for( int nIndex = ( nTotalSheets - 1 ); nIndex >= 0; nIndex--) { 172 if( nIndex != nSheetPattern ) { wb.removeSheetAt(nIndex); } 173 } 174 175 if( hasRefSheet ) { nSheetPattern = wb.getSheetIndex(refSheetName); } 176 } 177 } 178 else { 179 // 新規?場合シートが存在すると、そのシートを削除 180 if( -1 < nSheetIndex && !isAppend() && ( nSheetIndex != nSheetPattern ) && hasFile ) { 181 wb.removeSheetAt(nSheetIndex); 182 } 183 } 184 // シートを削除して、も??雛型シート?位置を求め? 185 if( hasRefSheet ) { nSheetPattern = wb.getSheetIndex(refSheetName); } 186 187 sheet = (-1 >= nSheetPattern) ? wb.createSheet() : wb.cloneSheet(nSheetPattern); 188 189 // 雛型ファイルを使って?場合?そ?雛形シートを削除する 190 if(isRefFile) { wb.removeSheetAt(nSheetPattern); } 191 } 192 193 wb.setSheetName(wb.getNumberOfSheets() -1, getNewSheetNameByName(wb, sheetName) ); 194 195 // poi.xssf対?2009/04/08) 196 createHelper = wb.getCreationHelper(); 197 198 nRowIndex = 0; 199 200 super.writeDBTable( null ); 201 202 // 余計な行を削除 203 removeSheetRow( sheet, nRowIndex ); 204 205 // メモリ中の??タをファイルに書き込? 206 // 3.5.6.0 (2004/06/18) close ?finally で処?るよ?変更? 207 try { 208 FileOutputStream fileOut = null ; 209 try { 210 fileOut = new FileOutputStream(filename); 211 wb.write(fileOut); 212 } 213 finally { 214 Closer.ioClose( fileOut ); // 4.0.0 (2006/01/31) close 処?の IOException を無? 215 if( null != sheet ) { sheet = null; } 216 if( null != wb ) { wb = null; } 217 } 218 } 219 catch( IOException e) { 220 String errMsg = "ファイルへ書込み中にエラーが発生しました? 221 + " File=" + filename; // 5.1.8.0 (2010/07/01) errMsg 修正 222 throw new HybsSystemException( errMsg,e ); // 3.5.5.4 (2004/04/15) 引数の並び?更 223 } 224 225 // メモリ中の??タをファイルに書き込? 226 } 227 228 /** 229 * DBTableModel から ??タを作?して,PrintWriter に書き?します? 230 * 231 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する? 232 * @og.rev 3.5.4.3 (2004/01/05) 引数に PrintWriter を受け取るよ?変更します? 233 * @og.rev 3.8.5.3 (2006/08/07) フォント名?ォントサイズの?? 234 * @og.rev 4.0.0.0 (2006/09/31) UnsupportedOperationException を発行します? 235 * 236 * @param writer PrintWriterオブジェク? 237 */ 238 @Override 239 public void writeDBTable( final PrintWriter writer ) { 240 String errMsg = "こ?クラスでは実?れて?せん?; 241 throw new UnsupportedOperationException( errMsg ); 242 } 243 244 /** 245 * PrintWriter に DBTableModelのラベル??を書き込みます? 246 * 第?ラ?は、ラベル??を示?"#Label" を書き込みます? 247 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 248 * 249 * @og.rev 5.1.4.0 (2010/03/01) useNumber属?対? 250 * 251 * @param table DBTableModelオブジェク? 252 * @param writer PrintWriterオブジェク? 253 */ 254 @Override 255 protected void writeLabel( final DBTableModel table,final PrintWriter writer ) { 256 short nColIndex; 257 Row oRow; 258 259 nColIndex = 0; 260 oRow = setFirstCellValue( nRowIndex++, nColIndex++, "#Label" ); 261 for( int i=0; i<numberOfColumns; i++ ) { 262 int clm = clmNo[i]; 263 String val = dbColumn[clm].getLabel(); 264 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、nColIndex を?戻して、?に # を付ける? 265 if( i==0 && !useNumber ) { 266 nColIndex-- ; 267 val = "#" + val; 268 } 269 // setRowCellValue( oRow, nColIndex++, dbColumn[clm].getLabel(),Cell.CELL_TYPE_STRING ); 270 setRowCellValue( oRow, nColIndex++, val,Cell.CELL_TYPE_STRING ); 271 } 272 273 // 余計なセルを削除 274 removeRowCell( oRow, nColIndex ); 275 } 276 277 /** 278 * PrintWriter に DBTableModelの?名情報を書き込みます? 279 * 第?ラ?は??目名情報を示?"#Name" を書き込みます? 280 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 281 * 282 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する? 283 * @og.rev 5.1.4.0 (2010/03/01) useNumber属?対? 284 * 285 * @param table DBTableModelオブジェク? 286 * @param writer PrintWriterオブジェク? 287 */ 288 @Override 289 protected void writeName( final DBTableModel table,final PrintWriter writer ) { 290 short nColIndex; 291 Row oRow; 292 293 nColIndex = 0; 294 oRow = setFirstCellValue( nRowIndex++, nColIndex++, "#Name" ); 295 for( int i=0; i<numberOfColumns; i++ ) { 296 int clm = clmNo[i]; 297 String val = table.getColumnName(clm); 298 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、nColIndex を?戻して、?に # を付ける? 299 if( i==0 && !useNumber ) { 300 nColIndex-- ; 301 val = "#" + val; 302 } 303 // setRowCellValue( oRow, nColIndex++, table.getColumnName(clm),HSSFCell.CELL_TYPE_STRING ); 304 setRowCellValue( oRow, nColIndex++, val,Cell.CELL_TYPE_STRING ); 305 } 306 307 // 余計なセルを削除 308 removeRowCell( oRow, nColIndex ); 309 } 310 311 /** 312 * PrintWriter に DBTableModelのサイズ??を書き込みます? 313 * 第?ラ?は、サイズ??を示?"#Size" を書き込みます? 314 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 315 * 316 * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更 317 * @og.rev 5.1.4.0 (2010/03/01) useNumber属?対? 318 * 319 * @param table DBTableModelオブジェク? 320 * @param writer PrintWriterオブジェク? 321 */ 322 @Override 323 protected void writeSize( final DBTableModel table,final PrintWriter writer ) { 324 short nColIndex; 325 Row oRow; 326 327 nColIndex = 0; 328 oRow = setFirstCellValue( nRowIndex++, nColIndex++, "#Size" ); 329 for( int i=0; i<numberOfColumns; i++ ) { 330 int clm = clmNo[i]; 331 // 4.0.0 (2005/01/31) メソ?名変更 332 String val = String.valueOf(dbColumn[clm].getTotalSize()); 333 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、nColIndex を?戻して、?に # を付ける? 334 if( i==0 && !useNumber ) { 335 nColIndex-- ; 336 val = "#" + val; 337 } 338 setRowCellValue( oRow, nColIndex++, val, Cell.CELL_TYPE_NUMERIC ); 339 } 340 341 // 余計なセルを削除 342 removeRowCell( oRow, nColIndex ); 343 } 344 345 /** 346 * PrintWriter に DBTableModelのクラス名情報を書き込みます? 347 * 第?ラ?は、サイズ??を示?"#Class" を書き込みます? 348 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 349 * 350 * @og.rev 5.1.4.0 (2010/03/01) useNumber属?対? 351 * 352 * @param table DBTableModelオブジェク? 353 * @param writer PrintWriterオブジェク? 354 */ 355 @Override 356 protected void writeClass( final DBTableModel table,final PrintWriter writer ) { 357 short nColIndex; 358 Row oRow; 359 360 nColIndex = 0; 361 oRow = setFirstCellValue( nRowIndex++, nColIndex++, "#Class" ); 362 for( int i=0; i<numberOfColumns; i++ ) { 363 int clm = clmNo[i]; 364 String val = dbColumn[clm].getClassName(); 365 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、nColIndex を?戻して、?に # を付ける? 366 if( i==0 && !useNumber ) { 367 nColIndex-- ; 368 val = "#" + val; 369 } 370 // setRowCellValue( oRow, nColIndex++, dbColumn[clm].getClassName(),Cell.CELL_TYPE_STRING ); 371 setRowCellValue( oRow, nColIndex++, val,Cell.CELL_TYPE_STRING ); 372 } 373 374 // 余計なセルを削除 375 removeRowCell( oRow, nColIndex ); 376 } 377 378 /** 379 * PrintWriter に セパレーターを書き込みます? 380 * 第?ラ?は、サイズ??を示?"#----" を書き込みます? 381 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 382 * 383 * @og.rev 5.1.4.0 (2010/03/01) useNumber属?対? 384 * 385 * @param table DBTableModelオブジェク? 386 * @param writer PrintWriterオブジェク? 387 */ 388 @Override 389 protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) { 390 String sep = "----" ; 391 short nColIndex; 392 Row oRow; 393 394 nColIndex = 0; 395 oRow = setFirstCellValue( nRowIndex++, nColIndex++, "#----" ); 396 for( int i=0; i<numberOfColumns; i++ ) { 397 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、単になにもしな?? 398 if( i==0 && !useNumber ) { 399 continue; 400 } 401 setRowCellValue( oRow, nColIndex++, sep,Cell.CELL_TYPE_STRING ); 402 } 403 404 // 余計なセルを削除 405 removeRowCell( oRow, nColIndex ); 406 } 407 408 /** 409 * PrintWriter に DBTableModelの??ブル??を書き込みます? 410 * こ?クラスでは?データ??ルコー??ション(")で囲みます? 411 * PrintWriter に DBTableModelの??ブル??を書き込みます? 412 * 413 * @og.rev 3.8.0.1 (2005/06/17) DBType?NVAR の場合?、?のUnicodeに戻します? 414 * @og.rev 3.8.5.3 (2006/08/07) DBType の nativeType に対応した?CELL_TYPE をセ?します? 415 * @og.rev 4.1.1.2 (2008/02/28) NativeタイプをEnum?fukurou.model.NativeType)に変更 416 * @og.rev 5.1.4.0 (2010/03/01) columns 対? 417 * @og.rev 5.1.4.0 (2010/03/01) useNumber属?対? 418 * @og.rev 5.2.1.0 (2010/10/01) useRenderer 対? 419 * 420 * @param table DBTableModelオブジェク? 421 * @param writer PrintWriterオブジェク? 422 */ 423 @Override 424 protected void writeData( final DBTableModel table,final PrintWriter writer ) { 425 int numberOfRows = table.getRowCount(); 426 427 short nColIndex; 428 Row oRow; 429 430 // 5.1.4.0 columns 対応?forループ?、引数i で廻す? 431 boolean[] nvar = new boolean[numberOfColumns]; 432 int[] cellType = new int[numberOfColumns]; 433 for( int i=0; i<numberOfColumns; i++ ) { 434 int clm = clmNo[i]; 435 NativeType nativeType = dbColumn[clm].getNativeType(); 436 switch( nativeType ) { 437 case INT : 438 case LONG : 439 case DOUBLE : 440 cellType[i] = Cell.CELL_TYPE_NUMERIC ; 441 break; 442 case STRING : 443 case CALENDAR : 444 default : 445 cellType[i] = Cell.CELL_TYPE_STRING ; 446 break; 447 } 448 nvar[i] = "NVAR".equals( dbColumn[clm].getDbType()) ; 449 } 450 boolean useRenderer = isUseRenderer(); // 5.2.1.0 (2010/10/01) 451 452 for( int row=0; row<numberOfRows; row++ ) { 453 nColIndex = 0; 454 oRow = setFirstCellValue( nRowIndex++, nColIndex++, String.valueOf( row+1 ) ); 455 456 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、nColIndex を?戻す? 457 if( !useNumber ) { 458 nColIndex-- ; 459 } 460 461 for( int i=0; i<numberOfColumns; i++ ) { 462 int clm = clmNo[i]; 463 String val = table.getValue(row,clm); 464 if( nvar[i] ) { 465 val = StringUtil.getReplaceEscape( val ); 466 } 467 // 5.2.1.0 (2010/10/01) useRenderer 対? 468 else if( useRenderer ) { 469 val = StringUtil.spanCut( dbColumn[clm].getRendererValue( val ) ); 470 } 471 472 setRowCellValue( oRow, nColIndex++, val,cellType[i] ); 473 } 474 475 // 余計なセルを削除 476 removeRowCell( oRow, nColIndex ); 477 } 478 } 479 480 /** 481 * Excelの?行??目セルに??タを設定する? 482 * 483 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対? 484 * @og.rev 4.3.4.3 (2008/12/22) protected? 485 * 486 * @param indexOfRow 行?番号 487 * @param indexOfCell セルの番号 488 * @param dataVal String?? 489 * 490 * @return Rowのobject? 491 */ 492 protected Row setFirstCellValue( final int indexOfRow, final int indexOfCell, final String dataVal ) { 493 Row oRow = sheet.getRow( indexOfRow ); 494 if( oRow == null ) { oRow = sheet.createRow( indexOfRow ); } 495 Cell oCell = oRow.getCell( indexOfCell ); 496 if( null == oCell ) { oCell = oRow.createCell( indexOfCell ); } 497 498 RichTextString richText = createHelper.createRichTextString( dataVal ); 499 oCell.setCellValue( richText ); 500 501 return oRow; 502 } 503 504 /** 505 * Excelの?セルに??タを設定する? 506 * 507 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対? 508 * @og.rev 4.3.4.3 (2008/12/22) protected? 509 * 510 * @param oThisRow Row型?オブジェク? 511 * @param indexOfCell セルの番号 512 * @param dataVal String?? 513 * @param cellType [Cell.CELL_TYPE_STRING/Cell.CELL_TYPE_NUMERIC] 514 */ 515 protected void setRowCellValue( final Row oThisRow, final int indexOfCell, final String dataVal,final int cellType ) { 516 Cell oCell = oThisRow.getCell( indexOfCell ); 517 if( null == oCell ) { oCell = oThisRow.createCell( indexOfCell ); } 518 519 if( cellType == Cell.CELL_TYPE_NUMERIC ) { 520 oCell.setCellValue( StringUtil.parseDouble( dataVal ) ); 521 } 522 else { 523 RichTextString richText = createHelper.createRichTextString( dataVal ); 524 oCell.setCellValue( richText ); 525 } 526 } 527 528 /** 529 * Excelの?セルをシートから削除する? 530 * 531 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対? 532 * @og.rev 4.3.4.3 (2008/12/22) protected? 533 * 534 * @param oThisRow Row型?オブジェク? 535 * @param nBegin セルの開始番号 536 */ 537 protected void removeRowCell( final Row oThisRow, final int nBegin ) { 538 int nEnd = oThisRow.getLastCellNum(); 539 for( int nIndex = nBegin; nIndex <= nEnd; nIndex++) { 540 Cell oCell = oThisRow.getCell( nIndex ); 541 if( null != oCell ) { oThisRow.removeCell(oCell); } 542 } 543 } 544 545 /** 546 * Excelの?行をシートから削除する? 547 * 548 * @param oThisSheet Sheet型?オブジェク? 549 * @param nBegin 行?開始番号 550 */ 551 private void removeSheetRow( final Sheet oThisSheet, final int nBegin ) { 552 int nEnd = oThisSheet.getLastRowNum(); 553 for( int nIndex = nBegin; nIndex <= nEnd; nIndex++) { 554 Row oRow = oThisSheet.getRow( nIndex ); 555 if( null != oRow ) { oThisSheet.removeRow(oRow); } 556 } 557 } 558 559 /** 560 * DBTableModelの??タとして書き込?き?シート名をセ?します? 561 * 初期値は?Sheet1" です?同じ名称のシートが存在する場合?そ?シー? 562 * 名?後に(2)?3)のような??をくっ付けます? 563 * 564 * @param workbook Workbookオブジェク? 565 * @param nameSet String??,??シート名 566 * 567 * @return シート名 568 */ 569 protected String getNewSheetNameByName( final Workbook workbook, final String nameSet) { 570 String nameSheet = nameSet; 571 String strAppendix; 572 // POIのソースからみると、シート?名前は30桁文?31個文??思われる? 573 int nMaxLen = 30; 574 int nCount = 1; 575 int nIndex = 0; 576 while( nIndex > -1) { 577 if( nCount >= 2 ) { 578 strAppendix = "(" + Integer.toString(nCount) + ")"; 579 if(nameSet.length() < ( nMaxLen - strAppendix.length()) ) { 580 nameSheet = nameSet + strAppendix; 581 }else { 582 nameSheet = nameSet.substring(0, nMaxLen - strAppendix.length()) + strAppendix; 583 } 584 } 585 nIndex = workbook.getSheetIndex(nameSheet); 586 nCount++; 587 } 588 589 return nameSheet; 590 } 591 592 /** 593 * DBTableModelの??タとして読み込?き?シート名を設定します? 594 * 初期値は?Sheet1" です? 595 * これは、EXCEL追??として実?れて?す? 596 * 597 * @og.rev 3.5.4.2 (2003/12/15) 新規追? 598 * 599 * @param sheetName シート名 600 */ 601 @Override 602 public void setSheetName( final String sheetName ) { 603 if( sheetName != null ) { this.sheetName = sheetName; } 604 } 605 606 /** 607 * EXCEL雛型参?ファイルのシート名を設定します? 608 * これは、EXCEL追??として実?れて?す? 609 * 610 * EXCELファイルを書き?す時に?型として参?するシート名を指定します? 611 * これにより、?の形式?異なるデータを?次書き?した?appendモードを併用)する 612 * こと??シートを?して新規にEXCELを作?する場合にフォー?設定する事が可能になります? 613 * 初期値は、null(第?ー? です? 614 * 615 * @og.rev 3.5.4.3 (2004/01/05) 新規追? 616 * 617 * @param sheetName シート名 618 */ 619 @Override 620 public void setRefSheetName( final String sheetName ) { 621 if( sheetName != null ) { refSheetName = sheetName; } 622 } 623 624 /** 625 * こ?クラスが?EXCEL対応機?を持って?かど?を返します? 626 * 627 * EXCEL対応機?とは、シート名のセ??型参照ファイル名?セ?? 628 * 書き込み?ァイルのFileオブジェクト取得などの、特殊機?です? 629 * 本来は、インターフェースを?けるべきと?ますが、taglib クラス等? 630 * 関係があり、問?わせによる条件?で対応します? 631 * 632 * @og.rev 3.5.4.3 (2004/01/05) 新規追? 633 * 634 * @return EXCEL対応機?を持って?かど?(常に true) 635 */ 636 @Override 637 public boolean isExcel() { 638 return true; 639 } 640 641 /** 642 * 出力?ファイル名をセ?します?(DIR + Filename) 643 * これは、EXCEL追??として実?れて?す? 644 * 645 * @og.rev 3.5.4.3 (2004/01/05) 新規作? 646 * 647 * @param filename EXCEL雛型参?ファイル? 648 */ 649 @Override 650 public void setFilename( final String filename ) { 651 this.filename = filename; 652 } 653 654 /** 655 * EXCEL雛型参?ファイル名をセ?します?(DIR + Filename) 656 * これは、EXCEL追??として実?れて?す? 657 * 658 * @og.rev 3.5.4.3 (2004/01/05) 新規作? 659 * 660 * @param filename EXCEL雛型参?ファイル? 661 */ 662 @Override 663 public void setRefFilename( final String filename ) { 664 refFilename = filename; 665 } 666 667 /** 668 * EXCEL出力時の?ォルトフォント名を設定します? 669 * これは、EXCEL追??として実?れて?す? 670 * 671 * EXCELファイルを書き?す時に、デフォルトフォント名を指定します? 672 * フォント名は、EXCELのフォント名をそのまま使用してください? 673 * ??、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String ) 674 * に設定されます? 675 * 初期値は、シス?リソース の TABLE_WRITER_DEFAULT_FONT_NAME です? 676 * 677 * @og.rev 3.8.5.3 (2006/08/07) 新規追? 678 * 679 * @param fontName ?ォルトフォント名 680 */ 681 @Override 682 public void setFontName( final String fontName ) { 683 this.fontName = fontName ; 684 } 685 686 /** 687 * EXCEL出力時の?ォルトフォント?イント数を設定します? 688 * これは、EXCEL追??として実?れて?す? 689 * 690 * EXCELファイルを書き?す時に、デフォルト?イント数を指定します? 691 * ??、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short ) 692 * に設定されます? 693 * 初期値は、シス?リソース の TABLE_WRITER_DEFAULT_FONT_POINTS です? 694 * 695 * @og.rev 3.8.5.3 (2006/08/07) 新規追? 696 * 697 * @param point ?ォルトフォント?イント数 698 */ 699 @Override 700 public void setFontPoint( final short point ) { 701 fontPoint = point; 702 } 703 704 /** 705 * EXCELファイルのWookbookと?Stream(MicrosoftのOLE用?を作りま? 706 * 条件によって、新規かとファイルから読み込み書き込みかが?れます? 707 * 708 * @param fname EXCEL雛型参?ファイル? 709 * 710 * @return EXCELファイルのWorkbook 711 */ 712 protected Workbook createWorkbook( final String fname ) { 713 final Workbook myWookbook ; 714 FileInputStream fileIn = null; 715 try { 716 fileIn = new FileInputStream(fname); 717 myWookbook = WorkbookFactory.create(fileIn); 718 } 719 catch ( Exception ex ) { 720 String errMsg = "ファイル読込みエラー[" + fname + "]" ; 721 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び?更 722 } 723 finally { 724 Closer.ioClose( fileIn ); // 4.0.0 (2006/01/31) close 処?の IOException を無? 725 } 726 727 return myWookbook; 728 } 729 730 /** 731 * ??名前のファイルを使?ど?確認します? 732 * 733 * @param fname EXCEL雛型参?ファイル? 734 * 735 * @return ??名前のファイルを使?ど? 736 */ 737 private boolean checkAvailabity( final String fname ) { 738 boolean bRet = false; 739 // 4.0.0.0 (2007/11/29) 入れ子if の統? 740 if( isAppend() && null != fname ) { 741 File oFile = new File(fname); 742 if(oFile.exists() && oFile.isFile() && (oFile.length() > 0)) { bRet = true; } 743 } 744 return bRet; 745 } 746 }