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 }