]> source.dussan.org Git - poi.git/commitdiff
fixed HSSFWorkbook.createCellStyle to throw exception if the maximum number of cell...
authorYegor Kozlov <yegor@apache.org>
Fri, 11 Feb 2011 10:03:25 +0000 (10:03 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 11 Feb 2011 10:03:25 +0000 (10:03 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1069730 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java

index 55a3de8c7b28e678de802fe0f1c91e92af8b3922..6bcbea14e86581a4a037594b388cb18b1015b7c9 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta1" date="2010-??-??">
+           <action dev="poi-developers" type="fix">fixed HSSFWorkbook.createCellStyle to throw exception if the maximum number of cell styles was exceeded</action>
            <action dev="poi-developers" type="fix">50539 - Better fix for html-style br tags (invalid XML) inside XSSF documents</action>
            <action dev="poi-developers" type="add">49928 - allow overridden built-in formats in HSSFCellStyle</action>
            <action dev="POI-DEVELOPERS" type="add">50607 - Added implementation for CLEAN(), CHAR() and ADDRESS()</action>
index f5b4423b35df84544a4accfac0e5a6ebb7d3b609..20b5712f18438e2513939dd081017b9781350878 100644 (file)
@@ -57,7 +57,6 @@ import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
 import org.apache.poi.hssf.record.common.UnicodeString;
 import org.apache.poi.ss.formula.ptg.Area3DPtg;
 import org.apache.poi.ss.formula.ptg.MemFuncPtg;
-import org.apache.poi.ss.formula.ptg.NameXPtg;
 import org.apache.poi.ss.formula.ptg.OperandPtg;
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.formula.ptg.Ref3DPtg;
@@ -68,7 +67,6 @@ import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.ss.formula.udf.AggregatingUDFFinder;
 import org.apache.poi.ss.formula.udf.UDFFinder;
-import org.apache.poi.ss.usermodel.CreationHelper;
 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.util.WorkbookUtil;
@@ -92,6 +90,16 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
     private static final int MAX_ROW = 0xFFFF;
     private static final short MAX_COLUMN = (short)0x00FF;
 
+    /**
+     * The maximum number of cell styles in a .xls workbook.
+     * The 'official' limit is 4,000, but POI allows a slightly larger number.
+     * This extra delta takes into account built-in styles that are automatically
+     * created for new workbooks
+     *
+     * See http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP005199291.aspx
+     */
+    private static final int MAX_STYLES = 4030;
+
     private static final int DEBUG = POILogger.DEBUG;
 
     /**
@@ -1123,12 +1131,19 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
     }
 
     /**
-     * create a new Cell style and add it to the workbook's style table
+     * Create a new Cell style and add it to the workbook's style table.
+     * You can define up to 4000 unique styles in a .xls workbook.
+     *
      * @return the new Cell Style object
+     * @throws IllegalStateException if the maximum number of cell styles exceeded the limit
      */
 
     public HSSFCellStyle createCellStyle()
     {
+        if(workbook.getNumExFormats() == MAX_STYLES) {
+            throw new IllegalStateException("The maximum number of cell styles was exceeded. " +
+                    "You can define up to 4000 styles in a .xls workbook");
+        }
         ExtendedFormatRecord xfr = workbook.createCellXF();
         short index = (short) (getNumCellStyles() - 1);
         HSSFCellStyle style = new HSSFCellStyle(index, xfr, this);
index 81da9971bd224f5e6549e74acf729609b4d057d2..182ac6aef621b542f4d2287d00f76f7f3e0ff541 100644 (file)
@@ -559,4 +559,23 @@ public final class TestHSSFWorkbook extends BaseTestWorkbook {
           assertEquals("replaceMe", cell .getRichStringCellValue().getString());
        }
     }
+    public void testCellStylesLimit() {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        int numBuiltInStyles = wb.getNumCellStyles();
+        int MAX_STYLES = 4030;
+        int limit = MAX_STYLES - numBuiltInStyles;
+        for(int i=0; i < limit; i++){
+            HSSFCellStyle style = wb.createCellStyle();
+        }
+
+        assertEquals(MAX_STYLES, wb.getNumCellStyles());
+        try {
+            HSSFCellStyle style = wb.createCellStyle();
+            fail("expected exception");
+        } catch (IllegalStateException e){
+            assertEquals("The maximum number of cell styles was exceeded. " +
+                    "You can define up to 4000 styles in a .xls workbook", e.getMessage());
+        }
+        assertEquals(MAX_STYLES, wb.getNumCellStyles());
+    }
 }