Author: onealj
Date: Sat Apr 29 17:27:17 2017
New Revision: 1793223
URL: http://svn.apache.org/viewvc?rev=1793223&view=rev
Log:
bug 61034: Call to XSSFReader.getSheetsData() returns duplicate sheets.
Thanks to Mauricio Eastmond for the Excel test file and unit test.
Thanks to Sebastian Wikalinski for isolating the problem and providing a patch.
Added:
poi/trunk/test-data/spreadsheet/61034.xlsx (with props)
Modified:
poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
poi/trunk/src/testcases/org/apache/poi/POITestCase.java
Modified:
poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java?rev=1793223&r1=1793222&r2=1793223&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
Sat Apr 29 17:27:17 2017
@@ -428,15 +428,18 @@ public class XSSFReader {
@Override
public void startElement(String uri, String localName, String qName,
Attributes attrs) throws SAXException {
- if (localName.toLowerCase(Locale.US).equals(SHEET)) {
+ if (localName.equalsIgnoreCase(SHEET)) {
String name = null;
String id = null;
for (int i = 0; i < attrs.getLength(); i++) {
- if
(attrs.getLocalName(i).toLowerCase(Locale.US).equals(NAME)) {
+ final String attrName = attrs.getLocalName(i);
+ if (attrName.equalsIgnoreCase(NAME)) {
name = attrs.getValue(i);
- } else if
(attrs.getLocalName(i).toLowerCase(Locale.US).equals(ID)) {
+ } else if (attrName.equalsIgnoreCase(ID)) {
id = attrs.getValue(i);
}
+ }
+ if (name != null && id != null) {
sheetRefs.add(new XSSFSheetRef(id, name));
}
}
Modified:
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java?rev=1793223&r1=1793222&r2=1793223&view=diff
==============================================================================
---
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
(original)
+++
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
Sat Apr 29 17:27:17 2017
@@ -18,10 +18,13 @@
package org.apache.poi.xssf.eventusermodel;
import static org.apache.poi.POITestCase.assertContains;
+import static org.apache.poi.POITestCase.assertNotContained;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
import org.apache.poi.POIDataSamples;
import org.apache.poi.POIXMLException;
@@ -267,4 +270,31 @@ public final class TestXSSFReader extend
pkg.close();
}
+
+ /**
+ * bug 61304: Call to XSSFReader.getSheetsData() returns duplicate sheets.
+ *
+ * The problem seems to be caused only by those xlsx files which have a
specific
+ * order of the attributes inside the <sheet> tag of workbook.xml
+ *
+ * Example (which causes the problems):
+ * <sheet name="Sheet6" r:id="rId6" sheetId="4"/>
+ *
+ * While this one works correctly:
+ * <sheet name="Sheet6" sheetId="4" r:id="rId6"/>
+ */
+ public void test61034() throws Exception {
+ OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("61034.xlsx");
+ XSSFReader reader = new XSSFReader(pkg);
+ XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator)
reader.getSheetsData();
+ Set<String> seen = new HashSet<String>();
+ while (iter.hasNext()) {
+ InputStream stream = iter.next();
+ String sheetName = iter.getSheetName();
+ assertNotContained(seen, sheetName);
+ seen.add(sheetName);
+ stream.close();
+ }
+ pkg.close();
+ }
}
Modified: poi/trunk/src/testcases/org/apache/poi/POITestCase.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/POITestCase.java?rev=1793223&r1=1793222&r2=1793223&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/POITestCase.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/POITestCase.java Sat Apr 29 17:27:17
2017
@@ -30,6 +30,7 @@ import static org.hamcrest.CoreMatchers.
import static org.hamcrest.CoreMatchers.startsWith;
import static org.hamcrest.CoreMatchers.endsWith;
import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.hasItem;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
@@ -41,6 +42,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
import org.apache.poi.util.SuppressForbidden;
import org.apache.poi.util.Internal;
@@ -110,6 +112,13 @@ public final class POITestCase {
}
fail("Unable to find " + key + " in " + map);
}
+
+ public static <T> void assertNotContained(Set<T> set, T element) {
+ assertThat(set, not(hasItem(element)));
+ /*if (set.contains(element)) {
+ fail("Set should not contain " + element);
+ }*/
+ }
/**
* Utility method to get the value of a private/protected field.
Added: poi/trunk/test-data/spreadsheet/61034.xlsx
URL:
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/61034.xlsx?rev=1793223&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/test-data/spreadsheet/61034.xlsx
------------------------------------------------------------------------------
--- svn:mime-type (added)
+++ svn:mime-type Sat Apr 29 17:27:17 2017
@@ -0,0 +1 @@
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]