You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2020/12/11 17:51:06 UTC

svn commit: r1884329 - in /poi/trunk/src/ooxml: java/org/apache/poi/xssf/usermodel/XSSFSheet.java testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

Author: fanningpj
Date: Fri Dec 11 17:51:06 2020
New Revision: 1884329

URL: http://svn.apache.org/viewvc?rev=1884329&view=rev
Log:
[bug-60397] improve speed of excel cell merge. Thanks to Alex Herve

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

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=1884329&r1=1884328&r2=1884329&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 Fri Dec 11 17:51:06 2020
@@ -379,12 +379,19 @@ public class XSSFSheet extends POIXMLDoc
         CTMergeCells ctMergeCells = worksheet.isSetMergeCells() ? worksheet.getMergeCells() : worksheet.addNewMergeCells();
         CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
         ctMergeCell.setRef(region.formatAsString());
-        final int numMergeRegions=ctMergeCells.sizeOfMergeCellArray();
+
+        long count = ctMergeCells.getCount();
+
+        if (count == 0) {
+            count=ctMergeCells.sizeOfMergeCellArray();
+        } else {
+            count++;
+        }
 
         // also adjust the number of merged regions overall
-        ctMergeCells.setCount(numMergeRegions);
+        ctMergeCells.setCount(count);
 
-        return numMergeRegions-1;
+        return Math.toIntExact(count-1);
     }
 
     /**

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1884329&r1=1884328&r2=1884329&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Fri Dec 11 17:51:06 2020
@@ -3450,6 +3450,60 @@ public final class TestXSSFBugs extends
             assertEquals(1, numMergedRegions);
             assertEquals(1, ctMergeCellCount);
             assertEquals(1, ctMergeCellListSize);
+
+        }
+    }
+
+    @Test
+    public void bug60397() throws IOException {
+        try (XSSFWorkbook wb = new XSSFWorkbook()) {
+            XSSFSheet sheet = wb.createSheet();
+
+            CellRangeAddress region = new CellRangeAddress(1, 1, 1, 2);
+            assertEquals(0, sheet.addMergedRegion(region));
+            //System.out.println(String.format("%s: index=%d", "testAddMergedRegion", index));
+
+            List<CellRangeAddress> ranges = sheet.getMergedRegions();
+            int numMergedRegions = sheet.getNumMergedRegions();
+            CTWorksheet ctSheet = sheet.getCTWorksheet();
+            CTMergeCells ctMergeCells = ctSheet.getMergeCells();
+            List<CTMergeCell> ctMergeCellList = ctMergeCells.getMergeCellList();
+            long ctMergeCellCount = ctMergeCells.getCount();
+            int ctMergeCellListSize = ctMergeCellList.size();
+
+            /*System.out.println(String.format("\ntestMergeRegions(%s)", "After adding first region"));
+            System.out.println(String.format("ranges.size=%d", ranges.size()));
+            System.out.println(String.format("numMergedRegions=%d", numMergedRegions));
+            System.out.println(String.format("ctMergeCellCount=%d", ctMergeCellCount));
+            System.out.println(String.format("ctMergeCellListSize=%d", ctMergeCellListSize)); */
+
+            assertEquals(1, ranges.size());
+            assertEquals(1, numMergedRegions);
+            assertEquals(1, ctMergeCellCount);
+            assertEquals(1, ctMergeCellListSize);
+
+            CellRangeAddress region2 = new CellRangeAddress(1, 2, 4, 6);
+            assertEquals(1, sheet.addMergedRegion(region2));
+            //System.out.println(String.format("%s: index=%d", "testAddMergedRegion", index));
+
+            ranges = sheet.getMergedRegions();
+            numMergedRegions = sheet.getNumMergedRegions();
+            ctSheet = sheet.getCTWorksheet();
+            ctMergeCells = ctSheet.getMergeCells();
+            ctMergeCellList = ctMergeCells.getMergeCellList();
+            ctMergeCellCount = ctMergeCells.getCount();
+            ctMergeCellListSize = ctMergeCellList.size();
+
+            /*System.out.println(String.format("\ntestMergeRegions(%s)", "After adding second region"));
+            System.out.println(String.format("ranges.size=%d", ranges.size()));
+            System.out.println(String.format("numMergedRegions=%d", numMergedRegions));
+            System.out.println(String.format("ctMergeCellCount=%d", ctMergeCellCount));
+            System.out.println(String.format("ctMergeCellListSize=%d", ctMergeCellListSize));*/
+
+            assertEquals(2, ranges.size());
+            assertEquals(2, numMergedRegions);
+            assertEquals(2, ctMergeCellCount);
+            assertEquals(2, ctMergeCellListSize);
         }
     }
 



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