From: Javen O'Neal Date: Thu, 18 Feb 2016 01:33:14 +0000 (+0000) Subject: bug 56345: reject single-cell merged regions X-Git-Tag: REL_3_14_FINAL~31 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=9ee05a14528f38d37cbbf2f8d4af5554df60b30c;p=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 --- diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java index 53b12a1163..b6ad9c9be0 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java @@ -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 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 ee83e78c69..b62d1a5e96 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -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 validate) * @throws IllegalStateException if region intersects with a multi-cell array formula * @throws IllegalStateException if region intersects with an existing region on this sheet */ diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java index 0dd2bc23f0..acc5ed4fb4 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java @@ -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