]> source.dussan.org Git - poi.git/commitdiff
Excel 2007 and later allows for more than 3 Conditional Formatting rules per sheet...
authorNick Burch <nick@apache.org>
Fri, 2 May 2014 15:49:23 +0000 (15:49 +0000)
committerNick Burch <nick@apache.org>
Fri, 2 May 2014 15:49:23 +0000 (15:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1591959 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
test-data/spreadsheet/56482.xls [new file with mode: 0644]

index 03f97875712065af9c7364cf2be85242896a93d0..d9d64123a6a0f92ae7ee72a7f734d5537f4c7d9d 100644 (file)
@@ -29,15 +29,21 @@ import org.apache.poi.ss.formula.ptg.AreaErrPtg;
 import org.apache.poi.ss.formula.ptg.AreaPtg;
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 /**
- * CFRecordsAggregate - aggregates Conditional Formatting records CFHeaderRecord 
- * and number of up to three CFRuleRecord records together to simplify
- * access to them.
+ * <p>CFRecordsAggregate - aggregates Conditional Formatting records CFHeaderRecord 
+ * and number of up CFRuleRecord records together to simplify access to them.</p>
+ * <p>Note that Excel versions before 2007 can only cope with a maximum of 3
+ *  Conditional Formatting rules per sheet. Excel 2007 or newer can cope with
+ *  unlimited numbers, as can Apache OpenOffice. This is an Excel limitation,
+ *  not a file format one.</p> 
  */
 public final class CFRecordsAggregate extends RecordAggregate {
-       /** Excel allows up to 3 conditional formating rules */
-       private static final int MAX_CONDTIONAL_FORMAT_RULES = 3;
+       /** Excel 97-2003 allows up to 3 conditional formating rules */
+       private static final int MAX_97_2003_CONDTIONAL_FORMAT_RULES = 3;
+       private static final POILogger logger = POILogFactory.getLogger(CFRecordsAggregate.class);
 
        private final CFHeaderRecord header;
 
@@ -51,9 +57,11 @@ public final class CFRecordsAggregate extends RecordAggregate {
                if(pRules == null) {
                        throw new IllegalArgumentException("rules must not be null");
                }
-               if(pRules.length > MAX_CONDTIONAL_FORMAT_RULES) {
-                       throw new IllegalArgumentException("No more than " 
-                                       + MAX_CONDTIONAL_FORMAT_RULES + " rules may be specified");
+               if(pRules.length > MAX_97_2003_CONDTIONAL_FORMAT_RULES) {
+                   logger.log(POILogger.WARN, "Excel versions before 2007 require that "
+                               + "No more than " + MAX_97_2003_CONDTIONAL_FORMAT_RULES 
+                               + " rules may be specified, " + pRules.length + " were found,"
+                               + " this file will cause problems with old Excel versions");
                }
                if (pRules.length != pHeader.getNumberOfConditionalFormats()) {
                        throw new RuntimeException("Mismatch number of rules");
@@ -134,9 +142,10 @@ public final class CFRecordsAggregate extends RecordAggregate {
                if (r == null) {
                        throw new IllegalArgumentException("r must not be null");
                }
-               if(rules.size() >= MAX_CONDTIONAL_FORMAT_RULES) {
-                       throw new IllegalStateException("Cannot have more than " 
-                                       + MAX_CONDTIONAL_FORMAT_RULES + " conditional format rules");
+               if(rules.size() >= MAX_97_2003_CONDTIONAL_FORMAT_RULES) {
+            logger.log(POILogger.WARN, "Excel versions before 2007 cannot cope with" 
+                           + " any more than " + MAX_97_2003_CONDTIONAL_FORMAT_RULES 
+                    + " - this file will cause problems with old Excel versions");
                }
                rules.add(r);
                header.setNumberOfConditionalFormats(rules.size());
index 16d8e208b644b351471156d25f5f09c5e5f34238..197531965d8720f54d754817b790c4e616661506 100644 (file)
@@ -2565,4 +2565,18 @@ public final class TestBugs extends BaseTestBugzillaIssues {
         }
         assertEquals(0, comments);
     }
+    
+    /**
+     * Files initially created with Excel 2010 can have >3 CF rules
+     */
+    @Test
+    public void bug56482() {
+        HSSFWorkbook wb = openSample("56482.xls");
+        assertEquals(1, wb.getNumberOfSheets());
+        
+        HSSFSheet sheet = wb.getSheetAt(0);
+        HSSFSheetConditionalFormatting cf = sheet.getSheetConditionalFormatting();
+        
+        assertEquals(5, cf.getNumConditionalFormattings());
+    }
 }
diff --git a/test-data/spreadsheet/56482.xls b/test-data/spreadsheet/56482.xls
new file mode 100644 (file)
index 0000000..466aa19
Binary files /dev/null and b/test-data/spreadsheet/56482.xls differ