Bug 41139 - Constructing HSSFWorkbook is failed,threw ArrayIndexOutOfBoundsException for creating UnknownRecord
Summary: Constructing HSSFWorkbook is failed,threw ArrayIndexOutOfBoundsException for ...
Status: RESOLVED FIXED
Alias: None
Product: POI
Classification: Unclassified
Component: HSSF (show other bugs)
Version: 2.5-FINAL
Hardware: PC Windows XP
: P2 normal (vote)
Target Milestone: ---
Assignee: POI Developers List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-12-08 18:23 UTC by zealz
Modified: 2008-01-19 06:53 UTC (History)
0 users



Attachments
The testing xls file which cause exception (36.50 KB, application/vnd.ms-excel)
2006-12-08 18:35 UTC, zealz
Details

Note You need to log in before you can comment on or make changes to this bug.
Description zealz 2006-12-08 18:23:04 UTC
1)Following is the detail excepion
[WARNING] Unknown Ptg 2d (45)
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown 
Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown 
Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at org.apache.poi.hssf.record.RecordFactory.createRecord
(RecordFactory.java:224)
	at org.apache.poi.hssf.record.RecordFactory.createRecords
(RecordFactory.java:160)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>
(HSSFWorkbook.java:163)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>
(HSSFWorkbook.java:130)
	at test.Test.parsingToRawContent(Test.java:70)
	at test.Test.main(Test.java:313)
Caused by: java.lang.ArrayIndexOutOfBoundsException
	at java.lang.System.arraycopy(Native Method)
	at org.apache.poi.hssf.record.UnknownRecord.<init>
(UnknownRecord.java:62)
	at org.apache.poi.hssf.record.SubRecord.createSubRecord
(SubRecord.java:57)
	at org.apache.poi.hssf.record.ObjRecord.fillFields(ObjRecord.java:99)
	at org.apache.poi.hssf.record.Record.fillFields(Record.java:90)
	at org.apache.poi.hssf.record.Record.<init>(Record.java:55)
	at org.apache.poi.hssf.record.ObjRecord.<init>(ObjRecord.java:61)
	... 10 more
Exception in thread "main" org.apache.poi.hssf.record.RecordFormatException: 
Unable to construct record instance, the following exception occured: null
	at org.apache.poi.hssf.record.RecordFactory.createRecord
(RecordFactory.java:237)
	at org.apache.poi.hssf.record.RecordFactory.createRecords
(RecordFactory.java:160)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>
(HSSFWorkbook.java:163)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>
(HSSFWorkbook.java:130)
	at test.Test.parsingToRawContent(Test.java:70)
	at test.Test.main(Test.java:313)
---------------------------------------------------------------
My code is quite simple:
POIFSFileSystem fs      =
            new POIFSFileSystem(new FileInputStream(fileName));
HSSFWorkbook wb = new HSSFWorkbook(fs);

2)While I use the old version of POI to parse same excel file,
although it will display warning message like "[WARNING] Unknown Ptg 2d (45)"
but at least it can parse the content, but It looks like that it always threw 
OutOfMemoryError while parsing the large xls file.
Comment 1 zealz 2006-12-08 18:35:33 UTC
Created attachment 19234 [details]
The testing xls file which cause exception
Comment 2 Steve Knoll 2007-04-03 14:00:17 UTC
I have run into the same bug (UnknownRecord throwing an
ArrayIndexOutOfBoundsException), and here is a possible solution
Change the 3rd constructor to read:
    public UnknownRecord( short id, short size, byte[] data, int offset )
    {
        sid     = id;

        // ObjRecord's fillFields was getting an obviously wrong subRecordSize,
        // which it passes to SubRecord.createSubRecord, which passes the value
        // here as "size".
        //
        // Instead of allowing an ArrayIndexOutOfBoundsException 
        //   to happen, let's change the size if appropriate.
        if ( size > (data.length - offset) ) {
          size = (short)(data.length - offset);
        }

        thedata = new byte[size];

        System.arraycopy(data, offset, thedata, 0, size);
    }
It could be argued that this is just patching the real problem; the real
problem is that we have bogus length/size for some Unknown record type
in Excel.
Comment 3 Yegor Kozlov 2008-01-19 06:53:21 UTC
Works with POI-3.0.2-BETA2.

Regards,
Yegor