[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
This commit is contained in:
PJ Fanning 2020-12-11 17:51:06 +00:00
parent c0ecc83ee4
commit 1f072afe18
2 changed files with 64 additions and 3 deletions

View 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);
}
/**

View 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);
}
}