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.BufferedReader;
019 import java.io.IOException;
020 import java.io.InputStream;
021 import java.util.ArrayList;
022 import java.util.List;
023 import java.util.zip.ZipEntry;
024 import java.util.zip.ZipFile;
025
026 import javax.xml.parsers.DocumentBuilder;
027 import javax.xml.parsers.DocumentBuilderFactory;
028 import javax.xml.parsers.ParserConfigurationException;
029
030 import org.opengion.fukurou.util.StringUtil;
031 import org.opengion.fukurou.util.Closer; // 5.5.2.6 (2012/05/25)
032 import org.opengion.hayabusa.common.HybsSystem;
033 import org.opengion.hayabusa.common.HybsSystemException;
034 import org.opengion.hayabusa.db.DBTableModelUtil;
035 import org.w3c.dom.Document;
036 import org.w3c.dom.Element;
037 import org.w3c.dom.NodeList;
038 import org.xml.sax.SAXException;
039
040 /**
041 * XMLパã?サã«ã‚ˆã‚‹ã€OpenOffice.org Calcã®è¡¨è¨ˆç®—ドã‚ュメントファイルをèªã¿å–る実è£?‚¯ãƒ©ã‚¹ã§ã™ã?
042 *
043 * â‘?‚«ãƒ©ãƒ?ãŒæŒ‡å®šã•れã¦ã?‚‹å ´å?
044 * #NAMEã§å§‹ã¾ã‚‹è¡Œã‚’検索ã—ã?ãã?行ã?ãれãžã‚Œã®å€¤ã‚’カラãƒ?ã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
045 * #NAMEã§å§‹ã¾ã‚‹è¡Œã‚ˆã‚Šä»¥å‰ã?行ã«ã¤ã?¦ã¯ã€å?ã¦ç„¡è¦–ã•れã¾ã™ã?
046 * ã¾ãŸã?#NAMEよりå‰ã?カラãƒ?Šã³ã€?NAMEã®è¡Œã?値ãŒNULL(カラãƒ?ãŒè¨å®šã•れã¦ã?ªã?カラãƒ?‚‚
047 * 無視ã—ã¾ã™ã?
048 * èªã¿é£›ã?ã•れãŸã‚«ãƒ©ãƒ??ã«å…¥åŠ›ã•れãŸå€¤ã¯å–り込ã¾ã‚Œã¾ã›ã‚“ã€?
049 * ã¾ãŸã?#NAME行以é™ã?#ã§å§‹ã¾ã‚‹è¡Œã?ã€ã‚³ãƒ¡ãƒ³ãƒˆè¡Œã¨ã¿ãªã•れ処ç?•れã¾ã›ã‚“ã€?
050 *
051 * ②カラãƒ?ãŒæŒ‡å®šã•れã¦ã?‚‹å ´å?
052 * æŒ?®šã•れãŸã‚«ãƒ©ãƒ?ã«åŸºã¥ãã?値をå–り込ã¿ã¾ã™ã?
053 * カラãƒ?ã®é ?•ªã¨ã€ã‚·ãƒ¼ãƒˆã«è¨˜è¿°ã•れã¦ã?‚‹å€¤ã®é ?•ªã¯ä¸??ã—ã¦ã?‚‹å¿?¦ãŒã‚りã¾ã™ã?
054 * æŒ?®šã•れãŸã‚«ãƒ©ãƒ?•°ã‚’è¶?ˆã‚‹å?ã®å€¤ã«ã¤ã?¦ã¯å…¨ã¦ç„¡è¦–ã•れã¾ã™ã?
055 * #ã§å§‹ã¾ã‚‹è¡Œã?ã€ã‚³ãƒ¡ãƒ³ãƒˆè¡Œã¨ã¿ãªã•れ処ç?•れã¾ã›ã‚“ã€?
056 *
057 * ã¾ãŸã?ã?šã‚Œã?å ´åˆã‚‚å…¨ãデータãŒå˜åœ¨ã—ã¦ã?ªã?¡Œã?èªã¿é£›ã?ã•れã¾ã™ã?
058 *
059 * @og.group ファイル入�
060 *
061 * @version 4.0
062 * @author Hiroki Nakamura
063 * @since JDK5.0,
064 */
065 public class TableReader_Calc extends TableReader_Default {
066 // * ã“ã?プãƒã‚°ãƒ©ãƒ??VERSIONæ–?—å?ã‚’è¨å®šã—ã¾ã™ã? {@value} */
067 private static final String VERSION = "5.5.7.2 (2012/10/09)";
068
069 private String sheetName = null;
070 private String sheetNos = null; // 5.5.7.2 (2012/10/09)
071 private String filename = null;
072 private int numberOfRows = 0;
073 private int firstClmIdx = 0;
074 private int[] valueClmIdx = null;
075
076 /**
077 * DBTableModel ã‹ã‚‰ å?½¢å¼ã?ãƒ??タを作æ?ã—ã¦,BufferedReader よりèªã¿å–りã¾ã™ã?
078 * コメンãƒ?空行を除ãã?æœ??ã®è¡Œã?ã€??ç›®åãŒå¿?¦ã§ã™ã?
079 * (ä½?—ã€ã‚«ãƒ©ãƒ?を指定ã™ã‚‹ã“ã¨ã§ã€??ç›®åã‚’çœç•¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã?
080 * ãれ以é™ã?ã€ã‚³ãƒ¡ãƒ³ãƒ?空行を除ãã?ãƒ??ã‚¿ã¨ã—ã¦èªã¿è¾¼ã‚“ã§ã?ã¾ã™ã?
081 * ã“ã?メソãƒ?ƒ‰ã¯ã€Calc èªã¿è¾¼ã¿æ™‚ã«ä½¿ç”¨ã—ã¾ã™ã?
082 *
083 * @og.rev 4.3.5.0 (2009/02/01) toArray ã™ã‚‹ã¨ãã«ã€ã‚µã‚¤ã‚ºã®åˆæœŸå€¤æŒ?®šã‚’追åŠ?
084 * @og.rev 5.5.7.2 (2012/10/09) sheetNos 追åŠ?«ã‚ˆã‚‹è¤?•°ã‚·ãƒ¼ãƒˆã?マã?ジèªã¿å–りサãƒã?ãƒ?
085 *
086 * @see #isExcel()
087 */
088 @Override
089 public void readDBTable() {
090
091 ZipFile zipFile = null;
092 boolean errFlag = false; // 5.0.0.1 (2009/08/15) finally ブãƒãƒ?‚¯ã® throw ã‚’é¿ã‘ã‚‹ã€?
093 try {
094 // OpenOffice.org odsファイルを開ã?
095 zipFile = new ZipFile( filename );
096
097 ZipEntry entry = zipFile.getEntry( "content.xml" );
098 if ( null == entry ) {
099 String errMsg = "ODSファイルä¸ã«ãƒ•ァイルcontent.xmlãŒå˜åœ¨ã—ã¾ã›ã‚“ã€?;
100 throw new HybsSystemException( errMsg );
101 }
102
103 // content.xmlをパースã—ã?行ã?列å˜ä½ã?オブジェクトã«åˆ?§£ã—ã¾ã™ã?
104 DomOdsParser odsParser = new DomOdsParser();
105 // odsParser.doParse( zipFile.getInputStream( entry ), sheetName );
106 odsParser.doParse( zipFile.getInputStream( entry ), sheetName , sheetNos ); // 5.5.7.2 (2012/10/09) sheetNos 対�
107 List<RowInfo> rowInfoList = odsParser.getRowInfoList();
108
109 // 4.3.5.0 (2009/02/01) toArray ã™ã‚‹ã¨ãã«ã€ã‚µã‚¤ã‚ºã®åˆæœŸå€¤æŒ?®šã‚’追åŠ?
110 // makeDBTableModel( rowInfoList.toArray( new RowInfo[0] ) );
111 makeDBTableModel( rowInfoList.toArray( new RowInfo[rowInfoList.size()] ) );
112 }
113 catch ( IOException ex ) {
114 String errMsg = "ファイルèªè¾¼ã¿ã‚¨ãƒ©ãƒ¼[" + filename + "]";
115 throw new HybsSystemException( errMsg, ex );
116 }
117 finally {
118 // 5.5.2.6 (2012/05/25) fukurou.util.Closer#zipClose( ZipFile ) を利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ£ã€?
119 errFlag = ! Closer.zipClose( zipFile ); // OK ã®å ´åˆã?true ãªã®ã§ã€å転ã—ã¦ãŠãã€?
120 // if ( null != zipFile ) {
121 // try {
122 // zipFile.close();
123 // }
124 // catch ( IOException ex ) {
125 // errFlag = true;
126 // }
127 // }
128 }
129
130 if( errFlag ) {
131 String errMsg = "ODSファイルã®ã‚¯ãƒãƒ¼ã‚ºä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ[" + filename + "]";
132 throw new HybsSystemException ( errMsg );
133 }
134
135 // finally {
136 // if ( null != zipFile )
137 // try {
138 // zipFile.close();
139 // }
140 // catch ( IOException ex ) {
141 // String errMsg = "ODSファイルã®ã‚¯ãƒãƒ¼ã‚ºä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ[" + filename + "]";
142 // throw new HybsSystemException ( errMsg, ex );
143 // }
144 // }
145 }
146
147 /**
148 * DBTableModel ã‹ã‚‰ å?½¢å¼ã?ãƒ??タを作æ?ã—ã¦,BufferedReader よりèªã¿å–りã¾ã™ã?
149 * ã“ã?メソãƒ?ƒ‰ã¯ã€ã“ã®å®Ÿè£?‚¯ãƒ©ã‚¹ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã€?
150 *
151 * @param reader å?½¢å¼ã?ãƒ??ã‚¿(使用ã—ã¦ã?¾ã›ã‚“)
152 */
153 @Override
154 public void readDBTable( final BufferedReader reader ) {
155 String errMsg = "ã“ã?クラスã§ã¯å®Ÿè£?•れã¦ã?¾ã›ã‚“ã€?;
156 throw new UnsupportedOperationException( errMsg );
157 }
158
159 /**
160 * DBTableModelã®ãƒ??ã‚¿ã¨ã—ã¦Calcファイルをèªã¿è¾¼ã‚?¨ãã?シートåã‚’è¨å®šã—ã¾ã™ã?
161 * ã“れã«ã‚ˆã‚Šã€è¤?•°ã®å½¢å¼ã?ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’é?次èªã¿è¾¼ã‚?“ã¨ã‚??シートをæŒ?®šã—ã¦
162 * èªã¿å–ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã?
163 * sheetNos 㨠sheetName ãŒåŒæ™‚ã«æŒ?®šã•れãŸå ´åˆã?ã€sheetNos ãŒå„ªå…ˆã•れã¾ã™ã?エラーã«ã¯ãªã‚‰ãªã??ã§ã”注æ„ãã?•ã??
164 * ã®ã§ã”注æ„ãã?•ã??
165 *
166 * @param sheetName シートå
167 */
168 @Override
169 public void setSheetName( final String sheetName ) {
170 this.sheetName = sheetName;
171 }
172
173 /**
174 * Calcファイルをèªã¿è¾¼ã‚?¨ãã?シート番å·ã‚’指定ã—ã¾ã?åˆæœŸå€¤:0)ã€?
175 *
176 * Calcèªã¿è¾¼ã¿æ™‚ã«è¤?•°ã‚·ãƒ¼ãƒˆã‚’マã?ジã—ã¦å–り込ã¿ã¾ã™ã?
177 * シート番å·ã¯ã€? ã‹ã‚‰å§‹ã¾ã‚‹æ•°å—ã§è¡¨ã—ã¾ã™ã?
178 * ヘッãƒ??ã¯ã€æœ€åˆã?シートã?カラãƒ?½ç½®ã«åˆã‚ã›ã¾ã™ã??ˆã?ãƒ?ƒ€ãƒ¼ã‚¿ã‚¤ãƒˆãƒ«ã®è‡ªå‹•èªè˜ã?ã‚りã¾ã›ã‚“。ï¼?
179 * よã£ã¦ã€æŒ‡å®šã™ã‚‹ã‚·ãƒ¼ãƒˆã?ã€ã™ã¹ã¦åŒä¸?ƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã§ãªã?¨å–ã‚Šè¾¼ã¿æ™‚ã«ã‚«ãƒ©ãƒ??ãšã‚ŒãŒç™ºç”Ÿã—ã¾ã™ã?
180 *
181 * シート番å·ã®æŒ?®šã?ã€ã‚«ãƒ³ãƒžåŒºåˆ?‚Šã§ã€è¤?•°æŒ?®šã§ãã¾ã™ã?ã¾ãŸã?N-M ã®æ§˜ã«ãƒã‚¤ãƒ•ンã§ç¹‹ã’ã‚‹ã“ã¨ã§ã€?
182 * N 番ã‹ã‚‰ã€M 番ã®ã‚·ãƒ¼ãƒˆç¯?›²ã‚’ä¸?‹¬æŒ?®šå¯èƒ½ã§ã™ã?ã¾ãŸã?"*" ã«ã‚ˆã‚‹ã€å?シート指定ãŒå¯èƒ½ã§ã™ã?
183 * ã“れらã?çµ?¿åˆã‚ã›ã‚‚å¯èƒ½ã§ã™ã???0,1,3,5-8,10-* ??
184 * ãŸã ã—ã?"*" ã«é–¢ã—ã¦ã¯ä¾‹å¤–çš„ã«ã€ä¸?–‡å—ã ã‘ã§ã€ã™ã¹ã¦ã®ã‚·ãƒ¼ãƒˆã‚’表ã™ã‹ã€N-* ã‚’æœ€å¾Œã«æŒ?®šã™ã‚‹ã‹ã®
185 * ã©ã¡ã‚‰ã‹ã§ã™ã?途ä¸ã«ã¯ã€?*" ã¯ã€ç¾ã‚Œã¾ã›ã‚“ã€?
186 * シート番å·ã¯ã€?‡è¤?1,1,2,2)ã€??転(3,2,1) ã§ã®æŒ?®šãŒå¯èƒ½ã§ã™ã?ã“れã¯ã€ãã®æŒ?®šé?ã§ã€èªã¿è¾¼ã¾ã‚Œã¾ã™ã?
187 * sheetNos 㨠sheetName ãŒåŒæ™‚ã«æŒ?®šã•れãŸå ´åˆã?ã€sheetNos ãŒå„ªå…ˆã•れã¾ã™ã?エラーã«ã¯ãªã‚‰ãªã??ã§ã”注æ„ãã?•ã??
188 * ã“ã?メソãƒ?ƒ‰ã¯ã€isExcel() == true ã®å ´åˆã?ã¿åˆ©ç”¨ã•れã¾ã™ã?
189 *
190 * åˆæœŸå€¤ã¯ã€??ˆç¬¬ä¸?‚·ãƒ¼ãƒˆï¼?ã§ã™ã?
191 *
192 * ※ ã“ã?クラスã§ã¯å®Ÿè£?•れã¦ã?¾ã›ã‚“ã€?
193 *
194 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦è¿½åŠ?
195 *
196 * @param sheetNos Calcファイルã®ã‚·ãƒ¼ãƒˆç•ªå·??ã‹ã‚‰å§‹ã¾ã‚‹ï¼?
197 * @see #setSheetName( String )
198 */
199 @Override
200 public void setSheetNos( final String sheetNos ) {
201 this.sheetNos = sheetNos;
202 }
203
204 /**
205 * ã“ã?クラスãŒã?EXCEL対応機è?ã‚’æŒã£ã¦ã?‚‹ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã?
206 *
207 * EXCEL対応機è?ã¨ã¯ã€ã‚·ãƒ¼ãƒˆåã®ã‚»ãƒ?ƒˆã€èªã¿è¾¼ã¿å…?ƒ•ァイル㮠Fileオブジェクトå–å¾—ãªã©ã®ã€ç‰¹æ®Šæ©Ÿè?ã§ã™ã?
208 * 本æ¥ã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースをå?ã‘ã‚‹ã¹ãã¨è€?ˆã¾ã™ãŒã€taglib クラスç‰ã? 関係ãŒã‚りã€å•ã?ˆã‚ã›ã«ã‚ˆã‚‹æ¡ä»¶åˆ?²ã§å¯¾å¿œã—ã¾ã™ã?
209 *
210 * @return EXCEL対応機è?ã‚’æŒã£ã¦ã?‚‹ã‹ã©ã?‹(常ã«true)
211 */
212 @Override
213 public boolean isExcel() {
214 return true;
215 }
216
217 /**
218 * èªã¿å–りå…?ƒ•ァイルåã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?(DIR + Filename) ã“れã¯ã€OpenOffice.org
219 * Calc追åŠ?©Ÿè?ã¨ã—ã¦å®Ÿè£?•れã¦ã?¾ã™ã?
220 *
221 * @param filename èªã¿å–りå…?ƒ•ァイルå?
222 */
223 @Override
224 public void setFilename( final String filename ) {
225 this.filename = filename;
226 if ( filename == null ) {
227 String errMsg = "ファイルåãŒæŒ?®šã•れã¦ã?¾ã›ã‚“ã€?;
228 throw new HybsSystemException( errMsg );
229 }
230 }
231
232 /**
233 * ODSファイルをパースã—ãŸçµæžœã‹ã‚‰DBTableModelを生æˆã—ã¾ã™ã?
234 *
235 * @og.rev 5.1.6.0 (2010/05/01) skipRowCountã®è¿½åŠ?
236 *
237 * @param rowInfoList 行オブジェクトã?é…å?
238 */
239 private void makeDBTableModel( final RowInfo[] rowInfoList ) {
240 // カラãƒ?ãŒæŒ‡å®šã•れã¦ã?‚‹å ´åˆã?ã€å„ªå…ˆã™ã‚‹ã?
241 if( columns != null && columns.length() > 0 ) {
242 makeHeaderFromClms();
243 }
244
245 // for( RowInfo rowInfo : rowInfoList ) {
246 int skip = getSkipRowCount(); // 5.1.6.0 (2010/05/01)
247 for( int row=skip; row<rowInfoList.length; row++ ) {
248 RowInfo rowInfo = rowInfoList[row]; // 5.1.6.0 (2010/05/01)
249 if( valueClmIdx == null ) {
250 makeHeader( rowInfo );
251 }
252 else {
253 makeBody( rowInfo );
254 }
255 }
256
257 // æœ?¾Œã¾ã§ã€?NAME ãŒè¦‹ã¤ã‹ã‚‰ç„¡ã‹ã£ãŸå?å?
258 if ( valueClmIdx == null ) {
259 String errMsg = "æœ?¾Œã¾ã§ã€?NAME ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€? + HybsSystem.CR + "ファイルãŒç©ºã‹ã?ã‚‚ã—ãã?æå‚·ã—ã¦ã?‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã?" + HybsSystem.CR;
260 throw new HybsSystemException( errMsg );
261 }
262 }
263
264 /**
265 * æŒ?®šã•れãŸã‚«ãƒ©ãƒ?¸?¦§ã‹ã‚‰ãƒ˜ãƒƒãƒ??æƒ??を生æˆã—ã¾ã™ã?
266 *
267 * @og.rev 5.1.6.0 (2010/05/01) useNumber ã®è¿½åŠ?
268 */
269 private void makeHeaderFromClms() {
270 table = DBTableModelUtil.newDBTable();
271 String[] names = StringUtil.csv2Array( columns );
272 table.init( names.length );
273 setTableDBColumn( names ) ;
274 valueClmIdx = new int[names.length];
275 int adrs = (isUseNumber()) ? 1:0 ; // useNumber =true ã®å ´åˆã?ã€?¼‘ä»¶ç›®(No)ã¯èªã¿é£›ã?ã™ã?
276 for( int i=0; i<names.length; i++ ) {
277 // valueClmIdx[i] = i;
278 valueClmIdx[i] = adrs++;
279 }
280 }
281
282 /**
283 * ヘッãƒ??æƒ??ã‚’èªã¿å–りã€DBTableModelã®ã‚ªãƒ–ジェクトを新è¦ã«ä½œæ?ã—ã¾ã™ã?
284 * ※ ä»–ã?TableReaderã¨ç•°ãªã‚Šã?#NAME ãŒè¦‹ã¤ã‹ã‚‹ã¾ã§ã€èªã¿é£›ã?ã™ã?
285 *
286 * @og.rev 4.3.5.0 (2009/02/01) toArray ã™ã‚‹ã¨ãã«ã€ã‚µã‚¤ã‚ºã®åˆæœŸå€¤æŒ?®šã‚’追åŠ?
287 *
288 * @param rowInfo 行オブジェク�
289 */
290 private void makeHeader( final RowInfo rowInfo ) {
291 // int rowRepeat = rowInfo.rowRepeat;
292 CellInfo[] cellInfos = rowInfo.cellInfos;
293
294 int cellLen = cellInfos.length;
295 int runPos = 0;
296 ArrayList<String> nameList = null;
297 ArrayList<Integer> posList = null;
298 for ( int idx = 0; idx < cellLen; idx++ ) {
299 // ãƒ??ブルã®ãƒ˜ãƒƒãƒ?#NAME)ãŒè¦‹ã¤ã‹ã‚‹å‰ã?行ã?列ã?å…¨ã¦ç„¡è¦–ã•れる
300 CellInfo cellInfo = cellInfos[idx];
301 String text = cellInfo.text.trim();
302
303 for ( int cellRep = 0; cellRep < cellInfo.colRepeat; cellRep++ ) {
304 // 空白ã®ãƒ˜ãƒƒãƒ??ç„¡è¦?ãã?列ã«ãƒ??ã‚¿ãŒå?ã£ã¦ã?¦ã‚‚èªã¾ãªã?
305 if ( text.length() != 0 ) {
306 if ( firstClmIdx == 0 && text.equalsIgnoreCase( "#NAME" ) ) {
307 nameList = new ArrayList<String>();
308 posList = new ArrayList<Integer>();
309 table = DBTableModelUtil.newDBTable();
310 firstClmIdx = idx;
311 }
312 else if ( nameList != null ) {
313 nameList.add( text );
314 posList.add( runPos );
315 }
316 }
317 runPos++;
318 }
319 }
320
321 // if ( posList != null && posList.size() > 0 ) {
322 if ( posList != null && ! posList.isEmpty() ) {
323 table = DBTableModelUtil.newDBTable();
324 // String[] names = nameList.toArray( new String[0] );
325 // table.init( names.length );
326 // 4.3.5.0 (2009/02/01) サイズã®åˆæœŸå€¤æŒ?®?
327 int size = nameList.size();
328 String[] names = nameList.toArray( new String[size] );
329 table.init( size );
330 setTableDBColumn( names );
331
332 valueClmIdx = new int[posList.size()];
333 for( int i = 0; i<posList.size(); i++ ) {
334 valueClmIdx[i] = posList.get( i ).intValue();
335 }
336 }
337 }
338
339 /**
340 * 行ã?åˆ?セル)å˜ä½ã?æƒ??ã‚’èªã¿å–りã€DBTableModelã«å€¤ã‚’ã‚»ãƒ?ƒˆã—ã¾ã?
341 *
342 * @og.rev 5.2.1.0 (2010/10/01) setTableColumnValues メソãƒ?ƒ‰ã‚’経由ã—ã¦ã€ãƒ†ãƒ¼ãƒ–ルã«ãƒ??ã‚¿ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã€?
343 *
344 * @param rowInfo 行オブジェク�
345 */
346 private void makeBody( final RowInfo rowInfo ) {
347 int rowRepeat = rowInfo.rowRepeat;
348 CellInfo[] cellInfos = rowInfo.cellInfos;
349 int cellLen = cellInfos.length;
350 boolean isExistData = false;
351
352 List<String> colData = new ArrayList<String>();
353 for ( int cellIdx = 0; cellIdx < cellLen; cellIdx++ ) {
354 CellInfo cellInfo = cellInfos[cellIdx];
355 for ( int cellRep = 0; cellRep < cellInfo.colRepeat; cellRep++ ) {
356 colData.add( cellInfo.text );
357 if( cellInfo.text.length() > 0 ) {
358 isExistData = true;
359 }
360 }
361 }
362
363 if( isExistData ) {
364 // åˆã‚ã®åˆ?#NAMEãŒè¨˜è¿°ã•れã¦ã?Ÿåˆ?ã®å€¤ã?ã§å§‹ã¾ã£ã¦ã?‚‹å ´åˆã?ã€ã‚³ãƒ¡ãƒ³ãƒˆè¡Œã¨ã¿ãªã™ã?
365 String firstVal = colData.get( firstClmIdx );
366 if( firstVal.length() > 0 && firstVal.startsWith( "#" ) ) {
367 return;
368 }
369 else {
370 String[] vals = new String[valueClmIdx.length];
371 for( int col = 0; col < valueClmIdx.length; col++ ) {
372 vals[col] = colData.get( valueClmIdx[col] );
373 }
374
375 // é‡è¤?¡Œã?繰り返ã—処ç?
376 for ( int rowIdx = 0; rowIdx < rowRepeat; rowIdx++ ) {
377 // ãƒ??ブルモãƒ?ƒ«ã«ãƒ??ã‚¿ã‚’ã‚»ãƒ?ƒˆ
378 if ( numberOfRows < getMaxRowCount() ) {
379 setTableColumnValues( vals ); // 5.2.1.0 (2010/10/01)
380 // table.addColumnValues( vals );
381 numberOfRows++;
382 }
383 else {
384 table.setOverflow( true );
385 }
386 }
387 }
388 }
389 // å…¨ãデータãŒå˜åœ¨ã—ãªã?¡Œã?èªã¿é£›ã?ã?
390 else {
391 return;
392 }
393 }
394
395 /**
396 * ODSファイルã«å«ã¾ã‚Œã‚‹content.xmlã‚’DOMパã?サーã§ãƒ‘ã?スã—ã?行ã?列å˜ä½ã«
397 * オブジェクトã«å¤‰æ›ã—ã¾ã™ã?
398 *
399 */
400 private static class DomOdsParser{
401
402 // OpenOffice.org Calc tag Names
403 // private static final String OFFICE_DOCUMENT_CONTEBT_ELEM = "office:document-content";
404 // private static final String OFFICE_SPREADSHEET_ELEM = "office:spreadsheet";
405 private static final String TABLE_TABLE_ELEM = "table:table";
406 // private static final String TABLE_TABLE_COLUMN_ELEM = "table:table-column";
407 private static final String TABLE_TABLE_ROW_ELEM = "table:table-row";
408 private static final String TABLE_TABLE_CELL_ELEM = "table:table-cell";
409 private static final String TEXT_P_ELEM = "text:p";
410
411 // Sheet tag attributes
412 private static final String TABLE_NAME_ATTR = "table:name";
413 // private static final String OFFICE_VALUE_YPE_ATTR = "office:value-type";
414 private static final String TABLE_NUMBER_ROWS_REPEATED_ATTR = "table:number-rows-repeated";
415 private static final String TABLE_NUMBER_COLUMNS_REPEATED_ATTR = "table:number-columns-repeated";
416 // private static final String TABLE_NUMBER_ROWS_SPANNED_ATTR = "table:number-rows-spanned";
417 // private static final String TABLE_NUMBER_COLUMNS_SPANNED_ATTR = "table:number-columns-spanned";
418
419 // ArrayList<RowInfo> rowInfoList = new ArrayList<RowInfo>();
420 List<RowInfo> rowInfoList = new ArrayList<RowInfo>();
421 /**
422 * Domパã?サã§XMLをパースã™ã‚‹
423 *
424 * @og.rev 5.5.7.2 (2012/10/09) sheetNos 追åŠ?«ã‚ˆã‚‹è¤?•°ã‚·ãƒ¼ãƒˆã?マã?ジèªã¿å–りサãƒã?ãƒ?
425 *
426 * @param inputStream InputStream
427 * @param sheetName String
428 * @param sheetNos String
429 */
430 // public void doParse( final InputStream inputStream, final String sheetName ) {
431 public void doParse( final InputStream inputStream, final String sheetName, final String sheetNos ) {
432 try {
433 // ドã‚ュメントビルãƒ??ファクトリを生æˆ?
434 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
435 dbFactory.setNamespaceAware( true );
436
437 // ドã‚ュメントビルãƒ??を生æˆ?
438 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
439 // パã?スを実行ã—ã¦Documentオブジェクトをå–å¾?
440 Document doc = dBuilder.parse( inputStream );
441 // processBook( doc, sheetName );
442 processBook( doc, sheetName, sheetNos ); // 5.5.7.2 (2012/10/09) sheetNos 追�
443 }
444 catch ( ParserConfigurationException ex ) {
445 throw new HybsSystemException( ex );
446 }
447 catch ( SAXException ex ) {
448 String errMsg = "ODSファイルä¸ã«å«ã¾ã‚Œã‚‹content.xmlãŒXMLå½¢å¼ã§ã¯ã‚りã¾ã›ã‚“ã€?;
449 throw new HybsSystemException( errMsg, ex );
450 }
451 catch ( IOException ex ) {
452 throw new HybsSystemException( ex );
453 }
454 }
455
456 /**
457 * 行オブジェクトã?リストを返ã—ã¾ã™ã?
458 *
459 * @return List<RowInfo>
460 */
461 public List<RowInfo> getRowInfoList() {
462 return rowInfoList;
463 }
464
465 /**
466 * ODSファイル全体ã?パã?スを行ã„ã€å?ç?¯¾è±¡ã¨ãªã‚‹ã‚·ãƒ¼ãƒˆã‚’検索ã—ã¾ã™ã?
467 *
468 * @og.rev 5.5.7.2 (2012/10/09) sheetNos 追åŠ?«ã‚ˆã‚‹è¤?•°ã‚·ãƒ¼ãƒˆã?マã?ジèªã¿å–りサãƒã?ãƒ?
469 *
470 * @param doc Document
471 * @param sheetName String
472 * @param sheetNos String
473 */
474 // private void processBook( final Document doc, final String sheetName ) {
475 private void processBook( final Document doc, final String sheetName, final String sheetNos ) {
476 // table:tableを探ã?
477 NodeList nodetList = doc.getElementsByTagName( TABLE_TABLE_ELEM );
478 int listLen = nodetList.getLength();
479
480 // Element sheet = null;
481 Element[] sheets = null ; // 5.5.7.2 (2012/10/09)
482
483 // 5.5.7.2 (2012/10/09) è¤?•°ã‚·ãƒ¼ãƒˆã?マã?ジèªã¿å–りã€?sheetNos ã®æŒ?®šãŒå„ªå…ˆã•れるã€?
484 if( sheetNos != null && sheetNos.length() > 0 ) {
485 String[] sheetList = StringUtil.csv2ArrayExt( sheetNos , listLen-1 ); // æœ?¤§ã‚·ãƒ¼ãƒˆç•ªå·ã¯ã€ã‚·ãƒ¼ãƒˆæ•°-1
486 sheets = new Element[sheetList.length];
487 for( int i=0; i<sheetList.length; i++ ) {
488 sheets[i] = (Element)nodetList.item( Integer.parseInt( sheetList[i] ) );
489 }
490 }
491 else if( sheetName != null && sheetName.length() > 0 ) {
492 Element sheet = null;
493 for ( int idx = 0; idx < listLen; idx++ ) {
494 Element st = (Element)nodetList.item( idx );
495 if ( sheetName.equals( st.getAttribute( TABLE_NAME_ATTR ) ) ) {
496 sheet = st;
497 break;
498 }
499 }
500 if( sheet == null ) {
501 String errMsg = "対応ã™ã‚‹ã‚·ãƒ¼ãƒˆãŒå˜åœ¨ã—ã¾ã›ã‚“ã€?sheetName=[" + sheetName + "]" ;
502 throw new HybsSystemException( errMsg );
503 }
504 sheets = new Element[] { sheet };
505 }
506 else {
507 Element sheet = (Element)nodetList.item(0);
508 sheets = new Element[] { sheet };
509 }
510
511 // // シート探ã—:シートåãŒã‚れã?ã€ãã®ã¾ã¾ä½¿ç”¨ã€ãªã‘れã°ã€æœ€åˆã?シートを対象ã¨ã—ã¾ã™ã?
512 // for ( int idx = 0; idx < listLen; idx++ ) {
513 // Element st = (Element)nodetList.item( idx );
514 // if ( ( sheetName == null || sheetName.length() == 0 ) || sheetName.equals( st.getAttribute( TABLE_NAME_ATTR ) ) ) {
515 // sheet = st;
516 // break;
517 // }
518 // }
519 // æŒ?®šã?シートãŒãªã‘れã°ã€ã‚¨ãƒ©ãƒ¼
520 // if ( sheet == null ) {
521 if ( sheets == null ) {
522 String errMsg = "対応ã™ã‚‹ã‚·ãƒ¼ãƒˆãŒå˜åœ¨ã—ã¾ã›ã‚“ã€?sheetNos=[" + sheetNos + "] or sheetName=[" + sheetName + "]";
523 throw new HybsSystemException( errMsg );
524 }
525 else {
526 // processSheet( sheet );
527 // 5.5.7.2 (2012/10/09) è¤?•°ã‚·ãƒ¼ãƒˆã?マã?ジèªã¿å–りã€?
528 for( int i=0; i<sheets.length; i++ ) {
529 processSheet( sheets[i] );
530 }
531 }
532 }
533
534 /**
535 * ODSファイルã®ã‚·ãƒ¼ãƒˆå˜ä½ã?パã?スを行ã„ã€è¡Œå˜ä½ã?オブジェクトを生æ?ã—ã¾ã™ã?
536 *
537 * @param sheet Element
538 */
539 private void processSheet( final Element sheet ) {
540 NodeList rows = sheet.getElementsByTagName( TABLE_TABLE_ROW_ELEM );
541 int listLen = rows.getLength();
542 int rowRepeat;
543 for ( int idx = 0; idx < listLen; idx++ ) {
544 Element row = (Element)rows.item( idx );
545 // 行ã?å†?®¹ãŒå?ãåŒã˜å?åˆã?table:number-rows-repeatedã‚¿ã‚°ã«ã‚ˆã‚Šçœç•¥ã•れるã?
546 String repeatStr = row.getAttribute( TABLE_NUMBER_ROWS_REPEATED_ATTR );
547 if ( repeatStr == null || repeatStr.length() == 0 ) {
548 rowRepeat = 1;
549 }
550 else {
551 rowRepeat = Integer.parseInt( repeatStr, 10 );
552 }
553
554 processRow( row, rowRepeat );
555 }
556 }
557
558 /**
559 * ODSファイルã®è¡Œå˜ä½ã?パã?スを行ã„ã€ã‚«ãƒ©ãƒ?˜ä½ã?オブジェクトを生æ?ã—ã¾ã™ã?
560 *
561 * @og.rev 4.3.5.0 (2009/02/01) toArray ã™ã‚‹ã¨ãã«ã€ã‚µã‚¤ã‚ºã®åˆæœŸå€¤æŒ?®šã‚’追åŠ?
562 * @og.rev 5.1.8.0 (2010/07/01) セルå†?§æ›¸å¼è¨å®šã•れã¦ã?‚‹å ´åˆã«ã€ãƒ†ã‚ストデータãŒå–å¾—ã•れãªã?ƒã‚°ã‚’ä¿®æ£
563 *
564 * @param row Element
565 * @param rowRepeat int
566 */
567 private void processRow( final Element row, final int rowRepeat ) {
568 NodeList cells = row.getElementsByTagName( TABLE_TABLE_CELL_ELEM );
569 int listLen = cells.getLength();
570 int colRepeat;
571 String cellText;
572 ArrayList<CellInfo> cellInfoList = new ArrayList<CellInfo>();
573 for ( int idx = 0; idx < listLen; idx++ ) {
574 Element cell = (Element)cells.item( idx );
575 // カラãƒ??å†?®¹ãŒå?ãåŒã˜å?åˆã?table:number-columns-repeatedã‚¿ã‚°ã«ã‚ˆã‚Šçœç•¥ã•れるã?
576 String repeatStr = cell.getAttribute( TABLE_NUMBER_COLUMNS_REPEATED_ATTR );
577 if ( repeatStr == null || repeatStr.length() == 0 ) {
578 colRepeat = 1;
579 }
580 else {
581 colRepeat = Integer.parseInt( repeatStr, 10 );
582 }
583
584 // text:p
585 NodeList texts = cell.getElementsByTagName( TEXT_P_ELEM );
586 if ( texts.getLength() == 0 ) {
587 cellText = "";
588 }
589 else {
590 // 5.1.8.0 (2010/07/01) セルå†?§æ›¸å¼è¨å®šã•れã¦ã?‚‹å ´åˆã«ã€ãƒ†ã‚ストデータãŒå–å¾—ã•れãªã?ƒã‚°ã‚’ä¿®æ£
591 // StringBuilder sb = new StringBuilder();
592 // NodeList textElems = texts.item( 0 ).getChildNodes();
593 // int textElemLen = textElems.getLength();
594 // for ( int idxt = 0; idxt < textElemLen; idxt++ ) {
595 // Node textElem = textElems.item( idxt );
596 // if ( textElem.getNodeType() == Node.TEXT_NODE ) {
597 // sb.append( textElem.getNodeValue() );
598 // }
599 // }
600 // cellText = sb.toString();
601 cellText = texts.item( 0 ).getTextContent();
602 }
603 cellInfoList.add( new CellInfo( colRepeat, cellText ) );
604 }
605
606 // if ( cellInfoList.size() > 0 ) {
607 if ( ! cellInfoList.isEmpty() ) {
608 // rowInfoList.add( new RowInfo( rowRepeat, cellInfoList.toArray( new CellInfo[0] ) ) );
609 // 4.3.5.0 (2009/02/01) toArray ã™ã‚‹ã¨ãã«ã€ã‚µã‚¤ã‚ºã®åˆæœŸå€¤æŒ?®šã‚’追åŠ?
610 rowInfoList.add( new RowInfo( rowRepeat, cellInfoList.toArray( new CellInfo[cellInfoList.size()] ) ) );
611 }
612 }
613 }
614
615 /**
616 * ODSファイルã®è¡Œæƒ…å ±ã‚’è¡¨ã™æ§‹é?ä½?
617 */
618 private static final class RowInfo {
619 public final int rowRepeat;
620 public final CellInfo[] cellInfos;
621
622 RowInfo( final int rep, final CellInfo[] cell ) {
623 rowRepeat = rep;
624 cellInfos = cell;
625 }
626 }
627
628 /**
629 * ODSファイルã®ã‚«ãƒ©ãƒ?ƒ…å ±ã‚’è¡¨ã™æ§‹é?ä½?
630 */
631 private static final class CellInfo {
632 public final int colRepeat;
633 public final String text;
634
635 CellInfo( final int rep, final String tx ) {
636 colRepeat = rep;
637 text = tx;
638 }
639 }
640 }