You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2009/09/07 06:55:32 UTC
svn commit: r811994 - in /poi/trunk: src/java/org/apache/poi/hssf/usermodel/
src/java/org/apache/poi/ss/ src/testcases/org/apache/poi/hssf/usermodel/
src/testcases/org/apache/poi/ss/usermodel/ test-data/spreadsheet/
Author: yegor
Date: Mon Sep 7 04:55:32 2009
New Revision: 811994
URL: http://svn.apache.org/viewvc?rev=811994&view=rev
Log:
Do not allow text longer than 32,767 characters in HSSF cells, see Bugzilla 47751
Added:
poi/trunk/test-data/spreadsheet/46368.xls (with props)
Modified:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
poi/trunk/src/java/org/apache/poi/ss/SpreadsheetVersion.java
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java?rev=811994&r1=811993&r2=811994&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java Mon Sep 7 04:55:32 2009
@@ -540,6 +540,11 @@
setCellType(CELL_TYPE_BLANK, false, row, col, styleIndex);
return;
}
+
+ if(hvalue.length() > SpreadsheetVersion.EXCEL97.getMaxTextLength()){
+ throw new IllegalArgumentException("The maximum length of cell contents (text) is 32,767 characters");
+ }
+
if (_cellType == CELL_TYPE_FORMULA) {
// Set the 'pre-evaluated result' for the formula
// note - formulas do not preserve text formatting.
Modified: poi/trunk/src/java/org/apache/poi/ss/SpreadsheetVersion.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/SpreadsheetVersion.java?rev=811994&r1=811993&r2=811994&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/SpreadsheetVersion.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/SpreadsheetVersion.java Mon Sep 7 04:55:32 2009
@@ -36,9 +36,11 @@
* <li>The total number of available rows is 64k (2^16)</li>
* <li>The maximum number of arguments to a function is 30</li>
* <li>Number of conditional format conditions on a cell is 3</li>
+ * <li>Length of text cell contents is unlimited </li>
+ * <li>Length of text cell contents is 32767</li>
* </ul>
*/
- EXCEL97(0x10000, 0x0100, 30, 3),
+ EXCEL97(0x10000, 0x0100, 30, 3, 32767),
/**
* Excel2007
@@ -49,21 +51,24 @@
* <li>The maximum number of arguments to a function is 255</li>
* <li>Number of conditional format conditions on a cell is unlimited
* (actually limited by available memory in Excel)</li>
+ * <li>Length of text cell contents is unlimited </li>
* <ul>
*/
- EXCEL2007(0x100000, 0x4000, 255, Integer.MAX_VALUE);
+ EXCEL2007(0x100000, 0x4000, 255, Integer.MAX_VALUE, Integer.MAX_VALUE);
private final int _maxRows;
private final int _maxColumns;
private final int _maxFunctionArgs;
private final int _maxCondFormats;
+ private final int _maxTextLength;
- private SpreadsheetVersion(int maxRows, int maxColumns, int maxFunctionArgs, int maxCondFormats) {
+ private SpreadsheetVersion(int maxRows, int maxColumns, int maxFunctionArgs, int maxCondFormats, int maxText) {
_maxRows = maxRows;
_maxColumns = maxColumns;
_maxFunctionArgs = maxFunctionArgs;
_maxCondFormats = maxCondFormats;
- }
+ _maxTextLength = maxText;
+ }
/**
* @return the maximum number of usable rows in each spreadsheet
@@ -116,4 +121,12 @@
public String getLastColumnName() {
return CellReference.convertNumToColString(getLastColumnIndex());
}
+
+ /**
+ * @return the maximum length of a text cell
+ */
+ public int getMaxTextLength() {
+ return _maxTextLength;
+ }
+
}
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java?rev=811994&r1=811993&r2=811994&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Mon Sep 7 04:55:32 2009
@@ -38,7 +38,7 @@
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
import org.apache.poi.hssf.record.formula.DeletedArea3DPtg;
import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.TempFile;
/**
@@ -1494,4 +1494,19 @@
assertEquals(893, wb.getNumberOfNames());
assertEquals("Matthew\\Matthew11_1\\Matthew2331_1\\Matthew2351_1\\Matthew2361_1___lab", wb.getNameName(300));
}
+
+ /**
+ * HSSFRichTextString.length() returns negative for really long strings.
+ * The test file was created in OpenOffice 3.0 as Excel does not allow cell text longer than 32,767 characters
+ */
+ public void test46368() {
+ HSSFWorkbook wb = openSample("46368.xls");
+ HSSFSheet s = wb.getSheetAt(0);
+ HSSFCell cell1 = s.getRow(0).getCell(0);
+ assertEquals(32770, cell1.getStringCellValue().length());
+
+ HSSFCell cell2 = s.getRow(2).getCell(0);
+ assertEquals(32766, cell2.getStringCellValue().length());
+ }
+
}
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java?rev=811994&r1=811993&r2=811994&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java Mon Sep 7 04:55:32 2009
@@ -19,6 +19,7 @@
import java.util.Date;
import java.util.GregorianCalendar;
+import java.io.FileOutputStream;
import junit.framework.AssertionFailedError;
@@ -30,6 +31,8 @@
import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.ss.usermodel.BaseTestCell;
import org.apache.poi.ss.usermodel.ErrorConstants;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.SpreadsheetVersion;
/**
* Tests various functionality having to do with {@link HSSFCell}. For instance support for
@@ -291,5 +294,34 @@
Record dbcr = recs[index++];
assertEquals(DBCellRecord.class, dbcr.getClass());
}
+
+ /**
+ * The maximum length of cell contents (text) is 32,767 characters.
+ */
+ public void testMaxTextLength(){
+ HSSFSheet sheet = new HSSFWorkbook().createSheet();
+ HSSFCell cell = sheet.createRow(0).createCell(0);
+
+ int maxlen = SpreadsheetVersion.EXCEL97.getMaxTextLength();
+ assertEquals(32767, maxlen);
+
+ StringBuffer b = new StringBuffer() ;
+
+ // 32767 is okay
+ for( int i = 0 ; i < maxlen ; i++ )
+ {
+ b.append( "X" ) ;
+ }
+ cell.setCellValue(b.toString());
+
+ b.append("X");
+ // 32768 produces an invalid XLS file
+ try {
+ cell.setCellValue(b.toString());
+ fail("Expected exception");
+ } catch (IllegalArgumentException e){
+ assertEquals("The maximum length of cell contents (text) is 32,767 characters", e.getMessage());
+ }
+ }
}
Modified: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java?rev=811994&r1=811993&r2=811994&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java Mon Sep 7 04:55:32 2009
@@ -218,38 +218,6 @@
assertTrue("no errors parsing formula", true);
}
- /**
- * HSSFRichTextString.length() returns negative for really
- * long strings
- */
- public void test46368() {
- Workbook wb = getTestDataProvider().createWorkbook();
- Sheet s = wb.createSheet();
- Row r = s.createRow(0);
- for(int i=0; i<15; i++) {
- int len = 32760 + i;
- Cell c = r.createCell(i);
-
- StringBuffer sb = new StringBuffer();
- for(int j=0; j<len; j++) {
- sb.append("x");
- }
- RichTextString rtr = wb.getCreationHelper().createRichTextString(sb.toString());
- assertEquals(len, rtr.length());
- c.setCellValue(rtr);
- }
-
- // Save and reload
- wb = getTestDataProvider().writeOutAndReadBack(wb);
- s = wb.getSheetAt(0);
- r = s.getRow(0);
- for(int i=0; i<15; i++) {
- int len = 32760 + i;
- Cell c = r.getCell(i);
- assertEquals(len, c.getRichStringCellValue().length());
- }
- }
-
public void test18800() {
Workbook book = getTestDataProvider().createWorkbook();
book.createSheet("TEST");
Added: poi/trunk/test-data/spreadsheet/46368.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/46368.xls?rev=811994&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/test-data/spreadsheet/46368.xls
------------------------------------------------------------------------------
svn:executable = *
Propchange: poi/trunk/test-data/spreadsheet/46368.xls
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org