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.hayabusa.report; 017 018 import org.opengion.fukurou.util.Closer ; 019 import org.opengion.fukurou.util.LogWriter; 020 021 import org.apache.poi.poifs.filesystem.POIFSFileSystem; 022 import org.apache.poi.hssf.eventusermodel.HSSFRequest ; 023 import org.apache.poi.hssf.eventusermodel.HSSFEventFactory; 024 import org.apache.poi.hssf.eventusermodel.HSSFListener ; 025 import org.apache.poi.hssf.record.SSTRecord ; 026 import org.apache.poi.hssf.record.Record ; 027 import org.apache.poi.hssf.record.BOFRecord ; 028 import org.apache.poi.hssf.record.BoundSheetRecord; 029 import org.apache.poi.hssf.record.LabelSSTRecord; 030 import org.apache.poi.hssf.record.UnicodeString; 031 // import org.apache.poi.hssf.record.common.UnicodeString; // X.X.X.X (2012/XX/XX) POI3.0ã®å ´å? 032 033 import java.io.File; 034 import java.io.InputStream; 035 import java.io.FileInputStream; 036 import java.io.IOException; 037 038 /** 039 * ã€EXCELå–込】雛形EXCELシートã?è§£æžå?ç?‚’行ã†ç‚ºã®ã€HSSFListener 拡張クラスã§ã™ã? 040 * ã“ã?オブジェクトã?ã€HSSFRequest クラス㮠addListenerForAllRecords メソãƒ?ƒ‰ã«æ¸¡ã? 041 * HSSFListener インターフェースを実è£?—ã¦ã?¾ã™ã?ã¾ãŸã?雛形EXCEL ã‚’å?ç?¾Œã?ExcelLayout 042 * 管ç?‚¯ãƒ©ã‚¹ã‚’å–å¾—ã™ã‚‹ã“ã¨ãŒå?æ¥ã¾ã™ã? 043 * 044 * @og.rev 3.8.0.0 (2005/06/07) æ–°è¦è¿½åŠ? 045 * @og.group 帳票シスãƒ?ƒ 046 * 047 * @version 4.0 048 * @author Kazuhiko Hasegawa 049 * @since JDK5.0, 050 */ 051 public class HybsHSSFListener implements HSSFListener { 052 private SSTRecord sstrec; 053 private int sheetNo = -1; 054 private int sheetSize = 0; 055 private boolean trace = false; 056 057 private ExcelLayout laynot = null; 058 059 /** 060 * 雛形EXCELã® {@カラãƒ? è§£æžæƒ…å ±ã‚’è¨å®šã—ã¾ã™ã? 061 * 062 * 雛形EXCELã¯ã€HSSFListener を使用ã—ã¦ã€ã‚¤ãƒ™ãƒ³ãƒˆé§?‹•ã§å–å¾—ã—ã¾ã™ã?ãã?å ´åˆã? 063 * {@カラãƒ?ã‚’å«ã‚?‚»ãƒ«ã‚’見ã¤ã‘る都度ã€ã“ã®ãƒ¡ã‚½ãƒ?ƒ‰ã‚’呼ã³å‡ºã—ã¦ã€{@カラãƒ?ã® 064 * ä½ç½®(行å?番å·)ã‚’è¨å®šã—ã¾ã™ã? 065 * ãƒ??ã‚¿EXCELã‹ã‚‰ãƒ??ã‚¿ã‚’èªã¿å‡ºã™å?åˆã?ã€ã“ã“ã§ç™»éŒ²ã—ãŸã‚«ãƒ©ãƒ??行å?よりã€èªã¿è¾¼ã¿ã¾ã™ã? 066 * 具体的ã«ã¯ã€HSSFListener#processRecord( Record )ã§ã€SSTRecord.sid ã® æƒ??ã‚’ã‚ープã—ã¦ãŠãã€? 067 * LabelSSTRecord.sid 毎ã«ã€{@カラãƒ?ã‚’å«ã‚?‹ãƒã‚§ãƒ?‚¯ã—ã?å«ã‚??åˆã«ã€ã“ã®ãƒ¡ã‚½ãƒ?ƒ‰ã« 068 * è§£æžæƒ…å ±ã‚’è¨å®šã—ã¾ã™ã? 069 * 070 * @og.rev 4.3.4.0 (2008/12/01) POI3.2対å¿?引数ã®åž‹å¤‰æ›´(SSTRecord ã® toString() åŒ? 071 * 072 * @param record Recordオブジェクãƒ? 073 */ 074 public void processRecord( final Record record ) { 075 switch ( record.getSid() ) { 076 // Workbook ã§ã® シート毎ã«å‘¼ã°ã‚Œã¾ã™ã?先行ã™ã‚‹ãŸã‚ã?ã“ã?回数をシート数ã¨ã—ã¦æ•°ãˆã¾ã™ã? 077 case BoundSheetRecord.sid: 078 // 4.0.0.0 (2007/11/29) 入れåif ã®çµ±å? 079 if( trace && record instanceof BoundSheetRecord ) { 080 BoundSheetRecord bsr = (BoundSheetRecord) record; 081 System.out.println("Sheet named: " + bsr.getSheetname() ); 082 } 083 sheetSize ++ ; 084 break; 085 // TYPE_WORKSHEET ã®å ´åˆã?シート開始毎ã«å‘¼ã°ã‚Œã¾ã™ã? 086 case BOFRecord.sid: 087 if( record instanceof BOFRecord ) { 088 BOFRecord bof = (BOFRecord) record; 089 if(bof.getType() == BOFRecord.TYPE_WORKBOOK) { 090 if( trace ) { System.out.println("Encountered workbook"); } 091 } 092 else if(bof.getType() == BOFRecord.TYPE_WORKSHEET) { 093 // シート開始毎ã«å‘¼ã°ã‚Œã‚‹ãŸã‚ã€ç¾åœ¨ã®ã‚·ãƒ¼ãƒˆç•ªå·ã‚’å¾—ã‚‹ã®ã«ä½¿ç”¨ã—ã¾ã™ã? 094 sheetNo++ ; 095 if( trace ) { System.out.println("Encountered sheet [" + sheetNo + "]" ); } 096 } 097 } 098 break; 099 // ã™ã¹ã¦ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ã€ä¸?º¦ã?‘呼ã°ã‚Œã¾ã™ã?ã“ã“ã§åˆæœŸåŒ–ã—ã¦ãŠãã¾ã™ã? 100 case SSTRecord.sid: 101 if( record instanceof SSTRecord ) { 102 sstrec = (SSTRecord) record; 103 laynot = new ExcelLayout( sheetSize ); 104 if( trace ) { System.out.println( "SSTRecord:[" + sstrec.getNumUniqueStrings() + "]" ); } 105 // for( int k=0; k<sstrec.getNumUniqueStrings(); k++ ) { 106 // String val = sstrec.getString(k); 107 // System.out.println("SSTRecord id=[" + k + "]=[" + val + "]" ); 108 // } 109 } 110 break; 111 // æ–?—åž‹ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã§ã™ã? 112 case LabelSSTRecord.sid: 113 if( record instanceof LabelSSTRecord ) { 114 LabelSSTRecord lrec = (LabelSSTRecord) record; 115 116 int row = lrec.getRow(); 117 short col = lrec.getColumn(); 118 // POI3.0ã®å ´å? String val = sstrec.getString( lrec.getSSTIndex() ) ; 119 UnicodeString ustr = sstrec.getString( lrec.getSSTIndex() ) ; 120 String val = ustr.getString(); 121 122 // カラãƒ?«ã€{@ã‚’å«ã‚??åˆã?ã€laynot ã«é››å½¢æƒ??を追åŠ?—ã¾ã™ã? 123 // æ•´åˆæ?ãƒã‚§ãƒ?‚¯ã¯ã€ExcelLayoutData クラスã§è¡Œã„ã¾ã™ã? 124 if( val != null && val.indexOf( "{@" ) >= 0 ) { 125 if( trace ) { System.out.println("String cell id,sheet,row,col=[" + lrec.getSSTIndex() + "," + sheetNo + "," + row + "," + col + "] => " + val ); } 126 laynot.addModel( sheetNo,val,row,col ); 127 } 128 } 129 break; 130 default : 131 LogWriter.log( "想定外ã?イベントをå—ã‘å–りã¾ã—ãŸã€?[" + record.getSid() + "]" ); 132 break; 133 } 134 } 135 136 /** 137 * 雛形EXCELシートã? {@カラãƒ? è§£æžãƒ‡ãƒ¼ã‚¿ç®¡ç?‚¯ãƒ©ã‚¹ã‚’è¿”ã—ã¾ã™ã? 138 * 139 * 雛形EXCELã‚’è§£æžã—終ã‚ã£ãŸå¾Œã§ã€è§£æžãƒ‡ãƒ¼ã‚¿ç®¡ç?‚¯ãƒ©ã‚¹ã‚’å–りå?ã—ã¾ã™ã? 140 * 雛形EXCELã¨ã€ãƒ‡ãƒ¼ã‚¿EXCELãŒï¼‘対?‘ã§ã¯ãªã?Ÿã‚ã?リアルタイãƒ??ç?Œå‡ºæ¥ã¾ã›ã‚“ã€? 141 * ä¸?—¦ã€ã™ã¹ã¦ã®é››å½¢EXCELã‚’è§£æžã—終ã‚ã£ãŸå¾Œã§ã€ãƒ‡ãƒ¼ã‚¿EXCEL処ç?‚’行ã†å¿?¦ãŒã‚りã¾ã™ã? 142 * 143 * @return 雛形EXCELシーãƒ? 144 */ 145 public ExcelLayout getLayout() { return laynot; } 146 147 /** 148 * 雛形EXCEL ã®ã‚·ãƒ¼ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã? 149 * 150 * @return 雛形シート数 151 */ 152 public int getSheetSize() { return sheetSize; } 153 154 /** 155 * 処ç?µŒéŽæƒ??を表示ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false) 156 * 157 * イベント毎ã?状æ³ã‚’ã€æ¨™æº–å?力ã«å‡ºåŠ›ã™ã‚‹ã‹ã©ã?‹ã®ãƒ•ラグã§ã™ã? 158 * åˆæœŸå€¤ã¯ã€false ã§ã™ã? 159 * 160 * @param flag 処ç?µŒéŽæƒ??を表示ã™ã‚‹ã‹ã©ã?‹[true/false] 161 */ 162 public void setTrace( final boolean flag ) { trace = flag; } 163 164 /** 165 * EXCELãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆæƒ…å ±ã‚’å–å¾—ã—ã¾ã™ã? 166 * 167 * POIã®ã‚¤ãƒ™ãƒ³ãƒˆå?ç?HSSFListener)ã§ã€å„イベントã”ã¨ã«å‡¦ç?‚’行ã„ã¾ã™ã? 168 * イベントã?ã€BOFRecordã€BoundSheetRecordã€SSTRecordã€LabelSSTRecord ã«ã¤ã?¦ 169 * 発生ã™ã‚‹ã‚ˆã?«è¨å®šã—ã¦ã?¾ã™ã? 170 * 171 * @param file 処ç?™ã‚‹EXCELファイル 172 * @param trace 標準å?力ã«ãƒˆãƒ¬ãƒ¼ã‚¹æƒ??ã‚’å?力ã™ã‚‹ã‹ã©ã?‹ã‚’指定ã—ã¾ã™ã? 173 * 174 * @return EXCELãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆæƒ…å ± 175 * @exception IOException 176 */ 177 public static ExcelLayout makeExcelLayout( final File file ,final boolean trace ) throws IOException { 178 179 FileInputStream fin = null; 180 InputStream din = null; 181 final HybsHSSFListener event ; 182 try { 183 fin = new FileInputStream( file ); 184 POIFSFileSystem poifs = new POIFSFileSystem( fin ); 185 din = poifs.createDocumentInputStream( "Workbook" ); 186 HSSFRequest req = new HSSFRequest(); 187 188 event = new HybsHSSFListener(); 189 event.setTrace( trace ); // 標準å?力ã«ãƒˆãƒ¬ãƒ¼ã‚¹æƒ??ã‚’å?力ã—ã¾ã™ã? 190 191 // req.addListenerForAllRecords( event ); // 全イベントを処ç? 192 req.addListener( event,BOFRecord.sid ); 193 req.addListener( event,BoundSheetRecord.sid ); 194 req.addListener( event,SSTRecord.sid ); 195 req.addListener( event,LabelSSTRecord.sid ); 196 197 HSSFEventFactory factory = new HSSFEventFactory(); 198 factory.processEvents( req,din ); 199 } 200 finally { 201 Closer.ioClose( fin ); // 4.0.0 (2006/01/31) close 処ç?™‚ã® IOException ã‚’ç„¡è¦? 202 Closer.ioClose( din ); // 4.0.0 (2006/01/31) close 処ç?™‚ã® IOException ã‚’ç„¡è¦? 203 // fin.close(); 204 // din.close(); 205 } 206 207 return event.getLayout(); 208 } 209 }