mirror of https://github.com/apache/poi.git
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
This commit is contained in:
parent
0795348205
commit
1cbefe6afb
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.8-beta6" date="2012-??-??">
|
<release version="3.8-beta6" date="2012-??-??">
|
||||||
|
<action dev="poi-developers" type="fix">52835 - Tolerate missing Count and UniqueCount attributes when parsing shared strings table in XSSF eventusermodel</action>
|
||||||
<action dev="poi-developers" type="add">52818 - Added implementation for RANK()</action>
|
<action dev="poi-developers" type="add">52818 - Added implementation for RANK()</action>
|
||||||
<action dev="poi-developers" type="fix">52682 - allow setting text with trailing carriage return in HSLF</action>
|
<action dev="poi-developers" type="fix">52682 - allow setting text with trailing carriage return in HSLF</action>
|
||||||
<action dev="poi-developers" type="fix">52244 - use correct text attributes when presentation has multiple TxMasterStyleAtoms of the same type</action>
|
<action dev="poi-developers" type="fix">52244 - use correct text attributes when presentation has multiple TxMasterStyleAtoms of the same type</action>
|
||||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.poi.xssf.eventusermodel;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import javax.xml.parsers.SAXParser;
|
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.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
|
||||||
import org.xml.sax.Attributes;
|
import org.xml.sax.Attributes;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
@ -91,7 +93,7 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
|
||||||
/**
|
/**
|
||||||
* The shared strings table.
|
* The shared strings table.
|
||||||
*/
|
*/
|
||||||
private String[] strings;
|
private List<String> strings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param pkg
|
* @param pkg
|
||||||
|
@ -173,24 +175,28 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
|
||||||
* @return the item at the specified position in this Shared String table.
|
* @return the item at the specified position in this Shared String table.
|
||||||
*/
|
*/
|
||||||
public String getEntryAt(int idx) {
|
public String getEntryAt(int idx) {
|
||||||
return strings[idx];
|
return strings.get(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getItems() {
|
||||||
|
return strings;
|
||||||
}
|
}
|
||||||
|
|
||||||
//// ContentHandler methods ////
|
//// ContentHandler methods ////
|
||||||
|
|
||||||
private StringBuffer characters;
|
private StringBuffer characters;
|
||||||
private boolean tIsOpen;
|
private boolean tIsOpen;
|
||||||
private int index;
|
|
||||||
|
|
||||||
public void startElement(String uri, String localName, String name,
|
public void startElement(String uri, String localName, String name,
|
||||||
Attributes attributes) throws SAXException {
|
Attributes attributes) throws SAXException {
|
||||||
if ("sst".equals(name)) {
|
if ("sst".equals(name)) {
|
||||||
String count = attributes.getValue("count");
|
String count = attributes.getValue("count");
|
||||||
|
if(count != null) this.count = Integer.parseInt(count);
|
||||||
String uniqueCount = attributes.getValue("uniqueCount");
|
String uniqueCount = attributes.getValue("uniqueCount");
|
||||||
this.count = Integer.parseInt(count);
|
if(uniqueCount != null) this.uniqueCount = Integer.parseInt(uniqueCount);
|
||||||
this.uniqueCount = Integer.parseInt(uniqueCount);
|
|
||||||
this.strings = new String[this.uniqueCount];
|
this.strings = new ArrayList<String>(this.uniqueCount);
|
||||||
index = 0;
|
|
||||||
characters = new StringBuffer();
|
characters = new StringBuffer();
|
||||||
} else if ("si".equals(name)) {
|
} else if ("si".equals(name)) {
|
||||||
characters.setLength(0);
|
characters.setLength(0);
|
||||||
|
@ -202,8 +208,7 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
|
||||||
public void endElement(String uri, String localName, String name)
|
public void endElement(String uri, String localName, String name)
|
||||||
throws SAXException {
|
throws SAXException {
|
||||||
if ("si".equals(name)) {
|
if ("si".equals(name)) {
|
||||||
strings[index] = characters.toString();
|
strings.add(characters.toString());
|
||||||
++index;
|
|
||||||
} else if ("t".equals(name)) {
|
} else if ("t".equals(name)) {
|
||||||
tIsOpen = false;
|
tIsOpen = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<PackagePart> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue