]> source.dussan.org Git - poi.git/commitdiff
[bug-60397] improve speed of excel cell merge. Thanks to Alex Herve
authorPJ Fanning <fanningpj@apache.org>
Fri, 11 Dec 2020 17:51:06 +0000 (17:51 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 11 Dec 2020 17:51:06 +0000 (17:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1884329 13f79535-47bb-0310-9956-ffa450edef68

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

index 155aa705562c2bb310d3f8f54b13d63b06fafd73..7eb2a45b390f380696ad1da37ebfb1e1b550603f 100644 (file)
@@ -379,12 +379,19 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet  {
         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);
     }
 
     /**
index aff4e21f97063a8774f25642e3e120cb6209164b..6fe63c5e94c65484342b208da0e3dedab8a5a583 100644 (file)
@@ -3450,6 +3450,60 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
             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);
         }
     }