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 &lt;sheet&gt; tag of workbook.xml 
+     *
+     * Example (which causes the problems):
+     * &lt;sheet name="Sheet6" r:id="rId6" sheetId="4"/&gt;
+     *
+     * While this one works correctly:
+     * &lt;sheet name="Sheet6" sheetId="4" r:id="rId6"/&gt;
+     */
+    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]

Reply via email to