From 1cbefe6afbca61839950d9018dc8b6809f2c974c Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Sun, 11 Mar 2012 07:19:07 +0000 Subject: [PATCH] Bugzilla 52835 - Tolerate missing Count and UniqueCount attributes when parsing shared strings table in XSSF eventusermodel git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1299338 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../ReadOnlySharedStringsTable.java | 23 +++++--- .../TestReadOnlySharedStringsTable.java | 58 +++++++++++++++++++ 3 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index df242e6444..8d0cb5dc94 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52835 - Tolerate missing Count and UniqueCount attributes when parsing shared strings table in XSSF eventusermodel 52818 - Added implementation for RANK() 52682 - allow setting text with trailing carriage return in HSLF 52244 - use correct text attributes when presentation has multiple TxMasterStyleAtoms of the same type diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java index 52e2c258ae..8a4b139ff9 100644 --- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java @@ -19,6 +19,7 @@ package org.apache.poi.xssf.eventusermodel; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -28,6 +29,7 @@ import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.xssf.usermodel.XSSFRelation; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -91,7 +93,7 @@ public class ReadOnlySharedStringsTable extends DefaultHandler { /** * The shared strings table. */ - private String[] strings; + private List strings; /** * @param pkg @@ -173,24 +175,28 @@ public class ReadOnlySharedStringsTable extends DefaultHandler { * @return the item at the specified position in this Shared String table. */ public String getEntryAt(int idx) { - return strings[idx]; + return strings.get(idx); + } + + public List getItems() { + return strings; } //// ContentHandler methods //// private StringBuffer characters; private boolean tIsOpen; - private int index; public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if ("sst".equals(name)) { String count = attributes.getValue("count"); + if(count != null) this.count = Integer.parseInt(count); String uniqueCount = attributes.getValue("uniqueCount"); - this.count = Integer.parseInt(count); - this.uniqueCount = Integer.parseInt(uniqueCount); - this.strings = new String[this.uniqueCount]; - index = 0; + if(uniqueCount != null) this.uniqueCount = Integer.parseInt(uniqueCount); + + this.strings = new ArrayList(this.uniqueCount); + characters = new StringBuffer(); } else if ("si".equals(name)) { characters.setLength(0); @@ -202,8 +208,7 @@ public class ReadOnlySharedStringsTable extends DefaultHandler { public void endElement(String uri, String localName, String name) throws SAXException { if ("si".equals(name)) { - strings[index] = characters.toString(); - ++index; + strings.add(characters.toString()); } else if ("t".equals(name)) { tIsOpen = false; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java new file mode 100644 index 0000000000..c4690369b9 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java @@ -0,0 +1,58 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.apache.poi.xssf.eventusermodel; + +import junit.framework.TestCase; +import org.apache.poi.POIDataSamples; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.xssf.model.SharedStringsTable; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Tests for {@link org.apache.poi.xssf.eventusermodel.XSSFReader} + */ +public final class TestReadOnlySharedStringsTable extends TestCase { + private static POIDataSamples _ssTests = POIDataSamples.getSpreadSheetInstance(); + + public void testParse() throws Exception { + OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx")); + List parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.xml")); + assertEquals(1, parts.size()); + + SharedStringsTable stbl = new SharedStringsTable(parts.get(0), null); + ReadOnlySharedStringsTable rtbl = new ReadOnlySharedStringsTable(parts.get(0), null); + + assertEquals(stbl.getCount(), rtbl.getCount()); + assertEquals(stbl.getUniqueCount(), rtbl.getUniqueCount()); + + assertEquals(stbl.getItems().size(), stbl.getUniqueCount()); + assertEquals(rtbl.getItems().size(), rtbl.getUniqueCount()); + for(int i=0; i < stbl.getUniqueCount(); i++){ + CTRst i1 = stbl.getEntryAt(i); + String i2 = rtbl.getEntryAt(i); + assertEquals(i1.getT(), i2); + } + + } +} -- 2.39.5