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.7.6.3 (2014/05/23)" ; 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 * @og.rev 5.7.6.3 (2014/05/23) stringOutput対? 420 * 421 * @param table DBTableModelオブジェク? 422 * @param writer PrintWriterオブジェク? 423 */ 424 @Override 425 protected void writeData( final DBTableModel table,final PrintWriter writer ) { 426 int numberOfRows = table.getRowCount(); 427 428 short nColIndex; 429 Row oRow; 430 431 // 5.1.4.0 columns 対応?forループ?、引数i で廻す? 432 boolean[] nvar = new boolean[numberOfColumns]; 433 int[] cellType = new int[numberOfColumns]; 434 for( int i=0; i<numberOfColumns; i++ ) { 435 int clm = clmNo[i]; 436 NativeType nativeType = dbColumn[clm].getNativeType(); 437 switch( nativeType ) { 438 case INT : 439 case LONG : 440 case DOUBLE : 441 cellType[i] = Cell.CELL_TYPE_NUMERIC ; 442 break; 443 case STRING : 444 case CALENDAR : 445 default : 446 cellType[i] = Cell.CELL_TYPE_STRING ; 447 break; 448 } 449 nvar[i] = "NVAR".equals( dbColumn[clm].getDbType()) ; 450 451 // 5.7.6.3 (2014/05/23) ここでレン?時??タイプ判定を行う 452 if( isUseRenderer() && dbColumn[clm].isStringOutput() ){ 453 cellType[i] = Cell.CELL_TYPE_STRING ; 454 } 455 456 } 457 boolean useRenderer = isUseRenderer(); // 5.2.1.0 (2010/10/01) 458 459 for( int row=0; row<numberOfRows; row++ ) { 460 nColIndex = 0; 461 oRow = setFirstCellValue( nRowIndex++, nColIndex++, String.valueOf( row+1 ) ); 462 463 // 5.1.4.0 (2010/03/01) useNumber=false の場合?、nColIndex を?戻す? 464 if( !useNumber ) { 465 nColIndex-- ; 466 } 467 468 for( int i=0; i<numberOfColumns; i++ ) { 469 int clm = clmNo[i]; 470 String val = table.getValue(row,clm); 471 if( nvar[i] ) { 472 val = StringUtil.getReplaceEscape( val ); 473 } 474 // 5.2.1.0 (2010/10/01) useRenderer 対? 475 else if( useRenderer ) { 476 val = StringUtil.spanCut( dbColumn[clm].getRendererValue( val ) ); 477 } 478 479 setRowCellValue( oRow, nColIndex++, val,cellType[i] ); 480 } 481 482 // 余計なセルを削除 483 removeRowCell( oRow, nColIndex ); 484 } 485 } 486 487 /** 488 * Excelの?行??目セルに??タを設定する? 489 * 490 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対? 491 * @og.rev 4.3.4.3 (2008/12/22) protected? 492 * 493 * @param indexOfRow 行?番号 494 * @param indexOfCell セルの番号 495 * @param dataVal String?? 496 * 497 * @return Rowのobject? 498 */ 499 protected Row setFirstCellValue( final int indexOfRow, final int indexOfCell, final String dataVal ) { 500 Row oRow = sheet.getRow( indexOfRow ); 501 if( oRow == null ) { oRow = sheet.createRow( indexOfRow ); } 502 Cell oCell = oRow.getCell( indexOfCell ); 503 if( null == oCell ) { oCell = oRow.createCell( indexOfCell ); } 504 505 RichTextString richText = createHelper.createRichTextString( dataVal ); 506 oCell.setCellValue( richText ); 507 508 return oRow; 509 } 510 511 /** 512 * Excelの?セルに??タを設定する? 513 * 514 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対? 515 * @og.rev 4.3.4.3 (2008/12/22) protected? 516 * @og.rev 5.7.4.1 (2014/03/15) useRenderer対? 517 * @og.rev 5.7.6.3 (2014/05/23) stringOutput対? 518 * 519 * @param oThisRow Row型?オブジェク? 520 * @param indexOfCell セルの番号 521 * @param dataVal String?? 522 * @param cellType [Cell.CELL_TYPE_STRING/Cell.CELL_TYPE_NUMERIC] 523 */ 524 protected void setRowCellValue( final Row oThisRow, final int indexOfCell, final String dataVal,final int cellType ) { 525 Cell oCell = oThisRow.getCell( indexOfCell ); 526 if( null == oCell ) { oCell = oThisRow.createCell( indexOfCell ); } 527 528 // 5.7.4.1 (2014/03/15) useRendererがtrueの場合?double変換をかけな? 529 // 5.7.6.3 (2014/05/23) 判定方法変更(stringOutputを利用?? 530 // if( cellType == Cell.CELL_TYPE_NUMERIC ) { 531 // if( !isUseRenderer() && cellType == Cell.CELL_TYPE_NUMERIC ) { 532 if( cellType == Cell.CELL_TYPE_NUMERIC ) { 533 oCell.setCellValue( StringUtil.parseDouble( dataVal ) ); 534 } 535 else { 536 RichTextString richText = createHelper.createRichTextString( dataVal ); 537 oCell.setCellValue( richText ); 538 } 539 } 540 541 /** 542 * Excelの?セルをシートから削除する? 543 * 544 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対? 545 * @og.rev 4.3.4.3 (2008/12/22) protected? 546 * 547 * @param oThisRow Row型?オブジェク? 548 * @param nBegin セルの開始番号 549 */ 550 protected void removeRowCell( final Row oThisRow, final int nBegin ) { 551 int nEnd = oThisRow.getLastCellNum(); 552 for( int nIndex = nBegin; nIndex <= nEnd; nIndex++) { 553 Cell oCell = oThisRow.getCell( nIndex ); 554 if( null != oCell ) { oThisRow.removeCell(oCell); } 555 } 556 } 557 558 /** 559 * Excelの?行をシートから削除する? 560 * 561 * @param oThisSheet Sheet型?オブジェク? 562 * @param nBegin 行?開始番号 563 */ 564 private void removeSheetRow( final Sheet oThisSheet, final int nBegin ) { 565 int nEnd = oThisSheet.getLastRowNum(); 566 for( int nIndex = nBegin; nIndex <= nEnd; nIndex++) { 567 Row oRow = oThisSheet.getRow( nIndex ); 568 if( null != oRow ) { oThisSheet.removeRow(oRow); } 569 } 570 } 571 572 /** 573 * DBTableModelの??タとして書き込?き?シート名をセ?します? 574 * 初期値は?Sheet1" です?同じ名称のシートが存在する場合?そ?シー? 575 * 名?後に(2)?3)のような??をくっ付けます? 576 * 577 * @param workbook Workbookオブジェク? 578 * @param nameSet String??,??シート名 579 * 580 * @return シート名 581 */ 582 protected String getNewSheetNameByName( final Workbook workbook, final String nameSet) { 583 String nameSheet = nameSet; 584 String strAppendix; 585 // POIのソースからみると、シート?名前は30桁文?31個文??思われる? 586 int nMaxLen = 30; 587 int nCount = 1; 588 int nIndex = 0; 589 while( nIndex > -1) { 590 if( nCount >= 2 ) { 591 strAppendix = "(" + Integer.toString(nCount) + ")"; 592 if(nameSet.length() < ( nMaxLen - strAppendix.length()) ) { 593 nameSheet = nameSet + strAppendix; 594 }else { 595 nameSheet = nameSet.substring(0, nMaxLen - strAppendix.length()) + strAppendix; 596 } 597 } 598 nIndex = workbook.getSheetIndex(nameSheet); 599 nCount++; 600 } 601 602 return nameSheet; 603 } 604 605 /** 606 * DBTableModelの??タとして読み込?き?シート名を設定します? 607 * 初期値は?Sheet1" です? 608 * これは、EXCEL追??として実?れて?す? 609 * 610 * @og.rev 3.5.4.2 (2003/12/15) 新規追? 611 * 612 * @param sheetName シート名 613 */ 614 @Override 615 public void setSheetName( final String sheetName ) { 616 if( sheetName != null ) { this.sheetName = sheetName; } 617 } 618 619 /** 620 * EXCEL雛型参?ファイルのシート名を設定します? 621 * これは、EXCEL追??として実?れて?す? 622 * 623 * EXCELファイルを書き?す時に?型として参?するシート名を指定します? 624 * これにより、?の形式?異なるデータを?次書き?した?appendモードを併用)する 625 * こと??シートを?して新規にEXCELを作?する場合にフォー?設定する事が可能になります? 626 * 初期値は、null(第?ー? です? 627 * 628 * @og.rev 3.5.4.3 (2004/01/05) 新規追? 629 * 630 * @param sheetName シート名 631 */ 632 @Override 633 public void setRefSheetName( final String sheetName ) { 634 if( sheetName != null ) { refSheetName = sheetName; } 635 } 636 637 /** 638 * こ?クラスが?EXCEL対応機?を持って?かど?を返します? 639 * 640 * EXCEL対応機?とは、シート名のセ??型参照ファイル名?セ?? 641 * 書き込み?ァイルのFileオブジェクト取得などの、特殊機?です? 642 * 本来は、インターフェースを?けるべきと?ますが、taglib クラス等? 643 * 関係があり、問?わせによる条件?で対応します? 644 * 645 * @og.rev 3.5.4.3 (2004/01/05) 新規追? 646 * 647 * @return EXCEL対応機?を持って?かど?(常に true) 648 */ 649 @Override 650 public boolean isExcel() { 651 return true; 652 } 653 654 /** 655 * 出力?ファイル名をセ?します?(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 setFilename( final String filename ) { 664 this.filename = filename; 665 } 666 667 /** 668 * EXCEL雛型参?ファイル名をセ?します?(DIR + Filename) 669 * これは、EXCEL追??として実?れて?す? 670 * 671 * @og.rev 3.5.4.3 (2004/01/05) 新規作? 672 * 673 * @param filename EXCEL雛型参?ファイル? 674 */ 675 @Override 676 public void setRefFilename( final String filename ) { 677 refFilename = filename; 678 } 679 680 /** 681 * EXCEL出力時の?ォルトフォント名を設定します? 682 * これは、EXCEL追??として実?れて?す? 683 * 684 * EXCELファイルを書き?す時に、デフォルトフォント名を指定します? 685 * フォント名は、EXCELのフォント名をそのまま使用してください? 686 * ??、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String ) 687 * に設定されます? 688 * 初期値は、シス?リソース の TABLE_WRITER_DEFAULT_FONT_NAME です? 689 * 690 * @og.rev 3.8.5.3 (2006/08/07) 新規追? 691 * 692 * @param fontName ?ォルトフォント名 693 */ 694 @Override 695 public void setFontName( final String fontName ) { 696 this.fontName = fontName ; 697 } 698 699 /** 700 * EXCEL出力時の?ォルトフォント?イント数を設定します? 701 * これは、EXCEL追??として実?れて?す? 702 * 703 * EXCELファイルを書き?す時に、デフォルト?イント数を指定します? 704 * ??、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short ) 705 * に設定されます? 706 * 初期値は、シス?リソース の TABLE_WRITER_DEFAULT_FONT_POINTS です? 707 * 708 * @og.rev 3.8.5.3 (2006/08/07) 新規追? 709 * 710 * @param point ?ォルトフォント?イント数 711 */ 712 @Override 713 public void setFontPoint( final short point ) { 714 fontPoint = point; 715 } 716 717 /** 718 * EXCELファイルのWookbookと?Stream(MicrosoftのOLE用?を作りま? 719 * 条件によって、新規かとファイルから読み込み書き込みかが?れます? 720 * 721 * @param fname EXCEL雛型参?ファイル? 722 * 723 * @return EXCELファイルのWorkbook 724 */ 725 protected Workbook createWorkbook( final String fname ) { 726 final Workbook myWookbook ; 727 FileInputStream fileIn = null; 728 try { 729 fileIn = new FileInputStream(fname); 730 myWookbook = WorkbookFactory.create(fileIn); 731 } 732 catch ( Exception ex ) { 733 String errMsg = "ファイル読込みエラー[" + fname + "]" ; 734 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び?更 735 } 736 finally { 737 Closer.ioClose( fileIn ); // 4.0.0 (2006/01/31) close 処?の IOException を無? 738 } 739 740 return myWookbook; 741 } 742 743 /** 744 * ??名前のファイルを使?ど?確認します? 745 * 746 * @param fname EXCEL雛型参?ファイル? 747 * 748 * @return ??名前のファイルを使?ど? 749 */ 750 private boolean checkAvailabity( final String fname ) { 751 boolean bRet = false; 752 // 4.0.0.0 (2007/11/29) 入れ子if の統? 753 if( isAppend() && null != fname ) { 754 File oFile = new File(fname); 755 if(oFile.exists() && oFile.isFile() && (oFile.length() > 0)) { bRet = true; } 756 } 757 return bRet; 758 } 759 }