mirror of https://github.com/apache/poi.git
bug 56345: reject single-cell merged regions
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1730991 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8cbb571d9c
commit
9ee05a1452
|
@ -662,11 +662,15 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
|
|||
*
|
||||
* @param region (rowfrom/colfrom-rowto/colto) to merge
|
||||
* @return index of this region
|
||||
* @throws IllegalArgumentException if region contains fewer than 2 cells
|
||||
* @throws IllegalStateException if region intersects with an existing merged region
|
||||
* or multi-cell array formula on this sheet
|
||||
*/
|
||||
@Override
|
||||
public int addMergedRegion(CellRangeAddress region) {
|
||||
if (region.getNumberOfCells() < 2) {
|
||||
throw new IllegalArgumentException("Merged region " + region.formatAsString() + " must contain 2 or more cells");
|
||||
}
|
||||
region.validate(SpreadsheetVersion.EXCEL97);
|
||||
|
||||
// throw IllegalStateException if the argument CellRangeAddress intersects with
|
||||
|
|
|
@ -301,6 +301,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||
*
|
||||
* @param region to merge
|
||||
* @return index of this region
|
||||
* @throws IllegalArgumentException if region contains fewer than 2 cells
|
||||
* @throws IllegalStateException if region intersects with a multi-cell array formula
|
||||
* @throws IllegalStateException if region intersects with an existing region on this sheet
|
||||
*/
|
||||
|
@ -320,6 +321,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||
*
|
||||
* @param region to merge
|
||||
* @return index of this region
|
||||
* @throws IllegalArgumentException if region contains fewer than 2 cells
|
||||
*/
|
||||
public int addMergedRegionUnsafe(CellRangeAddress region) {
|
||||
return addMergedRegion(region, false);
|
||||
|
@ -333,6 +335,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||
* @param region to merge
|
||||
* @param validate whether to validate merged region
|
||||
* @return index of this region
|
||||
* @throws IllegalArgumentException if region contains fewer than 2 cells (this check is inexpensive and is performed regardless of <tt>validate</tt>)
|
||||
* @throws IllegalStateException if region intersects with a multi-cell array formula
|
||||
* @throws IllegalStateException if region intersects with an existing region on this sheet
|
||||
*/
|
||||
|
|
|
@ -274,37 +274,59 @@ public abstract class BaseTestSheet {
|
|||
final Workbook wb = _testDataProvider.createWorkbook();
|
||||
final Sheet sheet = wb.createSheet();
|
||||
|
||||
final CellRangeAddress baseRegion = new CellRangeAddress(0, 1, 0, 1);
|
||||
final CellRangeAddress baseRegion = new CellRangeAddress(0, 1, 0, 1); //A1:B2
|
||||
sheet.addMergedRegion(baseRegion);
|
||||
|
||||
try {
|
||||
final CellRangeAddress duplicateRegion = new CellRangeAddress(0, 1, 0, 1);
|
||||
final CellRangeAddress duplicateRegion = new CellRangeAddress(0, 1, 0, 1); //A1:B2
|
||||
sheet.addMergedRegion(duplicateRegion);
|
||||
fail("Should not be able to add a merged region if sheet already contains the same merged region");
|
||||
fail("Should not be able to add a merged region (" + duplicateRegion.formatAsString() + ") " +
|
||||
"if sheet already contains the same merged region (" + baseRegion.formatAsString() + ")");
|
||||
} catch (final IllegalStateException e) { } //expected
|
||||
|
||||
try {
|
||||
final CellRangeAddress partiallyOverlappingRegion = new CellRangeAddress(1, 2, 1, 2);
|
||||
final CellRangeAddress partiallyOverlappingRegion = new CellRangeAddress(1, 2, 1, 2); //B2:C3
|
||||
sheet.addMergedRegion(partiallyOverlappingRegion);
|
||||
fail("Should not be able to add a merged region if it partially overlaps with an existing merged region");
|
||||
fail("Should not be able to add a merged region (" + partiallyOverlappingRegion.formatAsString() + ") " +
|
||||
"if it partially overlaps with an existing merged region (" + baseRegion.formatAsString() + ")");
|
||||
} catch (final IllegalStateException e) { } //expected
|
||||
|
||||
try {
|
||||
final CellRangeAddress subsetRegion = new CellRangeAddress(0, 1, 0, 0);
|
||||
final CellRangeAddress subsetRegion = new CellRangeAddress(0, 1, 0, 0); //A1:A2
|
||||
sheet.addMergedRegion(subsetRegion);
|
||||
fail("Should not be able to add a merged region if it is a formal subset of an existing merged region");
|
||||
fail("Should not be able to add a merged region (" + subsetRegion.formatAsString() + ") " +
|
||||
"if it is a formal subset of an existing merged region (" + baseRegion.formatAsString() + ")");
|
||||
} catch (final IllegalStateException e) { } //expected
|
||||
|
||||
try {
|
||||
final CellRangeAddress supersetRegion = new CellRangeAddress(0, 2, 0, 2);
|
||||
final CellRangeAddress supersetRegion = new CellRangeAddress(0, 2, 0, 2); //A1:C3
|
||||
sheet.addMergedRegion(supersetRegion);
|
||||
fail("Should not be able to add a merged region if it is a formal superset of an existing merged region");
|
||||
fail("Should not be able to add a merged region (" + supersetRegion.formatAsString() + ") " +
|
||||
"if it is a formal superset of an existing merged region (" + baseRegion.formatAsString() + ")");
|
||||
} catch (final IllegalStateException e) { } //expected
|
||||
|
||||
final CellRangeAddress disjointRegion = new CellRangeAddress(10, 11, 10, 11);
|
||||
sheet.addMergedRegion(disjointRegion); //allowed
|
||||
}
|
||||
|
||||
/*
|
||||
* Bug 56345: Reject single-cell merged regions
|
||||
*/
|
||||
@Test
|
||||
public void addMergedRegionWithSingleCellShouldFail() throws IOException {
|
||||
final Workbook wb = _testDataProvider.createWorkbook();
|
||||
|
||||
final Sheet sheet = wb.createSheet();
|
||||
final CellRangeAddress region = CellRangeAddress.valueOf("A1:A1");
|
||||
try {
|
||||
sheet.addMergedRegion(region);
|
||||
fail("Should not be able to add a single-cell merged region (" + region.formatAsString() + ")");
|
||||
} catch (final IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
wb.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test adding merged regions. If the region's bounds are outside of the allowed range
|
||||
* then an IllegalArgumentException should be thrown
|
||||
|
|
Loading…
Reference in New Issue