From: PJ Fanning Date: Fri, 11 Dec 2020 17:51:06 +0000 (+0000) Subject: [bug-60397] improve speed of excel cell merge. Thanks to Alex Herve X-Git-Tag: before_ooxml_3rd_edition~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1f072afe18b3022f90a7f2dae52b9606b459e045;p=poi.git [bug-60397] improve speed of excel cell merge. Thanks to Alex Herve git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1884329 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 155aa70556..7eb2a45b39 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -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); } /** diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index aff4e21f97..6fe63c5e94 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -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 ranges = sheet.getMergedRegions(); + int numMergedRegions = sheet.getNumMergedRegions(); + CTWorksheet ctSheet = sheet.getCTWorksheet(); + CTMergeCells ctMergeCells = ctSheet.getMergeCells(); + List 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); } }