You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by dn...@apache.org on 2015/07/13 15:00:36 UTC

svn commit: r1690661 - in /poi: site/src/documentation/content/xdocs/ trunk/src/java/org/apache/poi/hssf/usermodel/ trunk/src/java/org/apache/poi/ss/usermodel/ trunk/src/ooxml/java/org/apache/poi/xssf/streaming/ trunk/src/ooxml/java/org/apache/poi/xssf...

Author: dnorth
Date: Mon Jul 13 13:00:35 2015
New Revision: 1690661

URL: http://svn.apache.org/r1690661
Log:
Add Sheet.getMergedRegions to obtain them all as a list. Implement this for XSSF using "deprecated" methods in XMLBeans which allow the operation to be linear in the number of regions rather than n-squared.

Fixes #57893

Added:
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetMergeRegions.java
    poi/trunk/test-data/spreadsheet/57893-many-merges.xlsx   (with props)
Modified:
    poi/site/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java

Modified: poi/site/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/site/src/documentation/content/xdocs/status.xml?rev=1690661&r1=1690660&r2=1690661&view=diff
==============================================================================
--- poi/site/src/documentation/content/xdocs/status.xml (original)
+++ poi/site/src/documentation/content/xdocs/status.xml Mon Jul 13 13:00:35 2015
@@ -40,6 +40,7 @@
 
     <release version="3.13-beta1" date="2015-07-??">
         <action dev="PD" type="fix" fixes-bug="58113">Regression: NullPointerException when setting cell value to null</action>
+        <action dev="DN" type="add" fixes-bug="57893">Add a method for obtaining all merged regions on a worksheet. This is faster for XSSFSheet than obtaining each individually by iteration.</action>
         <action dev="DN" type="add" fixes-bug="58036">Add basic support for VBA macro-enabled workbooks (xlsm)</action>
         <action dev="PD" type="fix" fixes-bug="57744">Fix parsing the email submission data when id contains a hyphen</action>
         <action dev="PD" type="fix" fixes-bug="57678">Better handle years in mail-messages between 1980 and 1999</action>

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=1690661&r1=1690660&r2=1690661&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Mon Jul 13 13:00:35 2015
@@ -868,6 +868,17 @@ public final class HSSFSheet implements
     }
 
     /**
+     * @return the list of merged regions
+     */
+    public List<CellRangeAddress> getMergedRegions() {
+        List<CellRangeAddress> addresses = new ArrayList<CellRangeAddress>();
+        for (int i=0; i < _sheet.getNumMergedRegions(); i++) {
+            addresses.add(_sheet.getMergedRegionAt(i));
+        }
+        return addresses;
+    }
+
+    /**
      * @return an iterator of the PHYSICAL rows.  Meaning the 3rd element may not
      *         be the third row if say for instance the second row is undefined.
      *         Call getRowNum() on each row if you care which one it is.

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java?rev=1690661&r1=1690660&r2=1690661&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java Mon Jul 13 13:00:35 2015
@@ -321,6 +321,13 @@ public interface Sheet extends Iterable<
     public CellRangeAddress getMergedRegion(int index);
 
     /**
+     * Returns the list of merged regions.
+     *
+     * @return the list of merged regions
+     */
+    public List<CellRangeAddress> getMergedRegions();
+
+    /**
      *  Returns an iterator of the physical rows
      *
      * @return an iterator of the PHYSICAL rows.  Meaning the 3rd element may not

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java?rev=1690661&r1=1690660&r2=1690661&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java Mon Jul 13 13:00:35 2015
@@ -431,7 +431,9 @@ public class SXSSFSheet implements Sheet
     }
 
     /**
-     * Returns the merged region at the specified index
+     * Returns the merged region at the specified index. If you want multiple
+     * regions, it is faster to call {@link #getMergedRegions()} than to call
+     * this each time.
      *
      * @return the merged region at the specified index
      */
@@ -441,6 +443,17 @@ public class SXSSFSheet implements Sheet
     }
 
     /**
+     * Returns the list of merged regions. If you want multiple regions, this is
+     * faster than calling {@link #getMergedRegion(int)} each time.
+     *
+     * @return the list of merged regions
+     */
+    @Override
+    public List<CellRangeAddress> getMergedRegions() {
+        return _sh.getMergedRegions();
+    }
+
+    /**
      *  Returns an iterator of the physical rows
      *
      * @return an iterator of the PHYSICAL rows.  Meaning the 3rd element may not

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1690661&r1=1690660&r2=1690661&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Mon Jul 13 13:00:35 2015
@@ -1082,6 +1082,10 @@ public class XSSFSheet extends POIXMLDoc
     }
 
     /**
+     * Returns the merged region at the specified index. If you want multiple
+     * regions, it is faster to call {@link #getMergedRegions()} than to call
+     * this each time.
+     *
      * @return the merged region at the specified index
      * @throws IllegalStateException if this worksheet does not contain merged regions
      */
@@ -1096,6 +1100,27 @@ public class XSSFSheet extends POIXMLDoc
     }
 
     /**
+     * Returns the list of merged regions. If you want multiple regions, this is
+     * faster than calling {@link #getMergedRegion(int)} each time.
+     *
+     * @return the list of merged regions
+     * @throws IllegalStateException if this worksheet does not contain merged regions
+     */
+    @SuppressWarnings("deprecation")
+    @Override
+    public List<CellRangeAddress> getMergedRegions() {
+        CTMergeCells ctMergeCells = worksheet.getMergeCells();
+        if(ctMergeCells == null) throw new IllegalStateException("This worksheet does not contain merged regions");
+
+        List<CellRangeAddress> addresses = new ArrayList<CellRangeAddress>();
+        for(CTMergeCell ctMergeCell : ctMergeCells.getMergeCellArray()) {
+            String ref = ctMergeCell.getRef();
+            addresses.add(CellRangeAddress.valueOf(ref));
+        }
+        return addresses;
+    }
+
+    /**
      * Returns the number of merged regions defined in this worksheet
      *
      * @return number of merged regions in this worksheet

Added: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetMergeRegions.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetMergeRegions.java?rev=1690661&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetMergeRegions.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetMergeRegions.java Mon Jul 13 13:00:35 2015
@@ -0,0 +1,48 @@
+/* ====================================================================
+   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.usermodel;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.junit.Test;
+
+public class TestXSSFSheetMergeRegions {
+    @Test
+    public void testMergeRegionsSpeed() throws IOException {
+        final XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57893-many-merges.xlsx");
+        try {
+            final XSSFSheet sheet = wb.getSheetAt(0);
+            final long start = System.currentTimeMillis();
+            final List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
+            assertEquals(50000, mergedRegions.size());
+            for (CellRangeAddress cellRangeAddress : mergedRegions) {
+                assertEquals(cellRangeAddress.getFirstRow(), cellRangeAddress.getLastRow());
+                assertEquals(2, cellRangeAddress.getNumberOfCells());
+            }
+            long millis = System.currentTimeMillis() - start;
+            // This time is typically ~800ms, versus ~7800ms to iterate getMergedRegion(int).
+            assertTrue("Should have taken <2000 ms to iterate 50k merged regions but took " + millis, millis < 2000);
+        } finally {
+            wb.close();
+        }
+    }
+}

Added: poi/trunk/test-data/spreadsheet/57893-many-merges.xlsx
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/57893-many-merges.xlsx?rev=1690661&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/57893-many-merges.xlsx
------------------------------------------------------------------------------
--- svn:mime-type (added)
+++ svn:mime-type Mon Jul 13 13:00:35 2015
@@ -0,0 +1 @@
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org