]> source.dussan.org Git - poi.git/commitdiff
consolidate limits specific to Excel version(Excel97, Excel2007) in SpreadsheetVersio...
authorYegor Kozlov <yegor@apache.org>
Mon, 6 Apr 2009 15:06:23 +0000 (15:06 +0000)
committerYegor Kozlov <yegor@apache.org>
Mon, 6 Apr 2009 15:06:23 +0000 (15:06 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@762372 13f79535-47bb-0310-9956-ffa450edef68

25 files changed:
src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/RowRecord.java
src/java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java
src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java
src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java
src/java/org/apache/poi/hssf/util/CellRangeAddress.java
src/java/org/apache/poi/ss/SpreadsheetVersion.java
src/java/org/apache/poi/ss/util/AreaReference.java
src/java/org/apache/poi/ss/util/CellRangeAddressBase.java
src/java/org/apache/poi/ss/util/CellReference.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/testcases/org/apache/poi/xssf/XSSFITestDataProvider.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRow.java
src/testcases/org/apache/poi/hssf/HSSFITestDataProvider.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java
src/testcases/org/apache/poi/ss/ITestDataProvider.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestWorkbook.java

index 58f29dd78ca0455f3f560471496cd6a7c5aca9d8..cd5b4fd678a3a16381fadfaf168182a275d0c1cb 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.5-beta6" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">46832 - Allow merged regions with columns greater than 255 or rows bigger than 65536 in XSSF</action>
            <action dev="POI-DEVELOPERS" type="fix">46951 - Fixed formula parser to better handle range operators and whole row/column refs.</action>
            <action dev="POI-DEVELOPERS" type="fix">46948 - Fixed evaluation of range operator to allow for area-ref operands</action>
            <action dev="POI-DEVELOPERS" type="fix">46918 - Fixed ExtendedPivotTableViewFieldsRecord(SXVDEX) to allow shorter format</action>
index 45e451845281c0f78176f12c1b02ea558854d506..1fd834463086c08226b0515f9fe6470b2ccd0e4c 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.5-beta6" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">46832 - Allow merged regions with columns greater than 255 or rows bigger than 65536 in XSSF</action>
            <action dev="POI-DEVELOPERS" type="fix">46951 - Fixed formula parser to better handle range operators and whole row/column refs.</action>
            <action dev="POI-DEVELOPERS" type="fix">46948 - Fixed evaluation of range operator to allow for area-ref operands</action>
            <action dev="POI-DEVELOPERS" type="fix">46918 - Fixed ExtendedPivotTableViewFieldsRecord(SXVDEX) to allow shorter format</action>
index a2f1e22def63b1e9528036e0790937f7bec3c6b5..a3e0c24d3a3a425d07181e8eeea9c756db5af463 100644 (file)
@@ -38,11 +38,6 @@ public final class RowRecord extends StandardRecord {
     private static final int OPTION_BITS_ALWAYS_SET = 0x0100;
     private static final int DEFAULT_HEIGHT_BIT = 0x8000;
 
-    /** The maximum row number that excel can handle (zero based) ie 65536 rows is
-     *  max number of rows.
-     */
-    public final static int MAX_ROW_NUMBER = 65535;
-    
     private int field_1_row_number;
     private int field_2_first_col;
     private int field_3_last_col; // plus 1
index f3601f6f912f90929307e195c8a5b7b9b2cbbe96..1d10332cb517b8b202abe70fda9447d69a5967e6 100644 (file)
@@ -39,6 +39,7 @@ import org.apache.poi.hssf.record.SharedFormulaRecord;
 import org.apache.poi.hssf.record.TableRecord;
 import org.apache.poi.hssf.record.UnknownRecord;
 import org.apache.poi.hssf.record.formula.FormulaShifter;
+import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  *
@@ -138,8 +139,9 @@ public final class RowRecordsAggregate extends RecordAggregate {
        }
 
        public RowRecord getRow(int rowIndex) {
-               if (rowIndex < 0 || rowIndex > 65535) {
-                       throw new IllegalArgumentException("The row number must be between 0 and 65535");
+        int maxrow = SpreadsheetVersion.EXCEL97.getLastRowIndex();
+        if (rowIndex < 0 || rowIndex > maxrow) {
+                       throw new IllegalArgumentException("The row number must be between 0 and " + maxrow);
                }
                return _rowRecords.get(new Integer(rowIndex));
        }
index 33e1315157ae27bc6a4c6021ee0e3c3dd17bf2dd..205dd0ddf289713feccdba2ab4ffeb3d3dcafdad 100644 (file)
@@ -22,6 +22,7 @@ import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
+import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  * ReferencePtgBase - handles references (such as A1, A2, IA4)
@@ -31,7 +32,7 @@ import org.apache.poi.util.LittleEndianOutput;
  */
 public abstract class RefPtgBase extends OperandPtg {
 
-       private final static int MAX_ROW_NUMBER = 65536;
+       private final static int MAX_ROW_NUMBER = SpreadsheetVersion.EXCEL97.getMaxRows();
 
        /** The row index - zero based unsigned 16 bit value */
        private int field_1_row;
@@ -73,7 +74,7 @@ public abstract class RefPtgBase extends OperandPtg {
        }
 
        /**
-        * @return the row number as an int, between 0 and 65535
+        * @return the row number as an int
         */
        public final int getRow() {
                return field_1_row;
index 65736aa9f05c5caaaf81d9f9f86222b3bf2194b3..d985216c9dd24d941c3483bdd69e3d87a6782c0d 100644 (file)
@@ -55,6 +55,7 @@ import org.apache.poi.ss.usermodel.Comment;
 import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.formula.FormulaType;
+import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  * High level representation of a cell in a row of a spreadsheet.
@@ -79,8 +80,8 @@ public class HSSFCell implements Cell {
     /**
      * The maximum  number of columns in BIFF8
      */
-    public static final int LAST_COLUMN_NUMBER  = 255; // 2^8 - 1
-    private static final String LAST_COLUMN_NAME  = "IV";
+    public static final int LAST_COLUMN_NUMBER  = SpreadsheetVersion.EXCEL97.getLastColumnIndex(); // 2^8 - 1
+    private static final String LAST_COLUMN_NAME  = SpreadsheetVersion.EXCEL97.getLastColumnName();
     
     public final static short        ENCODING_UNCHANGED          = -1;
     public final static short        ENCODING_COMPRESSED_UNICODE = 0;
index 50483d908f3e1f955789084626fbfa6b2cac3ec4..53938cf821154b5dc09a29aab90a1cab7ba4c26c 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.poi.hssf.record.ExtendedFormatRecord;
 import org.apache.poi.hssf.record.RowRecord;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  * High level representation of a row of a spreadsheet.
@@ -222,9 +223,10 @@ public final class HSSFRow implements Row {
      * @throws IndexOutOfBoundsException if the row number is not within the range 0-65535.
      */
     public void setRowNum(int rowIndex) {
-        if ((rowIndex < 0) || (rowIndex > RowRecord.MAX_ROW_NUMBER)) {
+        int maxrow = SpreadsheetVersion.EXCEL97.getLastRowIndex();
+        if ((rowIndex < 0) || (rowIndex > maxrow)) {
           throw new IllegalArgumentException("Invalid row number (" + rowIndex
-                  + ") outside allowable range (0.." + RowRecord.MAX_ROW_NUMBER + ")");
+                  + ") outside allowable range (0.." + maxrow + ")");
         }
         rowNum = rowIndex;
         if (row != null) {
index 4fdbfd00f97797f1885f768942ee433a5b017e9c..cf81a856869217f45c7f65328933786e3a095276 100644 (file)
@@ -51,6 +51,7 @@ import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
@@ -558,6 +559,7 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
      */
     public int addMergedRegion(CellRangeAddress region)
     {
+        region.validate(SpreadsheetVersion.EXCEL97);
         return _sheet.addMergedRegion( region.getFirstRow(),
                 region.getFirstColumn(),
                 region.getLastRow(),
@@ -1256,7 +1258,7 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
                 }
             }
         }
-        if ( endRow == _lastrow || endRow + n > _lastrow ) _lastrow = Math.min( endRow + n, 65535 );
+        if ( endRow == _lastrow || endRow + n > _lastrow ) _lastrow = Math.min( endRow + n, SpreadsheetVersion.EXCEL97.getLastRowIndex() );
         if ( startRow == _firstrow || startRow + n < _firstrow ) _firstrow = Math.max( startRow + n, 0 );
 
         // Update any formulas on this sheet that point to
@@ -1291,8 +1293,8 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
      * @param leftmostColumn   Left column visible in right pane.
      */
     public void createFreezePane(int colSplit, int rowSplit, int leftmostColumn, int topRow) {
-        if (colSplit < 0 || colSplit > 255) throw new IllegalArgumentException("Column must be between 0 and 255");
-        if (rowSplit < 0 || rowSplit > 65535) throw new IllegalArgumentException("Row must be between 0 and 65535");
+        validateColumn(colSplit);
+        validateRow(rowSplit);
         if (leftmostColumn < colSplit) throw new IllegalArgumentException("leftmostColumn parameter must not be less than colSplit parameter");
         if (topRow < rowSplit) throw new IllegalArgumentException("topRow parameter must not be less than leftmostColumn parameter");
         getSheet().createFreezePane( colSplit, rowSplit, topRow, leftmostColumn );
@@ -1426,7 +1428,7 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
      */
     public void setColumnBreak(int column) {
         validateColumn((short)column);
-        _sheet.getPageSettings().setColumnBreak((short)column, (short)0, (short)65535);
+        _sheet.getPageSettings().setColumnBreak((short)column, (short)0, (short) SpreadsheetVersion.EXCEL97.getLastRowIndex());
     }
 
     /**
@@ -1451,7 +1453,8 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
      * @param row
      */
     protected void validateRow(int row) {
-        if (row > 65535) throw new IllegalArgumentException("Maximum row number is 65535");
+        int maxrow = SpreadsheetVersion.EXCEL97.getLastRowIndex();
+        if (row > maxrow) throw new IllegalArgumentException("Maximum row number is " + maxrow);
         if (row < 0) throw new IllegalArgumentException("Minumum row number is 0");
     }
 
@@ -1459,8 +1462,9 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
      * Runs a bounds check for column numbers
      * @param column
      */
-    protected void validateColumn(short column) {
-        if (column > 255) throw new IllegalArgumentException("Maximum column number is 255");
+    protected void validateColumn(int column) {
+        int maxcol = SpreadsheetVersion.EXCEL97.getLastColumnIndex();
+        if (column > maxcol) throw new IllegalArgumentException("Maximum column number is " + maxcol);
         if (column < 0)    throw new IllegalArgumentException("Minimum column number is 0");
     }
 
index f3c93611ee3aac7d33e6e577ec7133fa3d007608..ce6235a1af3325c64be3621f79c9eabf953998da 100644 (file)
@@ -23,6 +23,7 @@ import org.apache.poi.hssf.record.aggregates.CFRecordsAggregate;
 import org.apache.poi.hssf.record.aggregates.ConditionalFormattingTable;\r
 import org.apache.poi.ss.util.Region;\r
 import org.apache.poi.ss.util.CellRangeAddress;\r
+import org.apache.poi.ss.SpreadsheetVersion;\r
 \r
 /**\r
  * The 'Conditional Formatting' facet of <tt>HSSFSheet</tt>\r
@@ -120,7 +121,9 @@ public final class HSSFSheetConditionalFormatting {
                if (regions == null) {\r
                        throw new IllegalArgumentException("regions must not be null");\r
                }\r
-               if (cfRules == null) {\r
+        for(CellRangeAddress range : regions) range.validate(SpreadsheetVersion.EXCEL97);\r
+\r
+        if (cfRules == null) {\r
                        throw new IllegalArgumentException("cfRules must not be null");\r
                }\r
                if (cfRules.length == 0) {\r
index 72c493021e899a8192011a8cd60e7a15a467c8ad..da8d56c0919da3b05f6d54594e887b8f8137774b 100644 (file)
@@ -28,23 +28,11 @@ import org.apache.poi.hssf.record.SelectionRecord;
  * @author Dragos Buleandra (dragos.buleandra@trade2b.ro)\r
  */\r
 public class CellRangeAddress extends org.apache.poi.ss.util.CellRangeAddress {\r
-       /*\r
-        * TODO - replace  org.apache.poi.hssf.util.Region\r
-        */\r
-       public static final int ENCODED_SIZE = 8;\r
 \r
        public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) {\r
                super(firstRow, lastRow, firstCol, lastCol);\r
        }\r
        public CellRangeAddress(RecordInputStream in) {\r
-               super(readUShortAndCheck(in), in.readUShort(), in.readUShort(), in.readUShort());\r
-       }\r
-\r
-       private static int readUShortAndCheck(RecordInputStream in) {\r
-               if (in.remaining() < ENCODED_SIZE) {\r
-                       // Ran out of data\r
-                       throw new RuntimeException("Ran out of data reading CellRangeAddress");\r
-               }\r
-               return in.readUShort();\r
+               super(in);\r
        }\r
 }\r
index 754fbdbb6bc82502b0625edaa41d60fe56c51136..4a7b2bbe4fad7bf508933a830ea8e3e1d8941211 100755 (executable)
@@ -25,8 +25,6 @@ import org.apache.poi.ss.util.CellReference;
  * discernable to the user.  It is not intended to deal with low-level issues like file formats.  \r
  * <p/>\r
  * \r
- * For internal POI use only\r
- * \r
  * @author Josh Micich\r
  * @author Yegor Kozlov\r
  */\r
index c3b383edf655ca299cc63bfe30d9e7c56065d377..ffa0c8888d041e0f6433abe9e02f529cddb80d8f 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.ss.util;
 
+import org.apache.poi.ss.SpreadsheetVersion;
+
 import java.util.ArrayList;
 import java.util.StringTokenizer;
 
@@ -176,7 +178,7 @@ public class AreaReference {
         //   C$1:C$65535 or D$1:F$0
         // i.e. absolute from 1st row to 0th one
         if(topLeft.getRow() == 0 && topLeft.isRowAbsolute() &&
-            botRight.getRow() == 65535 && botRight.isRowAbsolute()) {
+            botRight.getRow() == SpreadsheetVersion.EXCEL97.getLastRowIndex() && botRight.isRowAbsolute()) {
             return true;
         }
         return false;
index 3caf5df31ba8b9da1a71a650130dca94011156b2..0b732a2984744c98727d9c72bddf1b9b26383473 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.ss.util;
 
+import org.apache.poi.ss.SpreadsheetVersion;
+
 
 /**
  * See OOO documentation: excelfileformat.pdf sec 2.5.14 - 'Cell Range Address'<p/>
@@ -27,49 +29,58 @@ package org.apache.poi.ss.util;
  */
 public abstract class CellRangeAddressBase {
 
-       /** max 65536 rows in BIFF8 */
-       private static final int LAST_ROW_INDEX = 0x00FFFF; 
-       /** max 256 columns in BIFF8 */
-       private static final int LAST_COLUMN_INDEX = 0x00FF;
-       
        private int _firstRow;
        private int _firstCol;
        private int _lastRow;
        private int _lastCol;
 
        protected CellRangeAddressBase(int firstRow, int lastRow, int firstCol, int lastCol) {
-               if(!isValid(firstRow, lastRow, firstCol, lastCol)) {
-                       throw new IllegalArgumentException("invalid cell range (" + firstRow + ", " + lastRow 
-                                       + ", " + firstCol + ", " + lastCol + ")");
-               }
                _firstRow = firstRow;
-               _lastRow =lastRow;
+               _lastRow = lastRow;
                _firstCol = firstCol;
                _lastCol = lastCol;
        }
-       private static boolean isValid(int firstRow, int lastRow, int firstColumn, int lastColumn) {
-               if(lastRow < 0 || lastRow > LAST_ROW_INDEX) {
-                       return false;
-               }
-               if(firstRow < 0 || firstRow > LAST_ROW_INDEX) {
-                       return false;
-               }
-               
-               if(lastColumn < 0 || lastColumn > LAST_COLUMN_INDEX) {
-                       return false;
-               }
-               if(firstColumn < 0 || firstColumn > LAST_COLUMN_INDEX) {
-                       return false;
-               }
-               return true;
+
+    /**
+     * Validate the range limits against the supplied version of Excel
+     *
+     * @param ssVersion the version of Excel to validate against
+     * @throws IllegalArgumentException if the range limits are outside of the allowed range
+     */
+    public void validate(SpreadsheetVersion ssVersion) {
+        validateRow(_firstRow, ssVersion);
+               validateRow(_lastRow, ssVersion);
+        validateColumn(_firstCol, ssVersion);
+               validateColumn(_lastCol, ssVersion);
        }
-       
+    /**
+     * Runs a bounds check for row numbers
+     * @param row
+     */
+    private static void validateRow(int row, SpreadsheetVersion ssVersion) {
+        int maxrow = ssVersion.getLastRowIndex();
+        if (row > maxrow) throw new IllegalArgumentException("Maximum row number is " + maxrow);
+        if (row < 0) throw new IllegalArgumentException("Minumum row number is 0");
+    }
+
+    /**
+     * Runs a bounds check for column numbers
+     * @param column
+     */
+    private static void validateColumn(int column, SpreadsheetVersion ssVersion) {
+        int maxcol = ssVersion.getLastColumnIndex();
+        if (column > maxcol) throw new IllegalArgumentException("Maximum column number is " + maxcol);
+        if (column < 0)    throw new IllegalArgumentException("Minimum column number is 0");
+    }
+
 
-       public final boolean isFullColumnRange() {
-               return _firstRow == 0 && _lastRow == LAST_ROW_INDEX;
+    //TODO use the correct SpreadsheetVersion
+    public final boolean isFullColumnRange() {
+               return _firstRow == 0 && _lastRow == SpreadsheetVersion.EXCEL97.getLastRowIndex();
        }
+    //TODO use the correct SpreadsheetVersion
        public final boolean isFullRowRange() {
-               return _firstCol == 0 && _lastCol == LAST_COLUMN_INDEX;
+               return _firstCol == 0 && _lastCol == SpreadsheetVersion.EXCEL97.getLastColumnIndex();
        }
 
        /**
index 63d80f1c5815550a8e3db245f9761993fcacd11e..1b19f594a00ecaf4deff0df3a43f2e0cee6ef646 100644 (file)
@@ -21,6 +21,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.poi.hssf.record.formula.SheetNameFormatter;
+import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  *
@@ -61,9 +62,9 @@ public class CellReference {
         * digits or dot.  (They can even end in dot).
         */
        private static final Pattern NAMED_RANGE_NAME_PATTERN = Pattern.compile("[_A-Za-z][_.A-Za-z0-9]*");
-       private static final String BIFF8_LAST_COLUMN = "IV";
+       private static final String BIFF8_LAST_COLUMN = SpreadsheetVersion.EXCEL97.getLastColumnName();
        private static final int BIFF8_LAST_COLUMN_TEXT_LEN = BIFF8_LAST_COLUMN.length();
-       private static final String BIFF8_LAST_ROW = String.valueOf(0x10000);
+       private static final String BIFF8_LAST_ROW = String.valueOf(SpreadsheetVersion.EXCEL97.getMaxRows());
        private static final int BIFF8_LAST_ROW_TEXT_LEN = BIFF8_LAST_ROW.length();
 
     private final int _rowIndex;
index b517246196c8ecd9894d5077267ea8ae7f6c20d4..07d09fdbe8e60f69818958ee5a1f6ed5f6b5c3c3 100644 (file)
@@ -30,6 +30,7 @@ import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.ss.formula.FormulaParser;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.formula.FormulaRenderer;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.xssf.model.StylesTable;
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.apache.poi.util.POILogger;
@@ -56,13 +57,6 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
 public final class XSSFCell implements Cell {
     private static POILogger logger = POILogFactory.getLogger(XSSFCell.class);
 
-    private static final String FILE_FORMAT_NAME  = "BIFF12";
-    /**
-     * The maximum  number of columns in SpreadsheetML
-     */
-    public static final int LAST_COLUMN_NUMBER  = 16384-1; //2^14-1
-    private static final String LAST_COLUMN_NAME  = "XFD";
-
     private static final String FALSE_AS_STRING = "0";
     private static final String TRUE_AS_STRING  = "1";
 
@@ -791,10 +785,12 @@ public final class XSSFCell implements Cell {
      * @throws RuntimeException if the bounds are exceeded.
      */
     private static void checkBounds(int cellIndex) {
-        if (cellIndex < 0 || cellIndex > LAST_COLUMN_NUMBER) {
+        SpreadsheetVersion v = SpreadsheetVersion.EXCEL2007;
+        int maxcol = SpreadsheetVersion.EXCEL2007.getLastColumnIndex();
+        if (cellIndex < 0 || cellIndex > maxcol) {
             throw new IllegalArgumentException("Invalid column index (" + cellIndex 
-                    + ").  Allowable column range for " + FILE_FORMAT_NAME + " is (0.." 
-                    + LAST_COLUMN_NUMBER + ") or ('A'..'" + LAST_COLUMN_NAME + "')");
+                    + ").  Allowable column range for " + v.name() + " is (0.."
+                    + maxcol + ") or ('A'..'" + v.getLastColumnName() + "')");
         }
     }
 
index 20cbcf36773af56994e6ba4d051b5f027f4f29a6..4cc3db4e56ceeb5b4e102a435054bbd5a8553b51 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.ss.formula.FormulaParser;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.formula.FormulaRenderer;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.xssf.model.CalculationChain;
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.FormulaShifter;
@@ -41,12 +42,6 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
 public class XSSFRow implements Row, Comparable<XSSFRow> {
     private static final POILogger logger = POILogFactory.getLogger(XSSFRow.class);
 
-    private static final String FILE_FORMAT_NAME  = "BIFF12";
-    /**
-     * The maximum  number of rows in SpreadsheetML
-     */
-    public static final int MAX_ROW_NUMBER  = 1048575; //2 ^ 20 - 1
-
     /**
      * the xml bean containing all cell definitions for this row
      */
@@ -328,12 +323,13 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
      * Set the row number of this row.
      *
      * @param rowIndex  the row number (0-based)
-     * @throws IllegalArgumentException if rowNum < 0 or greater than {@link #MAX_ROW_NUMBER}
+     * @throws IllegalArgumentException if rowNum < 0 or greater than 1048575
      */
     public void setRowNum(int rowIndex) {
-        if (rowIndex < 0 || rowIndex > MAX_ROW_NUMBER) {
+        int maxrow = SpreadsheetVersion.EXCEL2007.getLastRowIndex();
+        if (rowIndex < 0 || rowIndex > maxrow) {
             throw new IllegalArgumentException("Invalid row number (" + rowIndex 
-                    + ") outside allowable range (0.." + MAX_ROW_NUMBER + ")");
+                    + ") outside allowable range (0.." + maxrow + ")");
         }
         row.setR(rowIndex + 1);
     }
index 8bf5172bdfd8be57015d8685a6f2befbc9118fa0..80d383d75946dc9607b3d954eaa62834d09e38f4 100644 (file)
@@ -34,6 +34,7 @@ import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.formula.FormulaParser;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.formula.FormulaRenderer;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.xssf.model.CommentsTable;
 import org.apache.poi.xssf.model.CalculationChain;
 import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
@@ -235,6 +236,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
      * @return index of this region
      */
     public int addMergedRegion(CellRangeAddress cra) {
+        cra.validate(SpreadsheetVersion.EXCEL2007);
+
         CTMergeCells ctMergeCells = worksheet.isSetMergeCells() ? worksheet.getMergeCells() : worksheet.addNewMergeCells();
         CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
         ctMergeCell.setRef(cra.formatAsString());
@@ -764,9 +767,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
 
         CTMergeCell ctMergeCell = ctMergeCells.getMergeCellArray(index);
         String ref = ctMergeCell.getRef();
-        CellReference cell1 = new CellReference(ref.substring(0, ref.indexOf(":")));
-        CellReference cell2 = new CellReference(ref.substring(ref.indexOf(":") + 1));
-        return new CellRangeAddress(cell1.getRow(), cell2.getRow(), cell1.getCol(), cell2.getCol());
+        return CellRangeAddress.valueOf(ref);
     }
 
     /**
index fac88830ad8584ed6abf20f353db8b3fb6276561..6a3a9d119ac757fd42888b52e65d27bdf153f80f 100755 (executable)
@@ -17,6 +17,7 @@
 package org.apache.poi.xssf;\r
 \r
 import org.apache.poi.ss.ITestDataProvider;\r
+import org.apache.poi.ss.SpreadsheetVersion;\r
 import org.apache.poi.ss.usermodel.Workbook;\r
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;\r
 import org.apache.poi.hssf.HSSFTestDataSamples;\r
@@ -46,6 +47,10 @@ public final class XSSFITestDataProvider implements ITestDataProvider {
         return HSSFTestDataSamples.getTestDataFileContent(fileName);\r
     }\r
 \r
+    public SpreadsheetVersion getSpreadsheetVersion(){\r
+        return SpreadsheetVersion.EXCEL2007;\r
+    }\r
+\r
     private XSSFITestDataProvider(){}\r
     private static XSSFITestDataProvider inst = new XSSFITestDataProvider();\r
     public static XSSFITestDataProvider getInstance(){\r
index 7da2f62281f6d03e73808eca11496647763472ea..11a430a47de9af6e8dd3521daf3dfd0a73de52e4 100644 (file)
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import junit.framework.TestCase;
 
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.XSSFITestDataProvider;
@@ -43,10 +44,10 @@ public final class TestXSSFRow extends BaseTestRow {
     }
 
     public void testRowBounds() {
-        baseTestRowBounds(XSSFRow.MAX_ROW_NUMBER);
+        baseTestRowBounds(SpreadsheetVersion.EXCEL2007.getLastRowIndex());
     }
 
     public void testCellBounds() {
-        baseTestCellBounds(XSSFCell.LAST_COLUMN_NUMBER);
+        baseTestCellBounds(SpreadsheetVersion.EXCEL2007.getLastColumnIndex());
     }
 }
index a86bd099eebe4d92b8b05d6f31f3ce59e18fd35f..926ed3d382944d17ee130c47f3bcde011444e760 100755 (executable)
@@ -19,6 +19,7 @@ package org.apache.poi.hssf;
 \r
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;\r
 import org.apache.poi.ss.ITestDataProvider;\r
+import org.apache.poi.ss.SpreadsheetVersion;\r
 import org.apache.poi.ss.usermodel.Workbook;\r
 \r
 /**\r
@@ -46,6 +47,10 @@ public final class HSSFITestDataProvider implements ITestDataProvider {
         return HSSFTestDataSamples.getTestDataFileContent(fileName);\r
     }\r
     \r
+    public SpreadsheetVersion getSpreadsheetVersion(){\r
+        return SpreadsheetVersion.EXCEL2007;\r
+    }\r
+\r
     private HSSFITestDataProvider(){}\r
     private static HSSFITestDataProvider inst = new HSSFITestDataProvider();\r
     public static HSSFITestDataProvider getInstance(){\r
index 1b63f9f233906460fe7d5058e9cc628729a00525..3c5a0911c4e94c8bb56ba4cb6e0c244bf35b6e9c 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.poi.hssf.HSSFITestDataProvider;
 import org.apache.poi.hssf.record.BlankRecord;
 import org.apache.poi.hssf.record.RowRecord;
 import org.apache.poi.ss.usermodel.BaseTestRow;
+import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  * Test HSSFRow is okay.
@@ -39,11 +40,11 @@ public final class TestHSSFRow extends BaseTestRow {
     }
 
     public void testRowBounds() {
-        baseTestRowBounds(RowRecord.MAX_ROW_NUMBER);
+        baseTestRowBounds(SpreadsheetVersion.EXCEL97.getLastRowIndex());
     }
 
     public void testCellBounds() {
-        baseTestCellBounds(HSSFCell.LAST_COLUMN_NUMBER);
+        baseTestCellBounds(SpreadsheetVersion.EXCEL97.getLastColumnIndex());
     }
 
     public void testLastAndFirstColumns_bug46654() {
index 65f2f7689109ca3378e06db4f490e7c4c902c8c7..af53957820d4c0ba3830a4e2c81935ec9d872011 100644 (file)
 
 package org.apache.poi.hssf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 
 import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.HSSFITestDataProvider;
 import org.apache.poi.hssf.model.Sheet;
 import org.apache.poi.hssf.model.DrawingManager2;
 import org.apache.poi.hssf.record.*;
-import org.apache.poi.ss.util.Region;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.usermodel.BaseTestSheet;
 import org.apache.poi.ddf.EscherDgRecord;
index 983147691b33ca3b5b40f4278494c14528e78ee2..db31b8f39bad344cf4875079bc0d94f6c510931e 100755 (executable)
@@ -50,4 +50,6 @@ public interface ITestDataProvider {
      * @return an open <tt>InputStream</tt> for the specified sample file\r
      */\r
     byte[] getTestDataFileContent(String fileName);\r
+\r
+    SpreadsheetVersion getSpreadsheetVersion();\r
 }\r
index c119ce05fc739465b72a0145b2f94e106dc6336b..9c51656dd4738771b601393cc9ccbcdfbd61fe77 100755 (executable)
@@ -19,6 +19,7 @@ package org.apache.poi.ss.usermodel;
 
 import junit.framework.TestCase;
 import org.apache.poi.ss.ITestDataProvider;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.util.CellRangeAddress;
 
 import java.util.Iterator;
@@ -195,6 +196,46 @@ public abstract class BaseTestSheet extends TestCase {
         assertEquals(3, sheetP.getPrintSetup().getCopies());
     }
 
+    /**
+     * Test adding merged regions. If the region's bounds are outside of the allowed range
+     * then an IllegalArgumentException should be thrown
+     *
+     */
+    public void testAddMerged() {
+        Workbook wb = getTestDataProvider().createWorkbook();
+        Sheet sheet = wb.createSheet();
+        assertEquals(0, sheet.getNumMergedRegions());
+        SpreadsheetVersion ssVersion = getTestDataProvider().getSpreadsheetVersion();
+
+        CellRangeAddress region = new CellRangeAddress(0, 1, 0, 1);
+        sheet.addMergedRegion(region);
+        assertEquals(1, sheet.getNumMergedRegions());
+
+        try {
+            region = new CellRangeAddress(-1, -1, -1, -1);
+            sheet.addMergedRegion(region);
+            fail("Expected exception");
+        } catch (IllegalArgumentException e){
+            ;
+        }
+        try {
+            region = new CellRangeAddress(0, 0, 0, ssVersion.getLastColumnIndex() + 1);
+            sheet.addMergedRegion(region);
+            fail("Expected exception");
+        } catch (IllegalArgumentException e){
+            ;
+        }
+        try {
+            region = new CellRangeAddress(0, ssVersion.getLastRowIndex() + 1, 0, 1);
+            sheet.addMergedRegion(region);
+            fail("Expected exception");
+        } catch (IllegalArgumentException e){
+            ;
+        }
+        assertEquals(1, sheet.getNumMergedRegions());
+        
+    }
+
     /**
      * When removing one merged region, it would break
      *
index 1a556dc0eda3277961c06bd39fbaf97653c984a4..ca1f174b4fbb12f01b85347ea96640a78640a588 100755 (executable)
@@ -108,6 +108,12 @@ public abstract class BaseTestWorkbook extends TestCase {
         assertEquals("sheet3", workbook.getSheetName(0));\r
         workbook.removeSheetAt(0);\r
         assertEquals(0, workbook.getNumberOfSheets());\r
+\r
+        //re-create the sheets\r
+        workbook.createSheet("sheet1");\r
+        workbook.createSheet("sheet2");\r
+        workbook.createSheet("sheet3");\r
+        assertEquals(3, workbook.getNumberOfSheets());\r
     }\r
 \r
     public void testDefaultValues() {\r