尝试使用Apache POI-HSSF读取MS Excel文件时发生IndexOutOfBoundsException

在尝试使用POI-HSSF v3.2parsingMS Excel文件时,我得到了IndexOutOfBoundsException。 我试图读取的电子表格不是空的,它已经使用MS Excel 2003创build,并且与POI包一起提供的BiffViewer没有parsing它的问题。

我的代码如下:

package src; import java.io.*; import org.apache.poi.hssf.record.*; import org.apache.poi.hssf.eventusermodel.*; class Excel implements HSSFListener { public static void main (String[] args) throws Exception { FileInputStream stream = new FileInputStream("c:\\temp\\a.xls"); HSSFEventFactory f = new HSSFEventFactory(); HSSFRequest req = new HSSFRequest(); req.addListenerForAllRecords(new Excel()); f.processEvents(req,stream); stream.close(); } public void processRecord (Record r) { System.out.println(r); } } 

这里是我得到的堆栈跟踪:

线程“main”中的exceptionjava.io.FileInputStream.readBytes(Native Method)java.io.FileInputStream.read(FileInputStream.java:199)at org.apache.poi.hssf.record.RecordInputStream .nextRecord(RecordInputStream.java:106)at org.apache.poi.hssf.eventusermodel.HSSFRecordStream.getNextRecord(HSSFRecordStream.java:128)at org.apache.poi.hssf.eventusermodel.HSSFRecordStream.nextRecord(HSSFRecordStream.java:93 )at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents(HSSFEventFactory.java:141)at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents(HSSFEventFactory.java:98)at src.Excel.main( Excel.java:21)

非常感谢! 我知道,我是懒惰的,可以自己看看POI的来源,但是希望这里的某个人能够迅速地指出我在代码中所做的任何愚蠢的事情。

神秘解决了,获取inputstream的正确方法如下

 FileInputStream file = new FileInputStream("c:\\temp\\a.xls"); POIFSFileSystem poifs = new POIFSFileSystem(file); InputStream stream = poifs.createDocumentInputStream("Workbook"); 
 FileInputStream stream = new FileInputStream("abcd.xls"); HSSFEventFactory f = new HSSFEventFactory(); HSSFRequest req = new HSSFRequest(); req.addListenerForAllRecords(new Excel()); Workbook wb; wb = new HSSFWorkbook(stream); Sheet sheet=wb.getSheet("abcd11042009"); int rows=sheet.getPhysicalNumberOfRows(); Row headerRow; Cell cell; for(int i=0;i<rows;i++) { headerRow= sheet.getRow(i); cell = headerRow.getCell(1); System.out.println("Doing..."+ cell.getStringCellValue()); }