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 }