You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by bu...@apache.org on 2008/09/13 03:52:20 UTC
DO NOT REPLY [Bug 45798] New: HSSFCell.toString() With 3D Refrence
Causes IndexOutOfBoundsException
https://issues.apache.org/bugzilla/show_bug.cgi?id=45798
Summary: HSSFCell.toString() With 3D Refrence Causes
IndexOutOfBoundsException
Product: POI
Version: unspecified
Platform: PC
OS/Version: Windows XP
Status: NEW
Severity: normal
Priority: P2
Component: HSSF
AssignedTo: dev@poi.apache.org
ReportedBy: sshaw@lucas.cis.temple.edu
Created an attachment (id=22561)
--> (https://issues.apache.org/bugzilla/attachment.cgi?id=22561)
Excel 2002 spreadsheet demonstrating a bug caused by cells with 3D references
Calling toString() on a cell with a 3D reference containing another sheet in
the workbook causes an IndexOutOfBoundsException.
Example:
FileInputStream fis = new FileInputStream(argv[0]);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = sheet.getRow(1);
HSSFCell cell = row.getCell((short)1);
System.out.println(cell);
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size:
2
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at org.apache.poi.hssf.model.Workbook.getSheetName(Workbook.java:534)
at
org.apache.poi.hssf.model.Workbook.findSheetNameFromExternSheet(Workbook.java:1867)
at
org.apache.poi.hssf.model.Workbook.getSheetReferences(Workbook.java:1849)
at
org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetReferences(HSSFWorkbook.java:788)
at
org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetReferences(HSSFWorkbook.java:79)
at
org.apache.poi.hssf.record.formula.Ref3DPtg.getSheetName(Ref3DPtg.java:169)
at
org.apache.poi.hssf.record.formula.Ref3DPtg.toFormulaString(Ref3DPtg.java:182)
at
org.apache.poi.hssf.model.FormulaParser.toFormulaString(FormulaParser.java:925)
at
org.apache.poi.hssf.model.FormulaParser.toFormulaString(FormulaParser.java:858)
at
org.apache.poi.hssf.usermodel.HSSFCell.getCellFormula(HSSFCell.java:686)
at org.apache.poi.hssf.usermodel.HSSFCell.toString(HSSFCell.java:1031)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at bs.main(bs.java:69)
The exception is raised in POI-3.1-FINAL and POI-3.5-beta2.
The problem originates in Workbook.findSheetNameFromExternSheet(),
This method calls LinkTable.getIndexToSheet():
public short getIndexToSheet(short num) {
return _externSheetRecord.getREFRecordAt(num).getIndexToFirstSupBook();
}
ExternSheetSubRecord.getIndexToFirstSubBook() returns 2, which is then used to
get the 2nd element of the Workbook’s boundsheets, a list of length 2.
5 ExternSheetSubRecords are created from the attached spreadsheet, they are:
supbookindex =0
1stsbindex =0
lastsbindex =0
supbookindex =1
1stsbindex =2
lastsbindex =2
supbookindex =2
1stsbindex =1
lastsbindex =1
supbookindex =0
1stsbindex =-1
lastsbindex =-1
supbookindex =0
1stsbindex =1
lastsbindex =1
It seems that the original DocumentInputStream could be off, 3 non -1
supbookindices are created, and the 2nd 1stsbindex returns 2...
--
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org
DO NOT REPLY [Bug 45798] HSSFCell.toString() With 3D Refrence Causes
IndexOutOfBoundsException
Posted by bu...@apache.org.
https://issues.apache.org/bugzilla/show_bug.cgi?id=45798
Josh Micich <jo...@gildedtree.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |FIXED
--- Comment #1 from Josh Micich <jo...@gildedtree.com> 2008-09-14 12:04:54 PST ---
Fixed in svn r695264.
Junit added.
The main problem seems to be that ref #1 in the EXTERNSHEET record, which
refers to sheet index 2, even though the worbook has only 2 sheets:
Offset 0x3954 (14676)
recordid = 0x17, size = 32
[EXTERNSHEET]
numOfRefs = 5
refrec #0: extBook=0 firstSheet=0 lastSheet=0
refrec #1: extBook=1 firstSheet=2 lastSheet=2
refrec #2: extBook=2 firstSheet=1 lastSheet=1
refrec #3: extBook=0 firstSheet=-1 lastSheet=-1
refrec #4: extBook=0 firstSheet=1 lastSheet=1
[/EXTERNSHEET]
The fix for this bug involved removing the eager initialisation of the extern
SheetReferences. As it turns out, the formula in cell B1 has a Ref3DPtg with
externSheetIndex=4 which resolves to sheetIndex 1.
Some investigation was done to see how Excel would handle a formula having
externSheetIndex=1 (sheetIndex 2). Excel displays the formula as ''!$A2, but
also prompts the user about broken links.
Note - this fix is just for the sample code provided. It's quite possible
(since the LinkTable is not fully understood) that POI may still fail in other
ways with this spreadsheet.
An unrelated issue was that BiffViewer crashed on the DrawingGroupRecord. This
was not investigated any further.
--
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org