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