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();
|
CTMergeCells ctMergeCells = worksheet.isSetMergeCells() ? worksheet.getMergeCells() : worksheet.addNewMergeCells();
|
||||||
CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
|
CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
|
||||||
ctMergeCell.setRef(region.formatAsString());
|
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
|
// 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, numMergedRegions);
|
||||||
assertEquals(1, ctMergeCellCount);
|
assertEquals(1, ctMergeCellCount);
|
||||||
assertEquals(1, ctMergeCellListSize);
|
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