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.PrintWriter; 019 020 import org.odftoolkit.odfdom.OdfFileDom; 021 import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument; 022 import org.odftoolkit.odfdom.doc.office.OdfOfficeAutomaticStyles; 023 import org.odftoolkit.odfdom.doc.office.OdfOfficeSpreadsheet; 024 import org.odftoolkit.odfdom.doc.table.OdfTable; 025 import org.odftoolkit.odfdom.doc.table.OdfTableCell; 026 import org.odftoolkit.odfdom.doc.table.OdfTableRow; 027 import org.odftoolkit.odfdom.doc.text.OdfTextParagraph; 028 import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute; 029 import org.opengion.fukurou.model.NativeType; 030 import org.opengion.fukurou.util.StringUtil; 031 import org.opengion.hayabusa.common.HybsSystemException; 032 import org.opengion.hayabusa.db.DBTableModel; 033 import org.w3c.dom.Node; 034 035 /** 036 * Calcファイルの書き?しクラスです? 037 * 038 * DefaultTableWriter を継承して?す?で?ラベル?名前,データの出力部のみ 039 * オーバ?ライドして?OpenOfficeのCalcファイルの出力機?を実現して?す? 040 * 041 * @og.group ファイル出? 042 * 043 * @version 5.0 044 * @author Hiroki Nakamura 045 * @since JDK6.0, 046 */ 047 public class TableWriter_Calc extends TableWriter_Default { 048 //* こ?プログラ??VERSION??を設定します? {@value} */ 049 private static final String VERSION = "5.5.2.6 (2012/05/25)" ; 050 051 protected OdfSpreadsheetDocument wb = null; 052 protected OdfTable sheet = null; 053 protected OdfFileDom contentDom = null; 054 protected OdfOfficeSpreadsheet officeSpreadsheet = null; 055 protected OdfOfficeAutomaticStyles contentAutoStyles = null; 056 057 protected boolean useNumber = true; 058 059 private String sheetName = "Sheet1"; 060 private String refSheetName = null; 061 private String filename = null; 062 private String refFilename = null; 063 // private String fontName = null; // 現時点では未使用 064 // private short fontPoint = -1; // 現時点では未使用 065 066 /** 067 * DBTableModel から ?式???タを作?して,PrintWriter に書き?します? 068 * こ?メソ?は、Calc 書き?し時に使用します? 069 * 070 * @see #isExcel() 071 */ 072 @Override 073 public void writeDBTable() { 074 if( !createDBColumn() ) { return; } 075 076 useNumber = isUseNumber(); 077 078 if( filename == null ) { 079 String errMsg = "ファイルが指定されて?せん?; 080 throw new HybsSystemException( errMsg ); 081 } 082 083 /* 以下?未実?***********************************************/ 084 if( isAppend() ) { 085 String errMsg = "Calcの場合?Append利用できません?; 086 throw new HybsSystemException( errMsg ); 087 } 088 089 if( ( refFilename != null && refFilename.length() > 0 ) || ( refSheetName != null && refSheetName.length() >= 0 ) ) { 090 String errMsg = "Calcの場合?,refFilenamerefSheetName利用できません?; 091 throw new HybsSystemException( errMsg ); 092 } 093 094 // if( fontName != null && fontName.length() > 0 ) { 095 // String errMsg = "Calcの場合?fontNameは、利用できません?; 096 // throw new HybsSystemException( errMsg ); 097 // System.err.println( errMsg ); 098 // } 099 100 // if( fontPoint >= 0 ) { 101 // String errMsg = "Calcの場合?fontPointは、利用できません?; 102 // throw new HybsSystemException( errMsg ); 103 // System.err.println( errMsg ); 104 // } 105 /* *************************************************************/ 106 107 // 新規?場? 108 try { 109 wb = OdfSpreadsheetDocument.newSpreadsheetDocument(); 110 // コン???ルートとDOMを取? 111 contentDom = wb.getContentDom(); 112 officeSpreadsheet = wb.getContentRoot(); 113 contentAutoStyles = contentDom.getOrCreateAutomaticStyles(); 114 115 // ?ォルトで用意されて?ノ?ドを削除 116 Node childNode = officeSpreadsheet.getFirstChild(); 117 while( childNode != null ) { 118 officeSpreadsheet.removeChild( childNode ); 119 childNode = officeSpreadsheet.getFirstChild(); 120 } 121 } 122 catch( Exception ex ) { 123 String errMsg = "Calcの?宣?できません?; 124 throw new HybsSystemException( errMsg, ex ); 125 } 126 127 //?ォルトで用意されて?Styles調整 128 resetAutoStylesAndMasterStyles(); 129 130 sheet = new OdfTable( contentDom ); 131 sheet.setTableNameAttribute( sheetName ); 132 133 super.writeDBTable( null ); 134 135 officeSpreadsheet.appendChild( sheet ); 136 137 try { 138 wb.save( filename ); 139 wb.close(); 140 } 141 catch( Exception ex ) { 142 String errMsg = "Calcの?saveができません?; 143 throw new HybsSystemException( errMsg, ex ); 144 } 145 finally { 146 if( null != sheet ) { sheet = null; } 147 if( null != wb ) { wb = null; } 148 } 149 } 150 151 /** 152 * DBTableModel から ??タを作?して,PrintWriter に書き?します? 153 * 154 * @param writer PrintWriterオブジェク? 155 */ 156 @Override 157 public void writeDBTable( final PrintWriter writer ) { 158 String errMsg = "こ?クラスでは実?れて?せん?; 159 throw new UnsupportedOperationException( errMsg ); 160 } 161 162 /** 163 * PrintWriter に DBTableModelのラベル??を書き込みます? 164 * 第?ラ?は、ラベル??を示?"#Label" を書き込みます? 165 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 166 * 167 * @param table DBTableModelオブジェク? 168 * @param writer PrintWriterオブジェク? 169 */ 170 @Override 171 protected void writeLabel( final DBTableModel table, final PrintWriter writer ) { 172 OdfTableRow row = new OdfTableRow( contentDom ); 173 174 if( useNumber ) { 175 row.appendCell( createTextCell( contentDom, "#Label", false, false ) ); 176 } 177 178 for( int i = 0; i < numberOfColumns; i++ ) { 179 int clm = clmNo[i]; 180 String val = dbColumn[clm].getLabel(); 181 if( i == 0 && !useNumber ) { 182 val = "#" + val; 183 } 184 row.appendCell( createTextCell( contentDom, val, false, false ) ); 185 } 186 row.setStyleName( "ro1" ); 187 sheet.appendRow( row ); 188 } 189 190 /** 191 * PrintWriter に DBTableModelの?名情報を書き込みます? 192 * 第?ラ?は??目名情報を示?"#Name" を書き込みます? 193 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 194 * 195 * @param table DBTableModelオブジェク? 196 * @param writer PrintWriterオブジェク? 197 */ 198 @Override 199 protected void writeName( final DBTableModel table, final PrintWriter writer ) { 200 OdfTableRow row = new OdfTableRow( contentDom ); 201 202 if( useNumber ) { 203 row.appendCell( createTextCell( contentDom, "#Name", false, false ) ); 204 } 205 206 for( int i = 0; i < numberOfColumns; i++ ) { 207 int clm = clmNo[i]; 208 String val = table.getColumnName( clm ); 209 if( i == 0 && !useNumber ) { 210 val = "#" + val; 211 } 212 row.appendCell( createTextCell( contentDom, val, false, false ) ); 213 } 214 row.setStyleName( "ro1" ); 215 sheet.appendRow( row ); 216 } 217 218 /** 219 * PrintWriter に DBTableModelのサイズ??を書き込みます? 220 * 第?ラ?は、サイズ??を示?"#Size" を書き込みます? 221 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 222 * 223 * @param table DBTableModelオブジェク? 224 * @param writer PrintWriterオブジェク? 225 */ 226 @Override 227 protected void writeSize( final DBTableModel table, final PrintWriter writer ) { 228 OdfTableRow row = new OdfTableRow( contentDom ); 229 230 if( useNumber ) { 231 row.appendCell( createTextCell( contentDom, "#Size", false, false ) ); 232 } 233 234 for( int i = 0; i < numberOfColumns; i++ ) { 235 int clm = clmNo[i]; 236 String val = String.valueOf( dbColumn[clm].getTotalSize() ); 237 if( i == 0 && !useNumber ) { 238 val = "#" + val; 239 } 240 row.appendCell( createTextCell( contentDom, val, true, false ) ); 241 } 242 row.setStyleName( "ro1" ); 243 sheet.appendRow( row ); 244 } 245 246 /** 247 * PrintWriter に DBTableModelのクラス名情報を書き込みます? 248 * 第?ラ?は、サイズ??を示?"#Class" を書き込みます? 249 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 250 * 251 * @param table DBTableModelオブジェク? 252 * @param writer PrintWriterオブジェク? 253 */ 254 @Override 255 protected void writeClass( final DBTableModel table, final PrintWriter writer ) { 256 OdfTableRow row = new OdfTableRow( contentDom ); 257 258 if( useNumber ) { 259 row.appendCell( createTextCell( contentDom, "#Class", false, false ) ); 260 } 261 262 for( int i = 0; i < numberOfColumns; i++ ) { 263 int clm = clmNo[i]; 264 String val = dbColumn[clm].getClassName(); 265 if( i == 0 && !useNumber ) { 266 val = "#" + val; 267 } 268 row.appendCell( createTextCell( contentDom, val, false, false ) ); 269 } 270 row.setStyleName( "ro1" ); 271 sheet.appendRow( row ); 272 } 273 274 /** 275 * PrintWriter に セパレーターを書き込みます? 276 * 第?ラ?は、サイズ??を示?"#----" を書き込みます? 277 * こ?行?、?力形式に無関係に、TableWriter.TAB_SEPARATOR で区?れます? 278 * 279 * @param table DBTableModelオブジェク? 280 * @param writer PrintWriterオブジェク? 281 */ 282 @Override 283 protected void writeSeparator( final DBTableModel table, final PrintWriter writer ) { 284 String sep = "----"; 285 286 OdfTableRow row = new OdfTableRow( contentDom ); 287 row.appendCell( createTextCell( contentDom, "#----", false, false ) ); 288 for( int i = 0; i < numberOfColumns; i++ ) { 289 if( i == 0 && !useNumber ) { 290 continue; 291 } 292 row.appendCell( createTextCell( contentDom, sep, false, false ) ); 293 } 294 sheet.appendRow( row ); 295 } 296 297 /** 298 * PrintWriter に DBTableModelの??ブル??を書き込みます? 299 * こ?クラスでは?データ??ルコー??ション(")で囲みます? 300 * PrintWriter に DBTableModelの??ブル??を書き込みます? 301 * 302 * @og.rev 5.2.1.0 (2010/10/01) useRenderer 対? 303 * 304 * @param table DBTableModelオブジェク? 305 * @param writer PrintWriterオブジェク? 306 */ 307 @Override 308 protected void writeData( final DBTableModel table,final PrintWriter writer ) { 309 int numberOfRows = table.getRowCount(); 310 311 boolean[] nvar = new boolean[numberOfColumns]; 312 boolean[] cellType = new boolean[numberOfColumns]; 313 for( int i=0; i<numberOfColumns; i++ ) { 314 int clm = clmNo[i]; 315 NativeType nativeType = dbColumn[clm].getNativeType(); 316 switch( nativeType ) { 317 case INT : 318 case LONG : 319 case DOUBLE : 320 cellType[i] = true ; 321 break; 322 case STRING : 323 case CALENDAR : 324 default : 325 cellType[i] = false ; 326 break; 327 } 328 nvar[i] = "NVAR".equals( dbColumn[clm].getDbType() ); 329 } 330 boolean useRenderer = isUseRenderer(); // 5.2.1.0 (2010/10/01) 331 332 for( int r = 0; r < numberOfRows; r++ ) { 333 OdfTableRow row = new OdfTableRow( contentDom ); 334 335 if( useNumber ) { 336 row.appendCell( createTextCell( contentDom, String.valueOf( r + 1 ), true, true ) ); 337 } 338 339 for( int i = 0; i < numberOfColumns; i++ ) { 340 int clm = clmNo[i]; 341 String val = table.getValue( r, clm ); 342 if( nvar[i] ) { 343 val = StringUtil.getReplaceEscape( val ); 344 } 345 // 5.2.1.0 (2010/10/01) useRenderer 対? 346 else if( useRenderer ) { 347 val = StringUtil.spanCut( dbColumn[clm].getRendererValue( val ) ); 348 } 349 row.appendCell( createTextCell( contentDom, val, cellType[i], false ) ); 350 } 351 row.setStyleName( "ro1" ); 352 sheet.appendRow( row ); 353 } 354 } 355 356 /** 357 * ?ストコン??のセルを生成す? 358 * 359 * @param contentDom OdfFileDomオブジェク? 360 * @param content コン?? 361 * @param isCellTypeNumber [true:数字型/false:?型] 362 * @param isNumberList [true:数字リス?999/false:通常] 363 * 364 * @return OpenOfficeのセル??ブルオブジェク? 365 */ 366 protected OdfTableCell createTextCell( final OdfFileDom contentDom, 367 final String content, 368 final Boolean isCellTypeNumber, 369 final Boolean isNumberList ) { 370 OdfTableCell cell = new OdfTableCell( contentDom ); 371 if( isCellTypeNumber ) { 372 cell.setOfficeValueAttribute( Double.parseDouble( content ) ); 373 cell.setOfficeValueTypeAttribute( OfficeValueTypeAttribute.Value.FLOAT.toString() ); 374 } 375 else { 376 cell.setOfficeValueTypeAttribute( OfficeValueTypeAttribute.Value.STRING.toString() ); 377 } 378 OdfTextParagraph paragraph = new OdfTextParagraph( contentDom, null, content ); 379 cell.appendChild( paragraph ); 380 return cell; 381 } 382 383 /** 384 * ?ォルトで用意されて?Stylesを調整します? 385 * ※ここでは何もしません? 386 * 387 */ 388 protected void resetAutoStylesAndMasterStyles(){ 389 // Document empty method 対? 390 } 391 392 /** 393 * DBTableModelの??タとして読み込?き?シート名を設定します? 394 * 初期値は?Sheet1" です? 395 * これは、Calc追??として実?れて?す? 396 * 397 * @param sheetName シート名 398 */ 399 @Override 400 public void setSheetName( final String sheetName ) { 401 if( sheetName != null ) { 402 this.sheetName = sheetName; 403 } 404 } 405 406 /** 407 * Calc雛型参?ファイルのシート名を設定します? 408 * これは、Calc追??として実?れて?す? 409 * 410 * Calcファイルを書き?す時に?型として参?するシート名を指定します? 411 * これにより、?の形式?異なるデータを?次書き?した?appendモードを併用)する 412 * こと??シートを?して新規にCalcを作?する場合にフォー?設定する事が可能になります? 413 * 初期値は、null(第?ー? です? 414 * 415 * @param sheetName シート名 416 */ 417 @Override 418 public void setRefSheetName( final String sheetName ) { 419 if( sheetName != null ) { 420 refSheetName = sheetName; 421 } 422 } 423 424 /** 425 * こ?クラスが?Calc対応機?(=Excel対応機?)を持って?かど?を返します? 426 * 427 * Calc対応機?とは、シート名のセ??型参照ファイル名?セ?? 428 * 書き込み?ァイルのFileオブジェクト取得などの、特殊機?です? 429 * 本来は、インターフェースを?けるべきと?ますが、taglib クラス等? 430 * 関係があり、問?わせによる条件?で対応します? 431 * 432 * @return Calc対応機?(=Excel対応機?)を持って?かど?(true 固? 433 */ 434 @Override 435 public boolean isExcel() { 436 return true; 437 } 438 439 /** 440 * 出力?ファイル名をセ?します?(DIR + Filename) 441 * これは、Calc追??として実?れて?す? 442 * 443 * @param filename Calc雛型参?ファイル? 444 */ 445 @Override 446 public void setFilename( final String filename ) { 447 this.filename = filename; 448 } 449 450 /** 451 * Calc雛型参?ファイル名をセ?します?(DIR + Filename) 452 * これは、Calc追??として実?れて?す? 453 * 454 * @param filename Calc雛型参?ファイル? 455 */ 456 @Override 457 public void setRefFilename( final String filename ) { 458 refFilename = filename; 459 } 460 461 /** 462 * Calc出力時の?ォルトフォント名を設定します? 463 * Calcの場合?fontNameは、利用できません? 464 * 465 * Calcファイルを書き?す時に、デフォルトフォント名を指定します? 466 * フォント名は、Calcのフォント名をそのまま使用してください? 467 * に設定されます? 468 * 初期値は、シス?リソース の TABLE_WRITER_DEFAULT_FONT_NAME です? 469 * 470 * @og.rev 5.5.2.6 (2012/05/25) findbugs対? 471 * 472 * @param fontName ?ォルトフォント名 473 */ 474 @Override 475 public void setFontName( final String fontName ) { 476 // this.fontName = fontName ; 477 String errMsg = "Calcの場合?fontNameは、利用できません。fontName=[" + fontName + "]"; 478 System.err.println( errMsg ); 479 } 480 481 /** 482 * Calc出力時の?ォルトフォント?イント数を設定します? 483 * Calcの場合?fontPointは、利用できません? 484 * 485 * Calcファイルを書き?す時に、デフォルト?イント数を指定します? 486 * に設定されます? 487 * 初期値は、シス?リソース の TABLE_WRITER_DEFAULT_FONT_POINTS です? 488 * 489 * @og.rev 5.5.2.6 (2012/05/25) findbugs対? 490 * 491 * @param point ?ォルトフォント?イント数 492 */ 493 @Override 494 public void setFontPoint( final short point ) { 495 // fontPoint = point; 496 String errMsg = "Calcの場合?fontPointは、利用できません。fontPoint=[" + point + "]"; 497 System.err.println( errMsg ); 498 } 499 }