]> source.dussan.org Git - poi.git/commitdiff
bug 56345: reject single-cell merged regions
authorJaven O'Neal <onealj@apache.org>
Thu, 18 Feb 2016 01:33:14 +0000 (01:33 +0000)
committerJaven O'Neal <onealj@apache.org>
Thu, 18 Feb 2016 01:33:14 +0000 (01:33 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1730991 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java

index 53b12a1163fe4b1f33ea8732c681e3d194582c22..b6ad9c9be0beac93df55f5035313ceee6eacdd44 100644 (file)
@@ -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
index ee83e78c698067aa64fc5627efc0ce71f6d37eb9..b62d1a5e9615e87d300151a2415b44161b994519 100644 (file)
@@ -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
      */
index 0dd2bc23f0292d770609235b01a83188dbe0ee5a..acc5ed4fb452a8415a7facdd8b31a3490ba170d2 100644 (file)
@@ -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