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