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.report2; 017 018 import java.io.BufferedReader; 019 import java.io.BufferedWriter; 020 import java.io.File; 021 import java.io.FileInputStream; 022 import java.io.FileNotFoundException; 023 import java.io.FileOutputStream; 024 import java.io.IOException; 025 import java.io.InputStreamReader; 026 import java.io.OutputStreamWriter; 027 import java.io.UnsupportedEncodingException; 028 import java.nio.channels.FileChannel; 029 import java.util.ArrayList; 030 import java.util.HashMap; 031 import java.util.List; 032 import java.util.Locale; 033 import java.util.Map; 034 import java.util.Set; 035 036 import org.opengion.fukurou.model.NativeType; 037 import org.opengion.fukurou.util.Closer; 038 import org.opengion.fukurou.util.FileUtil; 039 import org.opengion.fukurou.util.QrcodeImage; 040 import org.opengion.hayabusa.common.HybsSystem; 041 import org.opengion.hayabusa.common.HybsSystemException; 042 043 /** 044 * æŒ?®šã•れãŸãƒ‘スã«å˜åœ¨ã™ã‚‹ODSã®å„XMLファイルをパースã—ã?帳票定義åŠã? 045 * 帳票ãƒ??ã‚¿ã‹ã‚‰æ›¸ãæ›ãˆã¾ã™ã? 046 * æ›¸ãæ›ãˆã?èªã¿å–り先ã¨åŒã˜ãƒ•ァイルã§ã‚ã‚‹ãŸã‚ã€ä¸?—¦èªã¿å–ã£ãŸå„XMLã‚? 047 * ãƒ¡ãƒ¢ãƒªä¸Šã«æ ¼ç´ã—ãŸã‹ã‚‰ãƒ‘ース後ã?XMLãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ãè¾¼ã¿ã‚’行ã„ã¾ã™ã? 048 * 049 * パã?ス対象ã¨ãªã‚‹ãƒ•ァイルã¯ä»¥ä¸‹ã?3ã¤ã§ã™ã? 050 * content.xml シートã?ä¸èº«ã‚’定義 051 * meta.xml メタãƒ??タを定義 052 * style.xml 帳票ヘッãƒ??フッターを定義 053 * 054 * content.xmlã®ãƒ‘ã?ス処ç?¨ã—ã¦ã€ã¾ãšxmlファイルをシーãƒ?行å˜ä½ã«åˆ?§£ã—ã¾ã™ã? 055 * ãã?後ã?åˆ?§£ã•れãŸè¡Œæ¯Žã«å¸³ç¥¨ãƒ??タを埋ã‚è¾¼ã¿ã€å?力å?ã®XMLã«æ›¸ãè¾¼ã¿ã‚’行ã„ã¾ã™ã? 056 * 書ãè¾¼ã¿ã¯è¡Œå˜ä½ã«è¡Œã‚れã¾ã™ã? 057 * 058 * ã¾ãŸã?Calcã®ç‰¹æ€§ã¨ã—ã¦ã€?–¢æ•°ã®å¼•æ•°ã«ä¸æ£ãªå¼•æ•°ãŒæŒ‡å®šã•れãŸå ´åˆã?(Text関数㮠059 * 引数ã«nullãŒæŒ‡å®šã•れãŸå ´åˆç?ã€ã‚¨ãƒ©ãƒ¼:XXXã¨ã?†æ–?—ãŒè¡¨ç¤ºã•れã¾ã™ã? 060 * ã“ã“ã§ã¯ã€ã“れを回é¿ã™ã‚‹ãŸã‚ã€å?ã¦ã®é–¢æ•°ã«isError関数を埋ã‚è¾¼ã¿ã€ã‚¨ãƒ©ãƒ¼è¡¨ç¤ºã‚? 061 * 行ã‚ãªã?‚ˆã?«ã—ã¦ã?¾ã™ã? 062 * 063 * @og.group 帳票シスãƒ?ƒ 064 * 065 * @version 4.0 066 * @author Hiroki.Nakamura 067 * @since JDK1.6 068 */ 069 class OdsContentParser { 070 071 //======== content.xmlã®ãƒ‘ã?スã§ä½¿ç”¨ ======================================== 072 /* シートã?開始終äº?‚¿ã‚° */ 073 private static final String BODY_START_TAG = "<table:table "; 074 private static final String BODY_END_TAG = "</table:table>"; 075 076 /* 行ã?開始終äº?‚¿ã‚° */ 077 private static final String ROW_START_TAG = "<table:table-row "; 078 079 /* ペã?ジエンドカãƒ?ƒˆã®éš›ã«ã€è¡Œã‚’éžè¡¨ç¤ºã«ã™ã‚‹ãŸã‚ã®ãƒ??ブル宣è¨?*/ 080 private static final String ROW_START_TAG_INVISIBLE = "<table:table-row table:visibility=\"collapse\" "; 081 082 /* セルã®é–‹å§‹ã‚¿ã‚° */ 083 private static final String TABLE_CELL_START_TAG = "<table:table-cell"; 084 private static final String TABLE_CELL_END_TAG = "</table:table-cell>"; 085 086 /* シートåã‚’å–å¾—ã™ã‚‹ãŸã‚ã?開始終äº?–‡å?*/ 087 private static final String SHEET_NAME_START = "table:name=\""; 088 089 /* オブジェクトã?終äº?½ç½®(シートå)を見ã¤ã‘ã‚‹ãŸã‚ã®é–‹å§‹æ–‡å?*/ 090 private static final String OBJECT_SEARCH_STR = "table:end-cell-address=\""; 091 092 /* å°åˆ·ç¯?›²æŒ?®šã?開始終äº?–‡å?*/ 093 // 4.3.3.5 (2008/11/08) 空白ペã?ジ対ç–ã§è¿½åŠ? 094 private static final String PRINT_RANGE_START = "table:print-ranges=\""; 095 private static final String PRINT_RANGE_END = "\""; 096 097 /* 表紙å°åˆ·ç”¨ã®ãƒšã?ジåç§° */ 098 private static final String FIRST_PAGE_NAME = "FIRST"; 099 100 /* シートブレイク用ã®ã‚ー 5.1.7.0 (2010/06/01) */ 101 private static final String SHEET_BREAK = "SHEETBREAK"; 102 103 /* 変数定義ã®é–‹å§‹çµ‚äº?–‡å—åŠã³åŒºåˆ?‚Šæ–??*/ 104 private static final String VAR_START = "{@"; 105 private static final String VAR_END = "}"; 106 private static final String VAR_CON = "_"; 107 108 /* ペã?ジエンドカãƒ?ƒˆã®ã‚«ãƒ©ãƒ?–‡å—å? */ 109 private static final String PAGE_END_CUT = "PAGEENDCUT"; 110 111 /* ペã?ジブレイクã®ã‚«ãƒ©ãƒ?–‡å—å? */ 112 private static final String PAGE_BREAK = "PAGEBREAK"; 113 114 /* ペã?ジ番å·å‡ºåŠ›ç”¨æ–?—å? 5.1.6.0 (2010/05/01) */ 115 private static final String PAGE_NO= "PAGENO"; 116 117 /* 行番å·å‡ºåŠ›ç”¨æ–?—å? 5.1.6.0 (2010/05/01) */ 118 private static final String ROW_NO= "ROWNO"; 119 120 /* ç”»åƒã?リンクをå–å¾—ã™ã‚‹ãŸã‚ã?開始終äº?–‡å?*/ 121 private static final String DRAW_IMG_START_TAG = "<draw:image xlink:href=\""; 122 private static final String DRAW_IMG_END_TAG = "</draw:image>"; 123 private static final String DRAW_IMG_HREF_END = "\""; 124 125 /* ç”»åƒãƒ•ァイルをä¿å˜ã™ã‚‹ãŸã‚ã?パス */ 126 private static final String IMG_DIR = "Pictures"; 127 128 /* QRコードを処ç?™ã‚‹ãŸã‚ã?カラãƒ? */ 129 private static final String QRCODE_PREFIX = "QRCODE."; 130 131 /* 作æ?ã—ãŸQRコードã?フォルãƒ?åŠã?æ‹¡å¼µå?*/ 132 private static final String QRCODE_FILETYPE = ".png"; 133 134 /* 4.3.3.5 (2008/11/08) å‹•çš„ã«ç”»åƒã‚’入れ替ãˆã‚‹ãŸã‚ã®ãƒ‘スを記述ã™ã‚‹ã‚«ãƒ©ãƒ? */ 135 private static final String IMG_PREFIX = "IMG."; 136 137 /* ファンクション定義を見ã¤ã‘ã‚‹ãŸã‚ã®é–‹å§‹çµ‚äº?–‡å?*/ 138 private static final String OOOC_FUNCTION_START = "oooc:="; 139 private static final String OOOC_FUNCTION_START_3 = "of:="; // 4.3.7.2 (2009/06/15) ODS仕様変更ã«ã¤ã追åŠ? 140 private static final String OOOC_FUNCTION_END = ")\" "; 141 142 /* セルå†??改行を定義ã™ã‚‹æ–?—å? 5.0.2.0 (2009/11/01) */ 143 private static final String OOO_CR = "</text:p><text:p>"; 144 145 /* グラフオブジェクトã?æ›¸ãæ›ãˆã‚’行ã†ãŸã‚ã®é–‹å§‹çµ‚äº?–‡å?5.1.8.0 (2010/07/01) */ 146 private static final String GRAPH_START_TAG = "<draw:frame "; 147 private static final String GRAPH_END_TAG = "</draw:frame>"; 148 /* グラフã?ç¯?›²æŒ?®šã?æ›¸ãæ›ãˆã‚’行ã†ãŸã‚ã®é–‹å§‹çµ‚äº?–‡å?5.1.8.0 (2010/07/01) */ 149 private static final String GRAPH_UPDATE_RANGE_START = "draw:notify-on-update-of-ranges=\""; 150 private static final String GRAPH_UPDATE_RANGE_END = "\""; 151 /* グラフã?オブジェクトã¸ã®ãƒªãƒ³ã‚¯ã®æ›¸ãæ›ãˆã‚’行ã†ãŸã‚ã®é–‹å§‹çµ‚äº?–‡å?5.1.8.0 (2010/07/01) */ 152 private static final String GRAPH_HREF_START = "xlink:href=\"./"; 153 private static final String GRAPH_HREF_END = "\""; 154 private static final String GRAPH_OBJREPL = "ObjectReplacements"; 155 /* グラフã?オブジェクト毎ã?content.xmlã«è¨˜è¿°ã—ã¦ã‚るシートåã®æ›¸ãæ›ãˆã‚’行ã†ãŸã‚ã®é–‹å§‹çµ‚äº?–‡å?5.1.8.0 (2010/07/01) */ 156 private static final String GRAPH_CONTENT_START = "-address=\""; 157 private static final String GRAPH_CONTENT_END = "\""; 158 /* 生æ?ã—ãŸã‚°ãƒ©ãƒ•ã?オブジェクトをMETA-INF/manifest.xmlã«ç™»éŒ²ã™ã‚‹ãŸã‚ã®é–‹å§‹çµ‚äº?–‡å—å? 5.1.8.0 (2010/07/01) */ 159 private static final String MANIFEST_START_TAG = "<manifest:file-entry "; 160 private static final String MANIFEST_END_TAG = "/>"; 161 162 /* æ•°å€¤ã‚¿ã‚¤ãƒ—ç½®ãæ›ãˆç”¨ã®æ–?—å? 5.1.8.0 (2010/07/01) */ 163 private static final String TABLE_CELL_STRING_TYPE = "office:value-type=\"string\""; 164 private static final String TABLE_CELL_FLOAT_TYPE = "office:value-type=\"float\""; 165 private static final String TABLE_CELL_FLOAT_VAL_START = "office:value=\""; 166 private static final String TABLE_CELL_FLOAT_VAL_END = "\""; 167 168 /* ãƒ?‚スト文å—å?ã®é–‹å§‹çµ‚äº?–‡å—å? 5.1.8.0 (2010/07/01) */ 169 private static final String TEXT_START_TAG = "<text:p>"; 170 private static final String TEXT_END_TAG = "</text:p>"; 171 172 /* コメンãƒ?アノテーション)ã‚’å?ç?™ã‚‹ãŸã‚ã?カラãƒ? 5.1.8.0 (2010/07/01) */ 173 private static final String ANNOTATION_PREFIX = "ANO."; 174 private static final String TEXT_START_ANO_TAG = "<text:p"; // アノテーションã®å ´åˆã?ç½®ãæ›ãˆã‚’ 175 private static final String TEXT_START_END_ANO_TAG = ">"; // アノテーションã®å ´åˆã?ç½®ãæ›ãˆã‚’ 176 177 /* コメンãƒ?アノテーション)ã®é–‹å§‹ã?終äº?‚¿ã‚° 5.1.8.0 (2010/07/01) */ 178 private static final String ANNOTATION_START_TAG = "<office:annotation"; 179 private static final String ANNOTATION_END_TAG = "</office:annotation>"; 180 181 /* オブジェクトを検索ã™ã‚‹ãŸã‚ã®æ–?—å? 5.1.8.0 (2010/07/01) */ 182 private static final String DRAW_START_KEY = "<draw:"; 183 private static final String DRAW_END_KEY = "</draw:"; 184 185 /* シートã?開始終äº?‚¿ã‚° 5.2.2.0 (2010/11/01) */ 186 private static final String STYLE_START_TAG = "<style:style "; 187 private static final String STYLE_END_TAG = "</style:style>"; 188 189 /* シートåç§° 5.2.2.0 (2010/11/01) */ 190 private static final String STYLE_NAME_START_TAG = "style:name=\""; 191 private static final String STYLE_NAME_END_TAG = "\""; 192 193 /* ãƒ??ブルå†?‚·ãƒ¼ãƒˆåç§° 5.2.2.0 (2010/11/01) */ 194 private static final String TABLE_STYLE_NAME_START_TAG = "table:style-name=\""; 195 private static final String TABLE_STYLE_NAME_END_TAG = "\""; // 5.6.3.1 (2013/04/05) 196 197 //=========================================================================== 198 199 //======== meta.xmlã®ãƒ‘ã?スã§ä½¿ç”¨ =========================================== 200 /* ç·ã‚·ãƒ¼ãƒˆã‚«ã‚¦ãƒ³ãƒˆæ•° */ 201 private static final String TABLE_COUNT_START_TAG = "meta:table-count=\""; 202 private static final String TABLE_COUNT_END_TAG = "\""; 203 204 /* ç·ã‚»ãƒ«ã‚«ã‚¦ãƒ³ãƒˆæ•° */ 205 private static final String CELL_COUNT_START_TAG = "meta:cell-count=\""; 206 private static final String CELL_COUNT_END_TAG = "\""; 207 208 /* ç·ã‚ªãƒ–ジェクトカウント数 */ 209 private static final String OBJECT_COUNT_START_TAG = "meta:object-count=\""; 210 private static final String OBJECT_COUNT_END_TAG = "\""; 211 //=========================================================================== 212 213 /* 214 * 処ç?¸ã®è¡Œç•ªå·ã®çжæ…? 215 * NORMAL : 通常 216 * LASTROW : æœ?µ‚è¡? 217 * OVERFLOW : 終äº? 218 */ 219 private static final int NORMAL = 0; 220 private static final int LASTROW = 1; 221 private static final int OVERFLOW = 2; 222 private int status = NORMAL; 223 224 /* 225 * å?››å½¢ãƒ•ァイルをå?ç?™ã‚‹éš›ã®åŸºæº–ã¨ãªã‚‹è¡Œæ•° 226 * åˆæœŸ>0 2è¡?{@XXX_1}ã¾ã§)処ç?¾?2 ・・・ 227 * å?››å½¢ã§å®šç¾©ã•れã¦ã?‚‹è¡Œç•ªå· + [baseRow] ã®å€¤ãŒDBTableModel上ã?行番å·ã«ç›¸å½“ã™ã‚? 228 * currentMaxRowã¯å?‚·ãƒ¼ãƒˆå?ç?¾Œã?[baseRow]ã¨åŒã˜ 229 */ 230 private int currentBaseRow = 0; 231 private int currentMaxRow = 0; 232 233 /* 処ç?—ãŸã?ージ数 */ 234 private int pages = 0; 235 236 /* 処ç?¡ŒãŒãƒšã?ジエンドカãƒ?ƒˆã®å¯¾è±¡ã‹ã©ã?‹ */ 237 private boolean isPageEndCut = false; // 4.3.1.1 (2008/08/23) ãƒãƒ¼ã‚«ãƒ«å¤‰æ•°åŒ? 238 239 /* ペã?ジブレイクã®å‡¦ç?¸ã‹ã©ã?‹ */ 240 private boolean isPageBreak = false; 241 242 /* XML宣è¨??æ–?—å?。å„XMLã§å…±é€šãªã®ã§ã‚¯ãƒ©ã‚¹å¤‰æ•°ã¨ã—ã¦å®šç¾© */ 243 private String xmlHeader = null; 244 245 /* シートブレイク対象ã‹ã©ã?‹ 5.1.7.0 (2010/06/01) */ 246 private int sheetBreakClm = -1; 247 248 /* シートåカラãƒ?5.7.6.2 (2014/05/16) */ 249 private int sheetNameClm = -1; // 今ã?ã€ã?ージブレイクカラãƒ?¨åŒã˜ã‚«ãƒ©ãƒ?‚’使用ã—ã¦ã?¾ã™ã? 250 251 /* シートã?ヘッãƒ??部åˆ??å†ãƒ‘ースを行ã†ã‹ã©ã?‹ 5.2.2.0 (2010/11/01) */ 252 private boolean isNeedsReparse = false; 253 254 /* ペã?ジåã?マッピング(å…??シートåã«å¯¾ã™ã‚‹æ–°ã—ã„シートå) 5.2.2.0 (2010/11/01) */ 255 private final Map<String,List<String>> pageNameMap = new HashMap<String,List<String>>(); 256 257 /* ペã?ジåã«ä¾å˜ã—ã¦ã?‚‹ã‚¹ã‚¿ã‚¤ãƒ«åç§°ã®ãƒªã‚¹ãƒ?5.2.2.0 (2010/11/01) */ 258 private final List<String> repStyleList = new ArrayList<String>(); 259 260 /* manifest.xmlã«è¿½åŠ?Œå¿?¦ãªã‚ªãƒ–ジェクトã?マッãƒ?5.3.1.0 (2011/01/01) */ 261 private final Map<String,String> addObjs = new HashMap<String,String>(); 262 263 private final ExecQueue queue; 264 private final String path; 265 266 /** 267 * コンストラクタ 268 * 269 * @og.rev 5.1.2.0 (2010/01/01) 処ç?—ãŸè¡Œæ•°ã‚’Queueオブジェクトã‹ã‚‰å–å¾?シート数ã?56ã‚’è¶?ˆãŸå?åˆã?対å¿? 270 * 271 * @param qu ExecQueue 272 * @param pt String 273 */ 274 OdsContentParser( final ExecQueue qu, final String pt ) { 275 queue = qu; 276 path = pt; 277 278 currentBaseRow = queue.getExecRowCnt(); 279 } 280 281 /** 282 * パã?ス処ç?‚’実行ã—ã¾ã? 283 * 284 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 285 * @og.rev 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 286 */ 287 public void exec() { 288 /* 289 * 雛形ヘッãƒ??フッターã®å®šç¾© 290 * OOoã§ã¯ãƒšã?ジ毎ã«ãƒ˜ãƒƒãƒ??フッターãŒè¨å®šã§ããªã?‚ˆã?? 291 * ãªã®ã§ã€å?ã¦ãƒ˜ãƒƒãƒ??扱ã?§å‡¦ç? 292 */ 293 execStyles(); 294 295 /* ä¸èº«ã®å¤‰æ› */ 296 execContent(); 297 298 /* ヘッãƒ??部åˆ?«ã‚·ãƒ¼ãƒˆæƒ…å ±ãŒã‚ã‚‹å?åˆã«æ›¸ãæ›ã?*/ 299 if( isNeedsReparse ) { 300 /* ヘッãƒ??ファイルã®å†ãƒ‘ース */ 301 execContentHeader(); 302 /* ヘッãƒ??ファイルã¨ãれ以é™ã?ファイルã®é€£çµ?*/ 303 execMergeContent(); 304 } 305 306 /* メタãƒ??ã‚¿ã®å¤‰æ› */ 307 execMeta(); 308 309 // 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 310 /* 追åŠ?—ãŸç”»åƒã?オブジェクトをmanifest.xmlã«è¿½åŠ?*/ 311 if( addObjs.size() > 0 ) { 312 execManifest(); 313 } 314 } 315 316 /** 317 * 帳票処ç?‚ューをå?ã«ã€content.xmlã‚’æ›¸ãæ›ãˆã¾ã™ã? 318 * ã¾ãšã?XMLã‚’ä¸?—¦ãƒ¡ãƒ¢ãƒªä¸Šã«å±•é–‹ã—ãŸå¾Œã?シートå˜ä½ã«åˆ?§£ã—ã?ãƒ??ã‚¿ã®åŸ‹ã‚è¾¼ã¿ã‚’行ã„ã¾ã™ã? 319 * 320 * @og.rev 4.3.0.0 (2008/07/18) ペã?ジ数ã?56ã‚’è¶?ˆãŸå?åˆã?エラー処ç? 321 * @og.rev 5.0.0.2 (2009/09/15) LINECOPY機è?追åŠ? 322 * @og.rev 5.1.2.0 (2010/01/01) 処ç?—ãŸã?ージ数ã€è¡Œæ•°ã‚’Queueオブジェクトã«ã‚»ãƒ?ƒˆ(シート数ã?56ã‚’è¶?ˆãŸå?åˆã?対å¿? 323 * @og.rev 5.1.7.0 (2010/06/01) è¤?•°ã‚·ãƒ¼ãƒˆå¯¾å¿? 324 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 325 * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ã??åˆã?処ç?¿½åŠ? 326 * @og.rev 5.7.6.3 (2014/05/23) PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ã??åˆã?ã€FIRST雛形ã¸ã®é©ç”¨ 327 */ 328 private void execContent() { 329 String fileName = path + "content.xml"; 330 String content = readOOoXml( fileName ); 331 // ファイルã®è§£æžã—ã€ã‚·ãƒ¼ãƒ?行å˜ä½ã«åˆ?§£ 332 String[] tags = tag2Array( content, BODY_START_TAG, BODY_END_TAG ); 333 334 // 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 335 // content.xmlã®ãƒ˜ãƒƒãƒ??部åˆ??ã¿æ›¸ãå?ã? 336 String contentHeader = tags[0]; 337 BufferedWriter bw = null; 338 try { 339 bw = getWriter( fileName ); 340 bw.write( xmlHeader ); 341 bw.write( '\n' ); 342 bw.write( contentHeader ); 343 bw.flush(); 344 } 345 catch ( IOException ex ) { 346 queue.addMsg( "[ERROR]PARSE:error occurer while content.xml(header) " + fileName + HybsSystem.CR ); 347 throw new HybsSystemException( ex ); 348 } 349 finally { 350 Closer.ioClose( bw ); 351 bw = null; 352 } 353 354 String contentFooter = tags[1]; 355 List<OdsSheet> firstSheets = new ArrayList<OdsSheet>(); 356 Map<String, OdsSheet> sheets = new HashMap<String,OdsSheet>(); 357 OdsSheet defaultSheet = null; 358 for( int i = 2; i < tags.length; i++ ) { 359 OdsSheet sheet = new OdsSheet(); 360 // sheet.analyze( tags[i] ); 361 sheet.analyze( tags[i],queue.getBody().getRowCount() ); // 5.0.0.2 (2009/09/15) 362 // 5.1.7.0 (2010/06/01) è¤?•°ã‚·ãƒ¼ãƒˆå¯¾å¿? 363 String sheetName = sheet.getSheetName(); 364 if( sheetName.startsWith( FIRST_PAGE_NAME ) ) { 365 firstSheets.add( sheet ); 366 } 367 else { 368 sheets.put( sheetName, sheet ); 369 // ä¸?•ªåˆã‚ã«è¦‹ã¤ã‹ã£ãŸè¡¨ç´™ä»¥å¤–ã?シートをãƒ?ƒ•ォルトシートã¨ã—ã¦è¨å®? 370 if( defaultSheet == null ) { 371 defaultSheet = sheet; 372 } 373 } 374 375 // 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 376 if( !isNeedsReparse && contentHeader.indexOf( "=\"" + sheet.getOrigSheetName() + "." ) >= 0 ) { 377 isNeedsReparse = true; 378 } 379 380 // 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 381 pageNameMap.put( sheet.getOrigSheetName(), new ArrayList<String>() ); 382 } 383 384 // content.xmlã®æ›¸ãå?ã? 385 try { 386 // 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 387 if( isNeedsReparse ) { 388 // ヘッãƒ??ã‚’å?パã?スã™ã‚‹å ´åˆã?ã€ã?ãƒ?‚£éƒ¨åˆ?‚’ 389 // content.xml.tmpã«æ›¸ãå?ã—ã¦ã€å¾Œã§ãƒžã?ジã™ã‚‹ 390 bw = getWriter( fileName + ".tmp" ); 391 getRepStyleList( contentHeader ); 392 } 393 else { 394 // ヘッãƒ??ã‚’å?パã?スã™ã—ãªã??åˆã?ã€ã?ãƒ?‚£éƒ¨åˆ?‚’ 395 // content.xml追åŠ?ƒ¢ãƒ¼ãƒ‰ã§æ›¸ãè¾¼ã¿ã™ã‚‹ 396 bw = getWriter( fileName, true ); 397 } 398 399 // 5.7.6.3 (2014/05/23) PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ã?‹ã©ã?‹ã€? 400 if( queue.isUseSheetName() ) { 401 sheetNameClm = queue.getBody().getColumnNo( PAGE_BREAK, false ); 402 } 403 404 // 表紙ã?ージã®å‡ºåŠ? 405 if( queue.getExecPagesCnt() == 0 ) { 406 for ( OdsSheet firstSheet : firstSheets ) { 407 if ( currentBaseRow >= queue.getBody().getRowCount() ) { 408 break; 409 } 410 writeParsedSheet( firstSheet, bw ); 411 } 412 } 413 414 // 5.1.7.0 (2010/06/01) è¤?•°ã‚·ãƒ¼ãƒˆå¯¾å¿? 415 sheetBreakClm = queue.getBody().getColumnNo( SHEET_BREAK, false ); 416 417 // 5.7.6.3 (2014/05/23) 表紙ã?ージもã?PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ã€? 418 // // 5.7.6.2 (2014/05/16) PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ã?‹ã©ã?‹ã€? 419 // if( queue.isUseSheetName() ) { 420 // sheetNameClm = queue.getBody().getColumnNo( PAGE_BREAK, false ); 421 // } 422 423 // 繰り返ã—ペã?ジã®å‡ºåŠ? 424 while ( currentBaseRow < queue.getBody().getRowCount() ) { 425 // 4.3.0.0 (2008/07/18) ペã?ジ数ã?56ã‚’è¶?ˆãŸå?åˆã«ã‚¨ãƒ©ãƒ¼ã¨ã™ã‚‹ 426 // 5.1.2.0 (2010/01/01) 256シートをè¶?ˆãŸå?åˆã?対å¿? 427 if( pages >= ExecQueue.MAX_SHEETS_PER_FILE ) { 428 queue.setEnd( false ); 429 break; 430 } 431 432 OdsSheet sheet = null; 433 if( sheetBreakClm >= 0 ) { 434 String sheetName = queue.getBody().getValue( currentBaseRow, sheetBreakClm ); 435 if( sheetName != null && sheetName.length() > 0 ) { 436 sheet = sheets.get( sheetName ); 437 } 438 } 439 if( sheet == null ) { sheet = defaultSheet; } 440 441 writeParsedSheet( sheet, bw ); 442 } 443 444 // 5.1.2.0 (2010/01/01) 256シートをè¶?ˆãŸå?åˆã?対å¿? 445 queue.addExecPageCnt( pages ); 446 queue.setExecRowCnt( currentBaseRow ); 447 448 // フッター 449 bw.write( contentFooter ); 450 bw.flush(); 451 } 452 catch ( IOException ex ) { 453 queue.addMsg( "[ERROR]PARSE:error occurer while write Parsed Sheet " + fileName + HybsSystem.CR ); 454 throw new HybsSystemException( ex ); 455 } 456 finally { 457 Closer.ioClose( bw ); 458 } 459 } 460 461 /** 462 * シートå˜ä½ã«ãƒ‘ã?スã•ã‚ŒãŸæ–‡æ›¸ãƒ??タを書ãè¾¼ã¿ã¾ã? 463 * 出力ã•れるシートåã«ã¯ã€ã?ージ番å·ã¨åŸºåº•ã¨ãªã‚‹è¡Œç•ªå·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 464 * 465 * @og.rev 4.2.4.0 (2008/07/04) 行å˜ä½ã«ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚?‚ˆã?«å¤‰æ›´ 466 * @og.rev 5.2.0.0 (2010/09/01) 表紙ã?å ´åˆã?ã€BODY部åˆ??ãƒ??ã‚¿ãŒå«ã¾ã‚Œã¦ã?ªãã¦ã‚‚OK 467 * @og.rev 5.2.1.0 (2010/10/01) シートå定義対å¿? 468 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 469 * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ã??åˆã?処ç?¿½åŠ? 470 * @og.rev 5.7.6.3 (2014/05/23) FIRST雛形シートåãŒã?FIRST**** ã®å ´åˆã?**** 部åˆ?‚’シートåã«ä½¿ã?? 471 * 472 * @param sheet 473 * @param bw 474 * @throws IOException 書ãè¾¼ã¿ã«å¤±æ•—ã—ãŸå?å? 475 */ 476 private void writeParsedSheet( final OdsSheet sheet, final BufferedWriter bw ) throws IOException { 477 // シートå 478 String outputSheetName = null; 479 480 // 5.7.6.2 (2014/05/16) PAGEBREAKカラãƒ??値をã?シートåã¨ã—ã¦ä½¿ã?‹ã©ã?‹ã€? 481 if( sheetNameClm >= 0 ) { 482 String sheetName = queue.getBody().getValue( currentBaseRow, sheetNameClm ); 483 if( sheetName != null ) { 484 outputSheetName = sheetName; 485 } 486 } 487 488 // 5.7.6.3 (2014/05/23) FIRST雛形シートåãŒã?FIRST**** ã®å ´åˆã?**** 部åˆ?‚’シートåã«ä½¿ã?? 489 if( outputSheetName == null ) { 490 String sheetName = sheet.getSheetName(); 491 if( sheetName.startsWith( FIRST_PAGE_NAME ) ) { 492 sheetName = sheetName.substring( FIRST_PAGE_NAME.length() ).trim(); 493 // å°ç´°å·¥ã€?FIRST_****" ã®å ´åˆã?ã€?_" を外ã™ã€‚é•·ã•ï¼åˆ¤å®šã?å‰ã«è¡Œã†ã€? 494 if( sheetName.startsWith( "_" ) ) { sheetName = sheetName.substring( 1 ); } 495 // é•·ã•ï¼ã?å ´åˆï¼ˆä¾‹ãˆã°ã€FIRSTã?‘ã¨ã‹ï¼‰ã?ã€è¨å®šã—ãªã?? 496 if( sheetName.length() > 0 ) { outputSheetName = sheetName; } 497 } 498 } 499 500 // 従æ¥ã‹ã‚‰ã‚るシートåã®å€¤ 501 if( outputSheetName == null ) { 502 if( sheet.getConfSheetName() == null ) { 503 // outputSheetName = "Page" + ( queue.getExecPagesCnt() + pages ) + "_" + "Row" + currentBaseRow + ""; 504 outputSheetName = "Page" + ( queue.getExecPagesCnt() + pages ) + "_Row" + currentBaseRow ; 505 } 506 else { 507 // outputSheetName = sheet.getConfSheetName() + queue.getExecPagesCnt() + pages + 1 ; 508 outputSheetName = sheet.getConfSheetName() + ( queue.getExecPagesCnt() + pages + 1 ) ; 509 } 510 } 511 // ペã?ジブレイク変数をå?期化 512 isPageBreak = false; 513 514 // シートã?ヘッãƒ??部åˆ?‚’書ãè¾¼ã¿(シートåã‚‚æ›¸ãæ›ã? 515 String headerStr = sheet.getHeader().replace( SHEET_NAME_START + sheet.getOrigSheetName(), SHEET_NAME_START + outputSheetName ); 516 517 // å°åˆ·ç¯?›²æŒ?®šéƒ¨åˆ??シートåを変更 518 // 4.3.3.5 (2008/11/08) 空白ペã?ジ出力ã?対ç–ã?å°åˆ·ç¯?›²ã®ã‚·ãƒ¼ãƒˆåæ›¸ãæ›ãˆã‚’追åŠ? 519 int printRangeStart = headerStr.indexOf( PRINT_RANGE_START ); 520 if( printRangeStart >= 0 ) { 521 int printRangeEnd = headerStr.indexOf( PRINT_RANGE_END, printRangeStart + PRINT_RANGE_START.length() ); 522 String rangeStr = headerStr.substring( printRangeStart, printRangeEnd ); 523 rangeStr = rangeStr.replace( sheet.getOrigSheetName(), outputSheetName ); 524 headerStr = headerStr.substring( 0, printRangeStart ) + rangeStr + headerStr.substring( printRangeEnd ); 525 } 526 527 bw.write( headerStr ); 528 529 // シートã?ボディ部åˆ?‚’書ã込㿠530 String[] rows = sheet.getRows(); 531 for( int i = 0; i < rows.length; i++ ) { 532 // 4.3.4.4 (2009/01/01) 533 writeParsedRow( rows[i], bw, sheet.getOrigSheetName(), outputSheetName ); 534 } 535 // {@XXXX}ãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¦ã?ªã??åˆã?エラー 536 // 5.2.0.0 (2010/09/01) 表紙ã?å ´åˆã?ã€BODY部åˆ??ãƒ??ã‚¿ãŒå«ã¾ã‚Œã¦ã?ªãã¦ã‚‚OK 537 if( currentBaseRow == currentMaxRow && !sheet.getOrigSheetName().startsWith( FIRST_PAGE_NAME ) ) { 538 queue.addMsg( "[ERROR]PARSE:No Data defined on Template ODS(" + queue.getListId() + ")" + HybsSystem.CR ); 539 throw new HybsSystemException(); 540 } 541 currentBaseRow = currentMaxRow; 542 543 // シートã?フッター部åˆ?‚’書ã込㿠544 bw.write( sheet.getFooter() ); 545 546 pages++; 547 548 // 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 549 pageNameMap.get( sheet.getOrigSheetName() ).add( outputSheetName ); 550 } 551 552 /** 553 * 行å˜ä½ã«ãƒ‘ã?スã•ã‚ŒãŸæ–‡æ›¸ãƒ??タを書ãè¾¼ã¿ã¾ã? 554 * 555 * @og.rev 4.2.3.1 (2008/06/19) 関数エラーを表示ã•ã›ãªã?Ÿã‚ã?ISERROR関数を埋ã‚込㿠556 * @og.rev 4.2.4.0 (2008/07/04) 行å˜ä½ã«ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚?‚ˆã?«å¤‰æ›´ 557 * @og.rev 4.3.0.0 (2008/07/17) ?›ï¼?¨?ã?æ•´åˆæ?ãƒã‚§ãƒ?‚¯è¿½åŠ? 558 * @og.rev 4.3.0.0 (2008/07/22) 行最後ã??›ï¼?½æ•´åˆæ?エラーãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°è¿½åŠ? 559 * @og.rev 4.3.3.5 (2008/11/08) ç”»åƒã?å‹•çš„ãªå…¥ã‚Œæ›¿ãˆã«å¯¾å¿? 560 * @og.rev 5.1.8.0 (2010/07/01) パã?ス方法ã?å†?ƒ¨å®Ÿè£?¤‰æ›´ 561 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 562 * @og.rev 5.4.2.0 (2011/12/01) ペã?ジブレイクã€ã‚·ãƒ¼ãƒˆãƒ–レイクä¸ã§ã‚‚ã?ージエンドカãƒ?ƒˆãŒé©ç”¨ã•れるよã?«ã™ã‚‹ã€? 563 * @og.rev 5.6.3.1 (2013/04/05) æ¡ä»¶ä»˜æ›¸å¼ã?属æ?終äº?–‡å—対å¿? 564 * 565 * @param row 566 * @param bw 567 * @param sheetNameOrig 568 * @param sheetNameNew 569 * @throws IOException 書ãè¾¼ã¿ã«å¤±æ•—ã—ãŸå?å? 570 */ 571 private void writeParsedRow( final String row, final BufferedWriter bw, final String sheetNameOrig, final String sheetNameNew ) throws IOException { 572 isPageEndCut = false; 573 574 String rowStr = new TagParser() { 575 @Override 576 protected void exec( final String str, final StringBuilder buf, final int offset ) { 577 String key = TagParser.checkKey( str, buf ); 578 579 // 4.3.0.0 (2008/07/15) "<"ãŒå?ã£ã¦ã?Ÿå ´åˆã«ã¯{@䏿•´å?エラー 580 if( key.indexOf( '<' ) >= 0 ){ 581 queue.addMsg( "[ERROR]PARSE:{@ã¨}ã®æ•´åˆæ?ãŒä¸æ£ã§ã™ã?変数å†??特定ã?æ–?—å?ã«æ›¸å¼è¨å®šãŒã•れã¦ã?‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã?ã‚ー=" + key + HybsSystem.CR ); 582 throw new HybsSystemException(); 583 } 584 585 // QRコードã?処ç??処ç?¾Œã?offsetãŒé?ã‚?Ÿã‚ã?offsetã‚’å?ã‚»ãƒ?ƒˆ 586 if( key.startsWith( QRCODE_PREFIX ) ) { 587 setOffset( makeQRImage( row, offset, key.substring( QRCODE_PREFIX.length() ), buf ) ); 588 } 589 // ç”»åƒç½®ãæ›ãˆã?処ç??処ç?¾Œã?offsetãŒé?ã‚?Ÿã‚ã?offsetã‚’å?ã‚»ãƒ?ƒˆ 590 else if( key.startsWith( IMG_PREFIX ) ) { 591 setOffset( changeImage( row, offset, key.substring( IMG_PREFIX.length() ), buf ) ); 592 } 593 // コメンãƒ?アノテーション)ã«ã‚ˆã‚‹ç½®ãæ›ãˆå?ç??処ç?¾Œã?offsetãŒé?ã‚?Ÿã‚ã?offsetã‚’å?ã‚»ãƒ?ƒˆ 594 else if( key.startsWith( ANNOTATION_PREFIX ) ) { 595 setOffset( parseByAnnotation( row, offset, key.substring( ANNOTATION_PREFIX.length() ), buf ) ); 596 } 597 else { 598 String val = getValue( key ); 599 // 5.5.2.4 (2012/05/16) String key ã¯ä½¿ã‚れã¦ã?ªã??ã§ã€å‰Šé™¤ã—ã¾ã™ã? 600 changeType( row, offset, val, getNativeType( key, val ), buf ); 601 buf.append( val ); 602 } 603 604 // 処ç?¡ŒãŒãƒšã?ジエンドカãƒ?ƒˆã®å¯¾è±¡ã? 605 if( queue.isFgcut() && PAGE_END_CUT.equals( key ) ) { 606 isPageEndCut = true; 607 } 608 } 609 }.doParse( row, VAR_START, VAR_END, false ); 610 611 //==== ã“ã“ã‹ã‚‰ã¯å¾Œå?ç?========================================================= 612 /* 613 * ペã?ジエンドカãƒ?ƒˆã®åˆ¤å®šã?æœ?¾Œã§å‡¦ç?™ã‚‹ã? 614 * {@PAGEENDCUT}ãŒè¡Œã?æœ??ã«æ›¸ã‹ã‚Œã¦ã?‚‹å ´åˆã?ã€OVERFLOWã«ãªã£ã¦ã?ªã?¯èƒ½æ€§ã? 615 * ã‚ã‚‹ãŸã‚行ã?途ä¸ã§ã¯åˆ¤æ–ã§ããªã? 616 */ 617 // 5.4.2.0 (2011/12/01) シートブレイクä¸ã§ã‚‚ã?ージエンドカãƒ?ƒˆãŒé©ç”¨ã•れるよã?«ã™ã‚‹ã€? 618 // (通常ã®ãƒšã?ジブレイクã¯å…ˆèªã¿åˆ¤å®šã?ãŸã‚ペã?ジエンドカãƒ?ƒˆã™ã‚‹ã¨ã€ãƒ–レイク発生行è?身ã? 619 // 削除ã•れã¦ã—ã¾ã?Ÿã‚ç¾æ™‚点ã§ã¯æœªå¯¾å¿? 620 if( isPageEndCut && ( status == OVERFLOW || ( sheetBreakClm >= 0 && isPageBreak ) ) ) { 621 // ペã?ジエンドカãƒ?ƒˆã®å ´åˆã?ã€?žè¡¨ç¤ºçŠ¶æ…‹ã«ã™ã‚‹ã€? 622 rowStr = rowStr.replace( ROW_START_TAG, ROW_START_TAG_INVISIBLE ) ; 623 } 624 625 /* 626 * オブジェクトã§å®šç¾©ã•れã¦ã?‚‹ãƒ??ブルåを変更 627 */ 628 if( rowStr.indexOf( OBJECT_SEARCH_STR ) >= 0 ) { 629 rowStr = rowStr.replace( OBJECT_SEARCH_STR + sheetNameOrig, OBJECT_SEARCH_STR + sheetNameNew ); 630 } 631 632 /* 633 * 関数エラーを表示ã•れãªã?Ÿã‚ã?ISERROR関数を埋ã‚込㿠4.2.3.1 (2008/06/19) 634 */ 635 rowStr = replaceOoocError( rowStr ); 636 637 /* 638 * グラフをシート毎ã«ã‚³ãƒ”ã? 5.1.8.0 (2010/07/01) 639 */ 640 rowStr = replaceGraphInfo( rowStr, sheetNameOrig, sheetNameNew ); 641 642 /* 643 * アノテーション(コメンãƒ?を削除 5.1.8.0 (2010/07/01) 644 * (コメントãŒå˜åœ¨ã™ã‚‹ã¨èµ·å‹•ãŒç•°å¸¸ã«é?ãªã‚? 645 */ 646 if( rowStr.indexOf( ANNOTATION_START_TAG ) >= 0 ) { 647 rowStr = new TagParser() {}.doParse( rowStr, ANNOTATION_START_TAG, ANNOTATION_END_TAG ); 648 } 649 650 /* 651 * æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿?5.2.2.0 (2010/11/01) 652 * ãƒ??ブルå†?«å˜åœ¨ã™ã‚‹ã‚¹ã‚¿ã‚¤ãƒ«åç§°ã‚’æ›¸ãæ›ã? 653 */ 654 if( isNeedsReparse ) { 655 for( String name : repStyleList ) { 656 // 5.6.3.1 (2013/04/05) 属æ?終äº?¿½åŠ? 657 if( rowStr.indexOf( TABLE_STYLE_NAME_START_TAG + name + TABLE_STYLE_NAME_END_TAG ) >= 0 ) { 658 rowStr = rowStr.replace( TABLE_STYLE_NAME_START_TAG + name + TABLE_STYLE_NAME_END_TAG, TABLE_STYLE_NAME_START_TAG + name + "_" + sheetNameNew + TABLE_STYLE_NAME_END_TAG ); 659 } 660 } 661 662 } 663 //============================================================================== 664 665 bw.write( rowStr ); 666 } 667 668 /** 669 * 帳票ãƒ??ã‚¿ã«å¿œã˜ã¦ã€ã‚«ãƒ©ãƒ??属æ?を変更(æ–?—型⇒数値åž?ã«å¤‰æ›´ã—ã¾ã™ã? 670 * 671 * @og.rev 5.1.8.0 (2010/07/01) æ–°è¦ä½œæ? 672 * @og.rev 5.5.2.4 (2012/05/16) String key ã¯ä½¿ã‚れã¦ã?ªã??ã§ã€å‰Šé™¤ã—ã¾ã™ã? 673 * 674 * @param row 675 * @param curOffset 676 * @param val 677 * @param type 678 * @param sb 679 */ 680 private void changeType( final String row, final int curOffset 681 , final String val, final NativeType type, final StringBuilder sb ) { 682 if( val == null || val.length() == 0 ) { 683 return; 684 } 685 // æ›¸ãæ›ãˆå¯¾è±¡ã¯æ•°å€¤åž‹ã?ã¿ 686 if( type != NativeType.INT && type != NativeType.LONG && type != NativeType.DOUBLE ) { 687 return; 688 } 689 // 処ç?¯¾è±¡ãŒã‚»ãƒ«ã§ãªã?オブジェクãƒ?ã¯æ›¸ãæ›ãˆã—ãªã? 690 if( !isCell( row, curOffset ) ) { 691 return; 692 } 693 694 // ã‚»ãƒ«ã®æ–?—ãŒ{@xxxx_n}ã®ã¿ã§ã‚ã£ãŸå?åˆã ã‘ã?数値定義ã®åˆ¤å®šã‚’行ã†ã€? 695 // (関数å†?«{@xxxx_n}ç‰ãŒã‚ã£ãŸå?åˆã?ã€åˆ¤å®šã—ãªã?<text:p>{@xxxx_n}</text:p>ã®å ´åˆã?ã¿)) 696 if( sb.lastIndexOf( TEXT_START_TAG ) + TEXT_START_TAG.length() == sb.length() 697 && row.indexOf( TEXT_END_TAG, curOffset ) == curOffset ) { 698 int typeIdx = sb.lastIndexOf( TABLE_CELL_STRING_TYPE ); 699 int cellIdx = sb.lastIndexOf( TABLE_CELL_START_TAG ); 700 if( typeIdx >= 0 && cellIdx >= 0 && typeIdx > cellIdx ) { 701 // office:value-type="string" ã‚?office:value-type="float" office:value="xxx" ã«å¤‰æ› 702 sb.replace( typeIdx, typeIdx + TABLE_CELL_STRING_TYPE.length() 703 ,TABLE_CELL_FLOAT_TYPE + " " + TABLE_CELL_FLOAT_VAL_START + val + TABLE_CELL_FLOAT_VAL_END ); 704 } 705 } 706 } 707 708 /** 709 * å¼•æ•°ã«æŒ?®šã•ã‚ŒãŸæ–?—å?ã®Nativeタイプを返ã—ã¾ã™ã? 710 * 711 * リソース使用時ã?ã€å„DBTypeã§å®šç¾©ã•れãŸNativeタイプをã€? 712 * 未使用時ã?ã€å?ã‹ã‚‰Nativeタイプをå–å¾—ã—ã¦è¿”ã—ã¾ã™ã? 713 * 714 * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) ã®ãƒ¡ã‚½ãƒ?ƒ‰ã‚’使用ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€? 715 * 716 * @param key 717 * @param val 718 * 719 * @return NATIVEã®åž‹ã?è˜åˆ¥ã‚³ãƒ¼ãƒ? 720 * @see org.opengion.fukurou.model.NativeType 721 */ 722 private NativeType getNativeType( final String key, final String val ) { 723 if( val == null || val.length() == 0 ) { 724 return NativeType.STRING; 725 } 726 727 NativeType type = null; 728 if( queue.isFglocal() ) { 729 String name = key; 730 int conOffset = key.lastIndexOf( VAR_CON ); 731 if( conOffset >= 0 ) { 732 int rownum = -1; 733 try { 734 rownum = Integer.valueOf( name.substring( conOffset + VAR_CON.length(), name.length() ) ); 735 } 736 // '_'以é™ã?æ–?—ãŒæ•°å—ã§ãªã??åˆã?ã€?_'以é™ã?æ–?—もカラãƒ?ã®ä¸?ƒ¨ã¨ã—ã¦æ‰±ã? 737 catch ( NumberFormatException ex ) {} 738 if( rownum >= 0 ) { 739 name = name.substring( 0, conOffset ); 740 } 741 } 742 int col = queue.getBody().getColumnNo( name, false ); 743 if( col >= 0 ) { 744 type = queue.getBody().getDBColumn( col ).getNativeType(); 745 } 746 } 747 748 if( type == null ) { 749 // ,ã¯å‰Šé™¤ã—ãŸçŠ¶æ…‹ã§åˆ¤å®? 750 String repVal = val.replace( ",", "" ); 751 type = NativeType.getType( repVal ); // 5.1.8.0 (2010/07/01) NativeType#getType(String) ã®ãƒ¡ã‚½ãƒ?ƒ‰ã‚’使用 752 // æ•´æ•°åž‹ã§ã€?nnnã¨ãªã£ã¦ã?‚‹å ´åˆã?ã€æ–‡å—å?ã‚’ã—ã¦æ‰±ã? 753 if( type == NativeType.INT && repVal.length() >= 2 && repVal.charAt(0) == '0' ) { 754 type = NativeType.STRING; 755 } 756 } 757 758 return type; 759 } 760 761 /** 762 * コメンãƒ?アノテーションã«ã‚ˆã‚‹ç½®ãæ›ãˆå?ç?‚’行ã„ã¾ã? 763 * ã“ã?処ç?§ã¯ã€offsetã‚’é?ã‚ã‚‹ãŸã‚ã€æˆ»ã‚Šå?ã¨ã—ã¦å‡¦ç?¾Œã?offsetã‚’è¿”ã—ã¾ã™ã? 764 * 765 * @og.rev 5.1.8.0 (2010/07/01) æ–°è¦ä½œæ? 766 * 767 * @param row 768 * @param curOffset 769 * @param key 770 * @param sb 771 * 772 * @return 処ç?¾Œã?オフセãƒ?ƒˆ 773 */ 774 private int parseByAnnotation( final String row, final int curOffset, final String key, final StringBuilder sb ) { 775 int offset = curOffset; 776 boolean isCell = isCell( row, offset ); 777 778 // セルã®å ´åˆã?ã¿ç½®ãæ›ãˆã?判定を行ã†(オブジェクトã?å ´åˆã?判定ã—ãªã? 779 if( isCell ) { 780 int cellStrIdx = sb.lastIndexOf( TABLE_CELL_START_TAG, offset ); 781 // office:value-type="float" office:value="xxx" ã‚?office:value-type="string" ã«å¤‰æ› 782 // 数値型ã?å ´åˆã?ã€å¾Œã§å†åº¦å¤‰æ›ã‚’行ã†ã€? 783 // (æ–?—åž‹ã«å¤‰æ›ã—ã¦ãŠã‹ãªã?¨ã€å?ãŒnullã®å ´åˆã§ã‚?0"ãŒè¡¨ç¤ºã•れã¦ã—ã¾ã?Ÿã‚? 784 int floatIdx = sb.indexOf( TABLE_CELL_FLOAT_TYPE, cellStrIdx ); 785 if( floatIdx >= 0 ) { 786 sb.replace( floatIdx, floatIdx + TABLE_CELL_FLOAT_TYPE.length(), TABLE_CELL_STRING_TYPE ); 787 788 int floatStrIdx = sb.indexOf( TABLE_CELL_FLOAT_VAL_START, floatIdx ); 789 if( floatStrIdx >= 0 ) { 790 int floatEndIdx = sb.indexOf( TABLE_CELL_FLOAT_VAL_END, floatStrIdx + TABLE_CELL_FLOAT_VAL_START.length() ); 791 if( floatEndIdx >= 0 ) { 792 sb.replace( floatStrIdx, floatEndIdx + TABLE_CELL_FLOAT_VAL_END.length(), "" ); 793 } 794 } 795 } 796 } 797 798 // アノテーションã®å€¤ã‹ã‚‰ã€ã‚»ãƒ«ã®æ–?—å?部åˆ?‚’ç½®ãæ›ã? 799 int endIdx = isCell ? row.indexOf( TABLE_CELL_END_TAG, offset ) : row.indexOf( DRAW_END_KEY, offset ); 800 if( endIdx >= 0 ) { 801 int textStrIdx = row.indexOf( TEXT_START_ANO_TAG, offset ); 802 // セルã®ã‚³ãƒ¡ãƒ³ãƒˆã?å ´åˆã?<text:pã§æ¤œç´¢ã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã?ãƒ?‚ã‚¹ãƒˆãŒæ¤œç´¢ã•れã¦ã?‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã? 803 // ã“ã?ãŸã‚ã€ã‚»ãƒ«ã®<text:pãŒè¦‹ã¤ã‹ã‚‹ã¾ã§æ¤œç´¢ã‚’繰り返㙠804 if( isCell ) { 805 while( !isCell( row, textStrIdx ) && textStrIdx >= 0 ) { 806 textStrIdx = row.indexOf( TEXT_START_ANO_TAG, textStrIdx + 1 ); 807 } 808 } 809 if( textStrIdx >= 0 && textStrIdx < endIdx ) { 810 // セルã®ã‚³ãƒ¡ãƒ³ãƒˆã?å ´åˆã?</text:p>ã§æ¤œç´¢ã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã?ãƒ?‚ã‚¹ãƒˆãŒæ¤œç´¢ã•れã¦ã?‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã? 811 // ã“ã?ãŸã‚ã€ã‚»ãƒ«ã®</text:p>ãŒè¦‹ã¤ã‹ã‚‹ã¾ã§æ¤œç´¢ã‚’繰り返㙠812 int textEndIdx = row.lastIndexOf( TEXT_END_TAG, endIdx ); 813 if( isCell ) { 814 while( !isCell( row, textEndIdx ) && textEndIdx >= 0 ) { 815 textEndIdx = row.lastIndexOf( TEXT_END_TAG, textEndIdx - 1 ); 816 } 817 } 818 if( textEndIdx >= 0 && textStrIdx < textEndIdx && textEndIdx < endIdx ) { 819 // <text:p xxxx> ã® xxxx> ã®éƒ¨åˆ?style定義ãªã©)を書ã込㿠820 int textStyleEnd = row.indexOf( TEXT_START_END_ANO_TAG, textStrIdx + TEXT_START_ANO_TAG.length() ) + TEXT_START_END_ANO_TAG.length(); 821 sb.append( row.substring( offset, textStyleEnd ) ); 822 823 // <text:pã®ä¸èº«(spanã‚¿ã‚°ãªã©ã‚’å–り除ã?ŸçŠ¶æ…‹ã?æ–?—å? 824 String textVal = TagParser.checkKey( row.substring( textStyleEnd, textEndIdx ), sb ); 825 // å–å¾—ã—ãŸãƒ†ã‚ストå?ã«ã‚¿ã‚°æ–?—ãŒå«ã¾ã‚Œã¦ã?‚‹å ´åˆã?ã€å?ç?—ãªã? 826 if( textVal.indexOf( '<' ) < 0 && textVal.indexOf( '>' ) < 0 ) { 827 // <text:p xxxx>を書ãå?ã? 828 String val = getValue( key ); 829 // 5.5.2.4 (2012/05/16) String key ã¯ä½¿ã‚れã¦ã?ªã??ã§ã€å‰Šé™¤ã—ã¾ã™ã? 830 changeType( row, textEndIdx, val, getNativeType( key, textVal ), sb ); 831 sb.append( val ); 832 } 833 offset = textEndIdx; 834 } 835 } 836 } 837 838 return offset; 839 } 840 841 /** 842 * ç¾åœ¨ã®ã‚ªãƒ•ã‚»ãƒ?ƒˆãŒã‚»ãƒ«ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã? 843 * 844 * trueã®å ´åˆã?セルをã?falseã®å ´åˆã?オブジェクトをæ„味ã—ã¾ã™ã? 845 * 846 * セルã¨ã—ã¦åˆ¤å®šã•れるãŸã‚ã®æ¡ä»¶ã¯ä»¥ä¸‹ã?通りã§ã™ã? 847 * ç¾åœ¨ã®offsetを基準ã¨ã—ã¦ã€? 848 * â‘?‰ã«<draw:(オブジェクトã?é–‹å§?ãŒè¦‹ã¤ã‹ã‚‰ãªã? 849 * â‘¡å‰ã«<table:table-cell(セルã®å§‹ã¾ã‚?ã?draw:(オブジェクトã?å§‹ã¾ã‚?より後方ã«ã‚ã‚‹ 850 * ③後ã«</draw:(オブジェクトã?終ã‚ã‚?ãŒè¦‹ã¤ã‹ã‚‰ãªã? 851 * ④後ã«</draw:(オブジェクトã?終ã‚ã‚?ã?/table:table-cell>(セルã®çµ‚ã‚ã‚?より後方ã«ã‚ã‚‹ 852 * 853 * @param row 854 * @param offset 855 * 856 * @return ç¾åœ¨ã®ã‚ªãƒ•ã‚»ãƒ?ƒˆãŒã‚»ãƒ«ã‹ã©ã?‹(falseã®å ´åˆã?オブジェクãƒ? 857 */ 858 private boolean isCell( final String row, final int offset ) { 859 int drawStartOffset = row.lastIndexOf( DRAW_START_KEY, offset ); 860 if( drawStartOffset < 0 ) { 861 return true; 862 } 863 else { 864 int cellStartOffset = row.lastIndexOf( TABLE_CELL_START_TAG, offset ); 865 if( drawStartOffset < cellStartOffset ) { 866 return true; 867 } 868 else { 869 int drawEndOffset = row.indexOf( DRAW_END_KEY, offset ); 870 if( drawEndOffset < 0 ) { 871 return true; 872 } 873 else { 874 int cellEndOffset = row.indexOf( TABLE_CELL_END_TAG, offset ); 875 // 5.1.8.0 (2010/07/01) Avoid unnecessary if..then..else statements when returning a boolean 876 return cellEndOffset >= 0 && cellEndOffset < drawEndOffset ; 877 } 878 } 879 } 880 } 881 882 /** 883 * QRコードを作æ?ã—ã¾ã™ã? 884 * ã“ã?処ç?§ã¯ã€offsetã‚’é?ã‚ã‚‹ãŸã‚ã€æˆ»ã‚Šå?ã¨ã—ã¦å‡¦ç?¾Œã?offsetã‚’è¿”ã—ã¾ã™ã? 885 * 886 * @og.rev 4.3.1.1 (2008/08/23) mkdirs ã®æˆ»ã‚Šå?判å®? 887 * @og.rev 4.3.3.5 (2008/11/08) ↑ã?判定ã?å˜åœ¨ãƒã‚§ãƒ?‚¯ã‚’行ã£ã¦ã‹ã‚‰å‡¦ç?™ã‚‹ã?ファイルåã«å‡¦ç?¡Œã‚’ä»˜åŠ 888 * @og.rev 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 889 * 890 * @param row 891 * @param curOffset 892 * @param key 893 * @param sb 894 * 895 * @return 処ç?¾Œã?オフセãƒ?ƒˆ 896 */ 897 private int makeQRImage( final String row, final int curOffset, final String key, final StringBuilder sb ) { 898 int offset = curOffset; 899 900 // {@QRCODE.XXXX}ã‹ã‚‰å®Ÿéš›ã«ç”»åƒã?ãƒ‘ã‚¹ãŒæ›¸ã‹ã‚Œã¦ã?‚‹éƒ¨åˆ?¾ã§ã‚’書ãè¾¼ã‚? 901 offset = row.indexOf( DRAW_IMG_START_TAG, offset ) + DRAW_IMG_START_TAG.length(); 902 sb.append( row.substring( curOffset, offset ) ); 903 // ç”»åƒã?パスã®çµ‚äº?‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹ã‚’求ã‚ã‚? 904 offset = row.indexOf( DRAW_IMG_HREF_END, offset ) + DRAW_IMG_HREF_END.length(); 905 906 // QRCODEã®ç”»åƒãƒ•ァイルåã‚’æ±‚ã‚æ›¸ãè¾¼ã‚? 907 // 4.3.3.5 (2008/11/08) ファイルåã«å‡¦ç?¡Œã‚’ä»˜åŠ 908 String fileName = IMG_DIR + '/' + key + "_" + currentBaseRow + QRCODE_FILETYPE; 909 sb.append( fileName ).append( DRAW_IMG_HREF_END ); 910 911 // QRCODEã«æ›¸ãè¾¼ã‚??を求ã‚ã‚? 912 String value = getValue( key ); 913 914 // QRCODEã®ä½œæ? 915 // 4.3.3.5 (2008/11/08) ファイルåã«å‡¦ç?¡Œã‚’ä»˜åŠ 916 String fileNameAbs = 917 new File( path ).getAbsolutePath() + File.separator + IMG_DIR + File.separator + key + "_" + currentBaseRow + QRCODE_FILETYPE; 918 919 // ç”»åƒãƒªãƒ³ã‚¯ãŒç„¡åйã¨ãªã£ã¦ã?‚‹å ´åˆã?ã€Picturesã®ãƒ•ォルãƒ?Œä½œæ?ã•れã¦ã?ªã?¯èƒ½æ€§ãŒã‚ã‚? 920 // 4.3.1.1 (2008/08/23) mkdirs ã®æˆ»ã‚Šå?判å®? 921 // 4.3.3.5 (2008/11/08) å˜åœ¨ãƒã‚§ãƒ?‚¯è¿½åŠ? 922 if( !new File( fileNameAbs ).getParentFile().exists() ) { 923 if( new File( fileNameAbs ).getParentFile().mkdirs() ) { 924 System.err.println( fileNameAbs + " ã® ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªä½œæ?ã«å¤±æ•—ã—ã¾ã—ãŸã€? ); 925 } 926 } 927 928 QrcodeImage qrImage = new QrcodeImage(); 929 qrImage.init( value, fileNameAbs ); 930 qrImage.saveImage(); 931 932 // 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 933 addObjs.put( fileName, QRCODE_FILETYPE.substring( 1 ) ); 934 935 // èªã¿è¾¼ã¿Offsetã‚’è¿”ã—ã¾ã? 936 return offset; 937 } 938 939 /** 940 * DBTableModelã«è¨å®šã•れãŸãƒ‘スã‹ã‚‰ç”»åƒãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã—ã€å?部ã«å–り込ã¿ã¾ã? 941 * ã“ã?処ç?§ã¯ã€offsetã‚’é?ã‚ã‚‹ãŸã‚ã€æˆ»ã‚Šå?ã¨ã—ã¦å‡¦ç?¾Œã?offsetã‚’è¿”ã—ã¾ã™ã? 942 * 943 * @og.rev 4.3.3.5 (2008/11/08) æ–°è¦è¿½åŠ? 944 * @og.rev 4.3.3.6 (2008/11/15) ç”»åƒãƒ‘スãŒå˜åœ¨ã—ãªã??åˆã?ã€ãƒªãƒ³ã‚¯ã‚¿ã‚°(draw:image)自体を削除 945 * @og.rev 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 946 * 947 * @param row 948 * @param curOffset 949 * @param key 950 * @param sb 951 * 952 * @return 処ç?¾Œã?オフセãƒ?ƒˆ 953 */ 954 private int changeImage( final String row, final int curOffset, final String key, final StringBuilder sb ) { 955 int offset = curOffset; 956 File imgFile = null; 957 958 // ç”»åƒãƒ•ァイルをèªã¿è¾¼ã‚?ƒ‘スを求ã‚ã‚? 959 String value = getValue( key ); 960 961 if( value != null && value.length() > 0 ) { 962 imgFile = new File( HybsSystem.url2dir( value ) ); 963 } 964 965 // ç”»åƒãƒ•ァイルã®ãƒ‘スãŒå?ã£ã¦ã?¦ã€å®Ÿéš›ã«ç”»åƒãŒå˜åœ¨ã™ã‚‹å ´å? 966 if( imgFile != null && imgFile.exists() ) { 967 // {@IMG.XXXX}ã‹ã‚‰å®Ÿéš›ã«ç”»åƒã?ãƒ‘ã‚¹ãŒæ›¸ã‹ã‚Œã¦ã?‚‹éƒ¨åˆ?¾ã§ã‚’書ãè¾¼ã‚? 968 offset = row.indexOf( DRAW_IMG_START_TAG, offset ) + DRAW_IMG_START_TAG.length(); 969 sb.append( row.substring( curOffset, offset ) ); 970 971 // ç”»åƒã?パスã®çµ‚äº?‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹ã‚’求ã‚ã‚? 972 offset = row.indexOf( DRAW_IMG_HREF_END, offset ) + DRAW_IMG_HREF_END.length(); 973 974 String fileNameOut = IMG_DIR + '/' + imgFile.getName(); 975 sb.append( fileNameOut ).append( DRAW_IMG_HREF_END ); 976 977 String fileNameOutAbs = 978 new File( path ).getAbsolutePath() + File.separator + IMG_DIR + File.separator + imgFile.getName(); 979 if( !new File( fileNameOutAbs ).getParentFile().exists() ) { 980 if( new File( fileNameOutAbs ).getParentFile().mkdirs() ) { 981 System.err.println( fileNameOutAbs + " ã® ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªä½œæ?ã«å¤±æ•—ã—ã¾ã—ãŸã€? ); 982 } 983 } 984 FileUtil.copy( imgFile, new File( fileNameOutAbs ) ); 985 986 // 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 987 addObjs.put( fileNameOut, getSuffix( imgFile.getName() ) ); 988 } 989 // ç”»åƒãƒ‘スãŒè¨å®šã•れã¦ã?ªã??åˆã?ç”»åƒãŒå˜åœ¨ã—ãªã??å? 990 else { 991 // {@IMG.XXXX}ã‹ã‚‰è¦‹ã¦ã€?draw:image> ... </draw:image>ã¾ã§ã‚’スã‚ãƒ??ã™ã‚‹ 992 offset = row.indexOf( DRAW_IMG_START_TAG, offset ); 993 sb.append( row.substring( curOffset, offset ) ); 994 995 offset = row.indexOf( DRAW_IMG_END_TAG, offset ) + DRAW_IMG_END_TAG.length(); 996 } 997 998 // èªã¿è¾¼ã¿Offsetã‚’è¿”ã—ã¾ã? 999 return offset; 1000 } 1001 1002 /** 1003 * 変æ›å¾Œã?行データã§å®šç¾©ã•れã¦ã?‚‹é–¢æ•°ã«ISERROR関数を埋ã‚è¾¼ã¿ã¾ã™ã? 1004 * 1005 * ã“れã¯ã€OOoã®é–¢æ•°ã®å‹•作ã¨ã—ã¦ã€ä¸æ£ãªå¼•æ•°ç‰ãŒå…¥åŠ›ã•れãŸå ´å?null値ãªã©)ã«ã€? 1006 * エラー:xxxã¨è¡¨ç¤ºã•れã¦ã—ã¾ã?Ÿã‚ã?ã“れを防ããŸã‚ã«é–¢æ•°ã‚¨ãƒ©ãƒ¼ã®ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã‚’行ã„ã€? 1007 * エラーã®å ´åˆã?ã€ç©ºç™½æ–?—ã‚’è¿”ã™ã‚ˆã†ã«ã—ã¾ã™ã? 1008 * 1009 * @og.rev 4.3.7.2 (2009/06/15) é–‹å§‹æ–‡å—ãŒå¤‰æ›´ã«ãªã£ãŸãŸã‚対å¿? 1010 * @og.rev 5.0.2.0 (2009/11/01) 関数å†??"(quot)ã¯ã€ãƒ¡ã‚¿æ–?—ã«å¤‰æ›ã™ã‚‹ 1011 * @og.rev 5.1.7.0 (2010/06/01) 関数ã®çµ‚ã‚りãŒ)出ãªã??åˆã«ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ãƒã‚°ã‚’ä¿®æ£ 1012 * @og.rev 5.1.8.0 (2010/07/01) パã?ス方法ã?å†?ƒ¨å®Ÿè£?¤‰æ›´ 1013 * 1014 * @param row 1015 * 1016 * @return 変æ›å¾Œã?行データ 1017 */ 1018 private String replaceOoocError( final String row ) { 1019 // 4.3.7.2 (2009/06/15) OOOC_FUNCTION_START3ã®æ¡ä»¶åˆ¤å®šè¿½åŠ??ã©ã¡ã‚‰ã‹åˆ?‹ã‚‰ãªã??ã§å¤‰æ•°ã§å—ã‘ã‚‹ã? 1020 final String functionStart; 1021 if( row.indexOf( OOOC_FUNCTION_START_3 ) >= 0 ) { functionStart = OOOC_FUNCTION_START_3; } 1022 else if( row.indexOf( OOOC_FUNCTION_START ) >= 0 ) { functionStart = OOOC_FUNCTION_START; } 1023 else { return row; } 1024 1025 String rowStr = new TagParser() { 1026 @Override 1027 protected boolean checkIgnore( final int strOffset, final int endOffset ) { 1028 // 5.1.7.0 (2010/06/01) 関数ã®çµ‚ã‚りãŒ)出ãªã??åˆã«ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ãƒã‚°ã‚’ä¿®æ£ 1029 // å˜ãªã‚‹è¡Œå‚ç…§ã§ã‚‚ã?of:=ã§å§‹ã¾ã‚‹ãŒã“ã?å ´åˆã?ã€?–¢æ•°ã§ãªã?Ÿã‚終ã‚りãŒ)ã§ãªã? 1030 // ã“ã?ãŸã‚ã€?ãŒè¦‹ã¤ã‹ã‚‰ãªã?¾ãŸã?ã€ã‚¿ã‚°ã®çµ‚ã‚ã‚?>)ãŒå?ã«è¦‹ã¤ã‹ã£ãŸå?åˆã?ã€ã‚¨ãƒ©ãƒ¼é–¢æ•°ã‚? 1031 // 埋ã‚è¾¼ã¾ãªã?‚ˆã?«ã™ã‚‹ã€? 1032 int tmpOffset = row.indexOf( ">", strOffset + 1 ); 1033 return endOffset >= 0 && endOffset < tmpOffset ; 1034 } 1035 1036 @Override 1037 protected void exec( final String str, final StringBuilder buf, final int offset ) { 1038 String key = str.substring( functionStart.length(), str.length() - OOOC_FUNCTION_END.length() ) + ")"; 1039 key = key.replace( "\"", """" ).replace( OOO_CR, "" ); 1040 buf.append( functionStart + "IF(ISERROR(" + key + ");"";" + key + OOOC_FUNCTION_END ); 1041 } 1042 }.doParse( row, functionStart, OOOC_FUNCTION_END ); 1043 1044 return rowStr; 1045 } 1046 1047 /** 1048 * グラフ表示ãƒ??タ部åˆ?‚’æ›´æ–°ã—ã¾ã™ã? 1049 * 1050 * @og.rev 5.1.8.0 (2010/07/01) æ–°è¦ä½œæ? 1051 * @og.rev 5.3.1.0 (2011/01/01) OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 1052 * 1053 * @param row 1054 * @param sheetOrig 1055 * @param sheetNew 1056 * 1057 * @return 変æ›å¾Œã?行データ 1058 */ 1059 private String replaceGraphInfo( final String row, final String sheetOrig, final String sheetNew ) { 1060 if( row.indexOf( GRAPH_START_TAG ) < 0 || row.indexOf( GRAPH_UPDATE_RANGE_START ) < 0 ) { return row; } 1061 1062 String rowStr = new TagParser() { 1063 @Override 1064 protected void exec( final String str, final StringBuilder buf, final int offset ) { 1065 // <draw:object ... /> ã®éƒ¨åˆ? 1066 String graphTag = str; 1067 1068 if( graphTag.indexOf( GRAPH_UPDATE_RANGE_START ) >= 0 ) { 1069 String nameOrig = TagParser.getValueFromTag( graphTag, GRAPH_HREF_START, GRAPH_HREF_END ); 1070 if( new File( path + nameOrig ).exists() ) { 1071 String nameNew = nameOrig + "_" + pages; 1072 1073 // グラフオブジェクトã?定義ファイルをコピã?(./Object X/* â‡?./Object X_n/*) 1074 FileUtil.copyDirectry( path + nameOrig, path + nameNew ); 1075 graphTag = graphTag.replace( GRAPH_HREF_START + nameOrig, GRAPH_HREF_START + nameNew ); 1076 1077 // グラフオブジェクトã?ç”»åƒã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’コピã?(./ObjectReplacements/Object X â‡?./ObjectReplacements/Object X_n) 1078 // ※実体ã?コピã?ã—ãªã?リンクã®å‚ç?を無効ã«ã—ã¦ãŠãã“ã¨ã§ã€æ¬¡å›žèµ·å‹•時ã«ã‚°ãƒ©ãƒ•ã?å†æç”»ãŒè¡Œã‚れる) 1079 graphTag = graphTag.replace( GRAPH_HREF_START + GRAPH_OBJREPL + "/" + nameOrig, GRAPH_HREF_START + GRAPH_OBJREPL + "/" + nameNew ); 1080 1081 // OpenOffice3.2対å¿?追åŠ?—ãŸç”»åƒã‚’manifest.xmlã«ç™»éŒ²ã™ã‚‹ 1082 addObjs.put( nameNew, "graph" ); 1083 1084 // グラフオブジェクトã?定義ファイルã«è¨˜è¿°ã•れã¦ã?‚‹å®šç¾©ãƒ•ァイルをパースã—ã?シートåã¨{@XXXX}ã‚’ç½®ãæ›ã? 1085 parseGraphContent( path + nameNew + File.separator + "content.xml", sheetOrig, sheetNew ); 1086 1087 // グラフã?å‚ç?ç¯?›²ã®ã‚·ãƒ¼ãƒˆåã‚’ç½®ãæ›ã? 1088 String range = TagParser.getValueFromTag( str, GRAPH_UPDATE_RANGE_START, GRAPH_UPDATE_RANGE_END ); 1089 graphTag = graphTag.replace( GRAPH_UPDATE_RANGE_START + range, GRAPH_UPDATE_RANGE_START + range.replace( sheetOrig, sheetNew ) ); 1090 } 1091 } 1092 1093 buf.append( graphTag ); 1094 } 1095 }.doParse( row, GRAPH_START_TAG, GRAPH_END_TAG ); 1096 1097 return rowStr; 1098 } 1099 1100 /** 1101 * グラフデータã®content.xmlをパースã—ã¾ã™ã? 1102 * 1103 * @og.rev 5.1.8.0 (2010/07/01) æ–°è¦ä½œæ? 1104 * 1105 * @param fileName 1106 * @param sheetOrig 1107 * @param sheetNew 1108 */ 1109 private void parseGraphContent( final String fileName, final String sheetOrig, final String sheetNew ) { 1110 String graphContent = readOOoXml( fileName ); 1111 1112 // シートåã®ç½®ãæ›ã? 1113 if( graphContent.indexOf( GRAPH_CONTENT_START ) >= 0 ) { 1114 graphContent = new TagParser() { 1115 @Override 1116 protected void exec( final String str, final StringBuilder buf, final int offset ) { 1117 buf.append( str.replace( sheetOrig, sheetNew ) ); 1118 } 1119 }.doParse( graphContent, GRAPH_CONTENT_START, GRAPH_CONTENT_END ); 1120 } 1121 1122 // {@XXXX}ã®ç½®ãæ›ã? 1123 if( graphContent.indexOf( VAR_START ) >= 0 ) { 1124 graphContent = new TagParser() { 1125 @Override 1126 public void exec( final String str, final StringBuilder buf, final int offset ) { 1127 buf.append( getHeaderFooterValue( str ) ); 1128 } 1129 }.doParse( graphContent, VAR_START, VAR_END, false ); 1130 } 1131 1132 writeOOoXml( fileName, graphContent ); 1133 } 1134 1135 /** 1136 * æŒ?®šã•れãŸã‚ーã®å€¤ã‚’è¿”ã—ã¾ã™ã? 1137 * 1138 * @og.rev 4.3.0.0 (2008/07/18) アンãƒ??スコアã®å‡¦ç?¤‰æ›´ 1139 * @og.rev 4.3.5.0 (2008/02/01) カラãƒ?ã¨è¡Œç•ªå·æ–?—ã?ä½ç½®ã¯æœ?¾Œã‹ã‚‰æ¤œç´¢ã™ã‚‹ 4.3.3.4 (2008/11/01) ä¿®æ£åˆ? 1140 * 1141 * @param key 1142 * 1143 * @return 値 1144 */ 1145 private String getValue( final String key ) { 1146 int conOffset = key.lastIndexOf( VAR_CON ); 1147 1148 String value = null; 1149 1150 if( conOffset < 0 ) { 1151 value = getHeaderFooterValue( key ); 1152 } 1153 else { 1154 String name = key.substring( 0, conOffset ); 1155 int rownum = -1; 1156 try { 1157 rownum = Integer.valueOf( key.substring( conOffset + VAR_CON.length(), key.length() ) ) + currentBaseRow; 1158 } 1159 catch ( NumberFormatException ex ) { 1160 // 4.3.0.0 (2008/07/18) エラーãŒèµ·ãã¦ã‚‚ãªã«ã‚‚ã—ãªã?? 1161 // queue.addMsg( "[ERROR]雛形ã®å¤‰æ•°å®šç¾©ãŒèª¤ã£ã¦ã?¾ã™ã?カラãƒ?=" + name + HybsSystem.CR ); 1162 // throw new Exception( ex ); 1163 } 1164 1165 // 4.3.0.0 (2008/07/18) アンãƒ??ã‚¹ã‚³ã‚¢å¾ŒãŒæ•°å—ã«å¤‰æ›ã§ããªã??åˆã?ヘッãƒ?ƒ•ãƒ?‚¿ã¨ã—ã¦èªè? 1166 if( rownum < 0 ){ 1167 value = getHeaderFooterValue( key ); 1168 } 1169 else{ 1170 value = getBodyValue( name, rownum ); 1171 } 1172 } 1173 1174 return checkValue( value ); 1175 } 1176 1177 /** 1178 * æŒ?®šã•れãŸã‚ーã®ãƒ˜ãƒƒãƒ??ã€ãƒ•ãƒ?‚¿ãƒ¼å€¤ã‚’è¿”ã—ã¾ã™ã? 1179 * 1180 * @og.rev 4.3.6.0 (2009/04/01) レンãƒ?ƒ©ãƒ¼é©ç”¨ã•れã¦ã?ªã?ƒã‚°ã‚’ä¿®æ£ 1181 * @og.rev 5.0.2.0 (2009/11/01) ãƒãƒ¼ã‚«ãƒ«ãƒªã‚½ãƒ¼ã‚¹ãƒ•ラグを使用ã—ãªã??åˆã?ã€ãƒªã‚½ãƒ¼ã‚¹å¤‰æ›ã‚’行ã‚ãªã?? 1182 * @og.rev 5.1.6.0 (2010/05/01) ペã?ジNO出力対å¿? 1183 * 1184 * @param key 1185 * 1186 * @return 値 1187 */ 1188 private String getHeaderFooterValue( final String key ) { 1189 String value = ""; 1190 1191 // 5.1.6.0 (2010/05/01) ペã?ジNO出力対å¿? 1192 if( PAGE_NO.equals( key ) ) { 1193 value = String.valueOf( pages + 1 ); 1194 } 1195 // æœ?¾Œã?行ã‹ã‚ªãƒ¼ãƒã?フãƒãƒ¼æ™‚ã?フッター 1196 else if( status >= LASTROW ) { 1197 if( queue.getFooter() != null ) { 1198 int clmno = queue.getFooter().getColumnNo( key, false ); 1199 if( clmno >= 0 ) { 1200 value = queue.getFooter().getValue( 0, clmno ); 1201 // 5.0.2.0 (2009/11/01) ãƒãƒ¼ã‚«ãƒ«ãƒªã‚½ãƒ¼ã‚¹ãƒ•ラグを使用ã—ãªã??åˆã?ã€ãƒªã‚½ãƒ¼ã‚¹å¤‰æ›ã‚’行ã‚ãªã?? 1202 if( queue.isFglocal() ) { 1203 // 4.3.6.0 (2009/04/01) 1204 value = queue.getFooter().getDBColumn( clmno ).getRendererValue( value ); 1205 } 1206 } 1207 } 1208 } 1209 // æœ?¾Œã?行ã«ãã¦ã?ªã??åˆã?ヘッãƒ?? 1210 else { 1211 if( queue.getHeader() != null ) { 1212 int clmno = queue.getHeader().getColumnNo( key, false ); 1213 if( clmno >= 0 ) { 1214 value = queue.getHeader().getValue( 0, clmno ); 1215 // 5.0.2.0 (2009/11/01) ãƒãƒ¼ã‚«ãƒ«ãƒªã‚½ãƒ¼ã‚¹ãƒ•ラグを使用ã—ãªã??åˆã?ã€ãƒªã‚½ãƒ¼ã‚¹å¤‰æ›ã‚’行ã‚ãªã?? 1216 if( queue.isFglocal() ) { 1217 // 4.3.6.0 (2009/04/01) 1218 value = queue.getHeader().getDBColumn( clmno ).getRendererValue( value ); 1219 } 1220 } 1221 } 1222 } 1223 1224 return value; 1225 } 1226 1227 /** 1228 * æŒ?®šã•れãŸè¡Œç•ªå·ã€ã‚ーã®ãƒœãƒ‡ã‚£ãƒ¼å€¤ã‚’è¿”ã—ã¾ã™ã? 1229 * 1230 * @og.rev 4.3.6.0 (2009/04/01) レンãƒ?ƒ©ãƒ¼é©ç”¨ã•れã¦ã?ªã?ƒã‚°ã‚’ä¿®æ£ 1231 * @og.rev 4.3.6.2 (2009/04/15) 行番å·ã®ã‚ˆã‚Šå°ã•ã?‚«ãƒ©ãƒ?®šç¾©ã‚’èªã‚“ã éš›ã«ã€å?部カウンタãŒã‚¯ãƒªã‚¢ã•れã¦ã—ã¾ã?ƒã‚°ã‚’ä¿®æ£ 1232 * @og.rev 4.3.6.2 (2009/04/15) ä¸?º¦ã‚ªãƒ¼ãƒã?フãƒãƒ¼ã—ãŸå ´åˆã«ç§»è¡ŒãŒå…¨ã¦ç©ºæ–?—ã§è¿”ã£ã¦ã—ã¾ã?ƒã‚°ã‚’ä¿®æ£ 1233 * @og.rev 5.0.2.0 (2009/11/01) ãƒãƒ¼ã‚«ãƒ«ãƒªã‚½ãƒ¼ã‚¹ãƒ•ラグを使用ã—ãªã??åˆã?ã€ãƒªã‚½ãƒ¼ã‚¹å¤‰æ›ã‚’行ã‚ãªã?? 1234 * @og.rev 5.1.6.0 (2010/05/01) 行番å·å‡ºåЛ坾å¿? 1235 * @og.rev 5.1.7.0 (2010/06/01) è¤?•°ã‚·ãƒ¼ãƒˆå¯¾å¿? 1236 * @og.rev 5.1.9.0 (2010/08/01) æœ?µ‚è¡Œã§æ£ã—ãシートブレイクã•れãªã?ƒã‚°ã‚’ä¿®æ£ 1237 * 1238 * @param key 1239 * @param rownum 1240 * 1241 * @return 値 1242 */ 1243 private String getBodyValue( final String key, final int rownum ) { 1244 // if( status == OVERFLOW || isPageBreak ) { return ""; } 1245 if( isPageBreak ) { return ""; } // 4.3.6.2 (2009/04/15) OVERFLOW時ãƒã‚°ä¿®æ£ 1246 1247 int clmno = queue.getBody().getColumnNo( key, false ); 1248 if( clmno < 0 && !ROW_NO.equals( key ) ) { return ""; } 1249 1250 // ペã?ジブレイク判定ã?å…ˆèªã¿ã—ã¦åˆ¤æ– 1251 if( PAGE_BREAK.equals( key ) ) { 1252 if( rownum < queue.getBody().getRowCount() - 1 ) { 1253 if( !( queue.getBody().getValue( rownum, clmno ).equals( queue.getBody().getValue( rownum + 1, clmno ) ) ) ) { 1254 isPageBreak = true; 1255 } 1256 } 1257 return ""; 1258 } 1259 1260 // 5.1.7.0 (2010/06/01) è¤?•°ã‚·ãƒ¼ãƒˆå¯¾å¿? 1261 // シートブレイクã¯å¾Œèªã¿ã—ã¦åˆ¤æ–(å‰ã?行ã¨ç•°ãªã£ã¦ã?Ÿå ´åˆã«ãƒ–レイク) 1262 if( sheetBreakClm >= 0 ) { 1263 // 5.1.9.0 (2010/08/01) æœ?µ‚è¡Œã§æ£ã—ãシートブレイクã•れãªã?ƒã‚°ã‚’ä¿®æ£ 1264 if( rownum < queue.getBody().getRowCount() && currentBaseRow != rownum ) { 1265 if( !( queue.getBody().getValue( currentBaseRow, sheetBreakClm ).equals( queue.getBody().getValue( rownum, sheetBreakClm ) ) ) ) { 1266 isPageBreak = true; 1267 return ""; 1268 } 1269 } 1270 } 1271 1272 if( rownum >= queue.getBody().getRowCount() ) { 1273 status = OVERFLOW; 1274 return ""; 1275 } 1276 1277 if( rownum == queue.getBody().getRowCount() - 1 ) { 1278 // status = LASTROW; 1279 status = Math.max( LASTROW, status ); // 4.3.6.2 (2009/04/15) 自身ã®ã‚¹ãƒ??ã‚¿ã‚¹ã¨æ¯”ã¹ã¦å¤§ãã„æ–¹ã‚’返㙠1280 } 1281 1282 String value = null; 1283 // 5.1.6.0 (2010/05/01) ペã?ジNO出力対å¿? 1284 if( ROW_NO.equals( key ) ) { 1285 value = String.valueOf( rownum + 1 ); 1286 } 1287 else { 1288 value = queue.getBody().getValue( rownum, clmno ); 1289 // 5.0.2.0 (2009/11/01) ãƒãƒ¼ã‚«ãƒ«ãƒªã‚½ãƒ¼ã‚¹ãƒ•ラグを使用ã—ãªã??åˆã?ã€ãƒªã‚½ãƒ¼ã‚¹å¤‰æ›ã‚’行ã‚ãªã?? 1290 if( queue.isFglocal() ) { 1291 // 4.3.6.0 (2009/04/01) 1292 value = queue.getBody().getDBColumn( clmno ).getRendererValue( value ); 1293 } 1294 } 1295 1296 // 4.3.6.2 (2009/04/15) 1297 if( currentMaxRow < rownum + 1 ) { 1298 currentMaxRow = rownum + 1; 1299 } 1300 1301 return value; 1302 } 1303 1304 /** 1305 * 値ã«'<'ã‚?>','&'ãŒå«ã¾ã‚Œã¦ã?Ÿå ´åˆã«ãƒ¡ã‚¿æ–?—ã«å¤‰æ›ã—ã¾ã™ã? 1306 * 1307 * @og.rev 5.0.2.0 (2009/11/01) 改行Cã®å¤‰æ›ãƒã‚¸ãƒ?‚¯ã‚’追åŠ? 1308 * @og.rev 5.0.2.0 (2009/11/01) ãƒªã‚½ãƒ¼ã‚¹å¤‰æ›æ™‚ã?spanタグを除去 1309 * 1310 * @param value 1311 * 1312 * @return 変æ›å¾Œã?値 1313 */ 1314 private String checkValue( final String value ) { 1315 String rtn = value; 1316 1317 // 5.0.2.0 (2009/11/01) 1318 if( queue.isFglocal() ) { 1319 int idx = -1; 1320 if( ( idx = rtn.indexOf( "<span" ) ) >= 0 ) { 1321 String spanStart = rtn.substring( idx, rtn.indexOf( '>', idx ) + 1 ); 1322 rtn = rtn.replace( spanStart, "" ).replace( "</span>", "" ); 1323 } 1324 } 1325 1326 if( rtn.indexOf( '&' ) >= 0 ) { 1327 rtn = rtn.replace( "&", "&" ); 1328 } 1329 if( rtn.indexOf( '<' ) >= 0 ) { 1330 rtn = rtn.replace( "<", "<" ); 1331 } 1332 if( rtn.indexOf( '>' ) >= 0 ) { 1333 rtn = rtn.replace( ">", ">" ); 1334 } 1335 if( rtn.indexOf( '\n' ) >= 0 ) { 1336 rtn = rtn.replace( "\r\n", "\n" ).replace( "\n", OOO_CR ); 1337 } 1338 1339 return rtn; 1340 } 1341 1342 /** 1343 * å¼•æ•°ã®æ–?—å?を指定ã•れãŸé–‹å§‹ã‚¿ã‚°ã€çµ‚äº?‚¿ã‚°ã§è§£æžã—é…å?ã¨ã—ã¦è¿”ã—ã¾ã™ã? 1344 * 開始タグよりå‰ã?æ–?—å?ã¯0番目ã«ã€çµ‚äº?‚¿ã‚°ã‚ˆã‚Šå¾Œã?æ–?—å?ã¯1ç•ªç›®ã«æ ¼ç´ã•れã¾ã™ã? 1345 * 2番目以é™ã«ã€?–‹å§‹ã‚¿ã‚°ã€çµ‚äº?‚¿ã‚°ã®éƒ¨åˆ?Œæ ¼ç´ã•れã¾ã™ã? 1346 * 1347 * @param str 1348 * @param startTag 1349 * @param endTag 1350 * 1351 * @return è§£æžçµæžœã®é…å? 1352 */ 1353 private static String[] tag2Array( final String str, final String startTag, final String endTag ) { 1354 String header = null; 1355 String footer = null; 1356 List<String> body = new ArrayList<String>(); 1357 1358 int preOffset = -1; 1359 int curOffset = 0; 1360 1361 while( true ) { 1362 curOffset = str.indexOf( startTag, preOffset + 1 ); 1363 if( curOffset < 0 ) { 1364 curOffset = str.lastIndexOf( endTag ) + endTag.length(); 1365 body.add( str.substring( preOffset, curOffset ) ); 1366 1367 footer = str.substring( curOffset ); 1368 break; 1369 } 1370 else if( preOffset == -1 ) { 1371 header = str.substring( 0, curOffset ); 1372 } 1373 else { 1374 body.add( str.substring( preOffset, curOffset ) ); 1375 } 1376 preOffset = curOffset; 1377 } 1378 1379 String[] arr = new String[body.size()+2]; 1380 arr[0] = header; 1381 arr[1] = footer; 1382 for( int i=0; i<body.size(); i++ ) { 1383 arr[i+2] = body.get(i); 1384 } 1385 1386 return arr; 1387 } 1388 1389 /** 1390 * 帳票処ç?‚ューをå?ã«ã€style.xml(ヘッãƒ??ã€ãƒ•ãƒ?‚¿ãƒ¼)ã‚’æ›¸ãæ›ãˆã¾ã™ã? 1391 * 1392 * @og.rev 5.1.8.0 (2010/07/01) パã?ス方法ã?å†?ƒ¨å®Ÿè£?¤‰æ›´ 1393 */ 1394 private void execStyles() { 1395 String fileName = path + "styles.xml"; 1396 String content = readOOoXml( fileName ); 1397 1398 if( content.indexOf( VAR_START ) < 0 ) { return; } 1399 content = new TagParser() { 1400 @Override 1401 public void exec( final String str, final StringBuilder buf, final int offset ) { 1402 buf.append( getHeaderFooterValue( str ) ); 1403 } 1404 }.doParse( readOOoXml( fileName ), VAR_START, VAR_END, false ); 1405 1406 writeOOoXml( fileName, content ); 1407 } 1408 1409 /** 1410 * 帳票処ç?‚ューをå?ã«ã€meta.xmlã‚’æ›¸ãæ›ãˆã¾ã™ã? 1411 * 1412 * @og.rev 5.1.6.0 (2010/05/01) ç”»é¢å¸³ç¥¨ä½œæ?機è?対å¿?API経由ã§ã¯å‡ºåŠ›ã•れãªã?“ã¨ãŒã‚ã‚? 1413 */ 1414 private void execMeta() { 1415 String fileName = path + "meta.xml"; 1416 1417 String meta = readOOoXml( fileName ); 1418 1419 // ã‚·ãƒ¼ãƒˆæ•°æ›¸ãæ›ã? 1420 // 5.1.6.0 (2010/05/01) 1421 if( meta.indexOf( TABLE_COUNT_START_TAG ) >=0 ){ 1422 String tableCount = TagParser.getValueFromTag( meta, TABLE_COUNT_START_TAG, TABLE_COUNT_END_TAG ); 1423 meta = meta.replace( TABLE_COUNT_START_TAG + tableCount, TABLE_COUNT_START_TAG + pages ); 1424 } 1425 1426 // ã‚»ãƒ«æ•°æ›¸ãæ›ã? 1427 // 5.1.6.0 (2010/05/01) 1428 if( meta.indexOf( CELL_COUNT_START_TAG ) >=0 ){ 1429 String cellCount = TagParser.getValueFromTag( meta, CELL_COUNT_START_TAG, CELL_COUNT_END_TAG ); 1430 meta = meta.replace( CELL_COUNT_START_TAG + cellCount, CELL_COUNT_START_TAG + ( Integer.parseInt( cellCount ) * pages ) ); 1431 } 1432 1433 // ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæ•°æ›¸ãæ›ã? 1434 // 5.1.6.0 (2010/05/01) 1435 if( meta.indexOf( OBJECT_COUNT_START_TAG ) >= 0 ){ 1436 String objectCount = TagParser.getValueFromTag( meta, OBJECT_COUNT_START_TAG, OBJECT_COUNT_END_TAG ); 1437 //4.2.4.0 (2008/06/02) å˜åœ¨ã—ãªã??åˆã?nullã§å¸°ã£ã¦ãã‚‹ã®ã§ç„¡è¦–ã™ã‚? 1438 if( objectCount != null){ 1439 meta = meta.replace( OBJECT_COUNT_START_TAG + objectCount, OBJECT_COUNT_START_TAG + ( Integer.parseInt( objectCount ) * pages ) ); 1440 } 1441 } 1442 1443 writeOOoXml( fileName, meta ); 1444 } 1445 1446 /** 1447 * æ›¸ãæ›ãˆå¯¾è±¡ã®ã‚¹ã‚¿ã‚¤ãƒ«ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã? 1448 * 1449 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 1450 * 1451 * @param header content.xmlã®ãƒ˜ãƒƒãƒ?? 1452 */ 1453 private void getRepStyleList( final String header ) { 1454 String[] tags = tag2Array( header, STYLE_START_TAG, STYLE_END_TAG ); 1455 Set<String> origNameSet = pageNameMap.keySet(); 1456 for( int i=2; i<tags.length; i++ ) { 1457 for( String origName : origNameSet ) { 1458 if( tags[i].indexOf( "=\"" + origName + "." ) >= 0 ) { 1459 String styleName = TagParser.getValueFromTag( tags[i], STYLE_NAME_START_TAG, STYLE_NAME_END_TAG ); 1460 repStyleList.add( styleName ); 1461 break; 1462 } 1463 } 1464 } 1465 } 1466 1467 /** 1468 * 帳票処ç?‚ューをå?ã«ã€content.xmlã‚’æ›¸ãæ›ãˆã¾ã™ã? 1469 * ã¾ãšã?XMLã‚’ä¸?—¦ãƒ¡ãƒ¢ãƒªä¸Šã«å±•é–‹ã—ãŸå¾Œã?シートå˜ä½ã«åˆ?§£ã—ã?ãƒ??ã‚¿ã®åŸ‹ã‚è¾¼ã¿ã‚’行ã„ã¾ã™ã? 1470 * 1471 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 1472 */ 1473 private void execContentHeader() { 1474 String fileName = path + "content.xml"; 1475 String content = readOOoXml( fileName ); 1476 1477 // ファイルã®è§£æžã—ã€ã‚·ãƒ¼ãƒ?行å˜ä½ã«åˆ?§£ 1478 String[] tags = tag2Array( content, STYLE_START_TAG, STYLE_END_TAG ); 1479 String header = tags[0]; 1480 String footer = tags[1]; 1481 1482 BufferedWriter bw = null; 1483 try { 1484 bw = getWriter( fileName ); 1485 bw.write( xmlHeader ); 1486 bw.write( '\n' ); 1487 bw.write( header ); 1488 1489 // スタイルæƒ??ã«ã‚·ãƒ¼ãƒˆä¾å˜ã?æƒ??ãŒã‚ã‚‹å?åˆã?ã€ã?ージåˆ? ã‘コピã?ã™ã‚‹ã€? 1490 Set<String> origNameSet = pageNameMap.keySet(); 1491 for( int i=2; i<tags.length; i++ ) { 1492 boolean isReplace = false; 1493 for( String origName : origNameSet ) { 1494 if( tags[i].indexOf( "=\"" + origName + "." ) >= 0 ) { 1495 List<String> newNames = pageNameMap.get( origName ); 1496 for( String newName : newNames ) { 1497 String styleStr = tags[i].replace( "=\"" + origName + "." , "=\"" + newName + "." ); 1498 // シートåã®æ›¸ãæ›ã? 1499 String styleName = TagParser.getValueFromTag( styleStr, STYLE_NAME_START_TAG, STYLE_NAME_END_TAG ); 1500 styleStr = styleStr.replace( STYLE_NAME_START_TAG + styleName, STYLE_NAME_START_TAG + styleName + "_" + newName ); 1501 bw.write( styleStr ); 1502 isReplace = true; 1503 } 1504 break; 1505 } 1506 } 1507 1508 if( !isReplace ) { 1509 bw.write( tags[i] ); 1510 } 1511 } 1512 1513 bw.write( footer ); 1514 bw.flush(); 1515 } 1516 catch ( IOException ex ) { 1517 queue.addMsg( "[ERROR]PARSE:error occurer while write ReParsed Sheet " + fileName + HybsSystem.CR ); 1518 throw new HybsSystemException( ex ); 1519 } 1520 finally { 1521 Closer.ioClose( bw ); 1522 } 1523 } 1524 1525 /** 1526 * content.xmlã®ãƒ˜ãƒƒãƒ??部åˆ?‚’出力ã—ãŸcontent.xmlã«ã€ã?ãƒ?ƒ€ãƒ¼éƒ¨åˆ?»¥é™ã‚’出力ã—ã? 1527 * content.xml.bakã‚’ã?ージã—ã¾ã™ã? 1528 * 1529 * @og.rev 5.2.2.0 (2010/11/01) æ¡ä»¶ä»˜æ›¸å¼å¯¾å¿? 1530 */ 1531 private void execMergeContent() { 1532 FileChannel srcChannel = null; 1533 FileChannel destChannel = null; 1534 try { 1535 srcChannel = new FileInputStream( path + "content.xml.tmp" ).getChannel(); 1536 destChannel = new FileOutputStream( path + "content.xml", true ).getChannel(); 1537 srcChannel.transferTo(0, srcChannel.size(), destChannel); 1538 } 1539 catch ( IOException ex ) { 1540 queue.addMsg( "[ERROR]PARSE:error occurer while merge content.xml" + HybsSystem.CR ); 1541 throw new HybsSystemException( ex ); 1542 } 1543 finally { 1544 Closer.ioClose( srcChannel ); 1545 Closer.ioClose( destChannel ); 1546 } 1547 FileUtil.deleteFiles( new File( path + "content.xml.tmp" ) ); 1548 } 1549 1550 /** 1551 * META-INF/manifest.xmlã«ã€è¿½åŠ?—ãŸã‚ªãƒ–ジェクãƒ?グラフã?ç”»åƒ?を登録ã—ã¾ã™ã? 1552 * 1553 * @og.rev 5.3.1.0 (2011/12/01) æ–°è¦ä½œæ? 1554 */ 1555 private void execManifest() { 1556 String fileName = path + "META-INF" + File.separator + "manifest.xml"; 1557 String[] conArr = TagParser.tag2Array( readOOoXml( fileName ), MANIFEST_START_TAG, MANIFEST_END_TAG ); 1558 1559 StringBuilder buf = new StringBuilder(); 1560 buf.append( conArr[0] ); 1561 for( int i=2; i<conArr.length; i++ ) { 1562 buf.append( conArr[i] ); 1563 } 1564 for( Map.Entry<String,String> entry : addObjs.entrySet() ) { 1565 if( "graph".equals( entry.getValue() ) ) { 1566 buf.append( "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"" + entry.getKey() + "/content.xml\"/>" ); 1567 buf.append( "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"" + entry.getKey() + "/styles.xml\"/>" ); 1568 buf.append( "<manifest:file-entry manifest:media-type=\"text/xml\" manifest:full-path=\"" + entry.getKey() + "/meta.xml\"/>" ); 1569 buf.append( "<manifest:file-entry manifest:media-type=\"application/vnd.oasis.opendocument.chart\" manifest:full-path=\"" + entry.getKey() + "/\"/>" ); 1570 } 1571 else { 1572 buf.append( "<manifest:file-entry manifest:media-type=\"image/" + entry.getValue() + "\" manifest:full-path=\"" + entry.getKey() + "\"/>" ); 1573 } 1574 } 1575 buf.append( conArr[1] ); 1576 1577 writeOOoXml( fileName, buf.toString() ); 1578 } 1579 1580 /** 1581 * XMLファイルをèªã¿å–りã€çµæžœã‚’è¿”ã—ã¾ã™ã? 1582 * OOoã®XMLファイルã¯å…¨ã¦1行ã‚ãŒxml宣è¨?§ã€?行目ãŒå?容全体ã¨ã?†å½¢å¼ã§ã‚ã‚‹ãŸã‚ã€? 1583 * ã“ã“ã§ã¯ã€?行目ã®å†?®¹éƒ¨åˆ?‚’è¿”ã—ã¾ã™ã? 1584 * 1585 * @og.rev 4.3.6.0 (2009/04/01) meta.xmlã§ã‚³ãƒ³ãƒ?ƒ³ãƒ??部åˆ?Œæ”¹è¡Œã•れã¦ã?‚‹å ´åˆãŒã‚ã‚‹ãŸã‚ã€ãƒ«ãƒ¼ãƒ—を回ã—ã¦èªè¾¼ã¿ 1586 * 1587 * @param fileName 1588 * 1589 * @return èªã¿å–ã£ãŸæ–‡å—å? 1590 */ 1591 private String readOOoXml( final String fileName ) { 1592 File file = new File ( fileName ); 1593 1594 BufferedReader br = null; 1595 String tmp = null; 1596 StringBuilder buf = new StringBuilder(); 1597 try { 1598 br = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); 1599 xmlHeader = br.readLine(); 1600 while( ( tmp = br.readLine() ) != null ) { // 4.3.6.0 (2009/04/01) 1601 buf.append( tmp ); 1602 } 1603 } 1604 catch( IOException ex ) { 1605 queue.addMsg( "[ERROR]PARSE:Failed to read " + fileName + HybsSystem.CR ); 1606 throw new HybsSystemException( ex ); 1607 } 1608 finally { 1609 Closer.ioClose( br ); 1610 } 1611 1612 String str = buf.toString(); 1613 if( xmlHeader == null || xmlHeader.length() == 0 || str == null || str.length() == 0 ) { 1614 queue.addMsg( "[ERROR]PARSE:Maybe " + fileName + " is Broken!" + HybsSystem.CR ); 1615 throw new HybsSystemException(); 1616 } 1617 1618 return str; 1619 } 1620 1621 /** 1622 * XMLファイルを書ãè¾¼ã¿ã¾ã™ã? 1623 * OOoã®XMLファイルã¯å…¨ã¦1行ã‚ãŒxml宣è¨?§ã€?行目ãŒå?容全体ã¨ã?†å½¢å¼ã§ã‚ã‚‹ãŸã‚ã€? 1624 * ã“ã“ã§ã¯ã€?行目ã®å†?®¹éƒ¨åˆ?‚’渡ã™ã“ã¨ã§ã€XMLファイルを作æ?ã—ã¾ã™ã? 1625 * 1626 * @param fileName 書ãè¾¼ã‚?MLファイルå? 1627 * @param str 書ãè¾¼ã‚?–‡å—å? 1628 */ 1629 private void writeOOoXml( final String fileName, final String str ) { 1630 BufferedWriter bw = null; 1631 try { 1632 bw = getWriter( fileName ); 1633 bw.write( xmlHeader ); 1634 bw.write( '\n' ); 1635 bw.write( str ); 1636 bw.flush(); 1637 } 1638 catch( IOException ex ) { 1639 queue.addMsg( "[ERROR]PARSE:Failed to write " + fileName + HybsSystem.CR ); 1640 throw new HybsSystemException( ex ); 1641 } 1642 finally { 1643 Closer.ioClose( bw ); 1644 } 1645 } 1646 1647 /** 1648 * XMLファイル書ãè¾¼ã¿ç”¨ã®ãƒ©ã‚¤ã‚¿ãƒ¼ã‚’è¿”ã—ã¾ã™ã? 1649 * 1650 * @param fileName ファイルå? 1651 * 1652 * @return ライター 1653 */ 1654 private BufferedWriter getWriter( final String fileName ) { 1655 return getWriter( fileName, false ); 1656 } 1657 1658 /** 1659 * XMLファイル書ãè¾¼ã¿ç”¨ã®ãƒ©ã‚¤ã‚¿ãƒ¼ã‚’è¿”ã—ã¾ã™ã? 1660 * 1661 * @param fileName ファイルå? 1662 * @param append アベンドã™ã‚‹ã‹ 1663 * 1664 * @return ライター 1665 */ 1666 private BufferedWriter getWriter( final String fileName, final boolean append ) { 1667 File file = new File ( fileName ); 1668 BufferedWriter bw; 1669 try { 1670 bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file, append ), "UTF-8" ) ); 1671 } 1672 catch ( UnsupportedEncodingException ex ) { 1673 queue.addMsg( "[ERROR] Input File is written by Unsupported Encoding" ); 1674 throw new HybsSystemException( ex ); 1675 } 1676 catch ( FileNotFoundException ex ) { 1677 queue.addMsg( "[ERROR] File not Found" ); 1678 throw new HybsSystemException( ex ); 1679 } 1680 return bw; 1681 } 1682 1683 /** 1684 * ファイルåã‹ã‚‰æ‹¡å¼µå?å°æ–‡å?を求ã‚ã¾ã™ã? 1685 * 1686 * @param fileName æ‹¡å¼µåã‚’å–å¾—ã™ã‚‹ç‚ºã®ãƒ•ァイルå? 1687 * 1688 * @return æ‹¡å¼µå?å°æ–‡å? 1689 */ 1690 public static String getSuffix( final String fileName ) { 1691 String suffix = null; 1692 if( fileName != null ) { 1693 int sufIdx = fileName.lastIndexOf( '.' ); 1694 if( sufIdx >= 0 ) { 1695 suffix = fileName.substring( sufIdx + 1 ).toLowerCase( Locale.JAPAN ); 1696 } 1697 } 1698 return suffix; 1699 } 1700 } 1701