mirror of https://github.com/apache/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
This commit is contained in:
parent
c0ecc83ee4
commit
1f072afe18
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue