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 }