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

时间:2009-03-04 13:07:12

标签: java excel apache-poi poi-hssf

在尝试使用POI-HSSF v3.2解析MS Excel文件时,我收到了IndexOutOfBoundsException。我试图阅读的电子表格不是空的,它是使用MS Excel 2003创建的,POI包中包含的BiffViewer可以解析它。

我的代码如下:

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”java.lang.IndexOutOfBoundsException中的异常         at java.io.FileInputStream.readBytes(Native Method)         在java.io.FileInputStream.read(FileInputStream.java:199)         在org.apache.poi.hssf.record.RecordInputStream.nextRecord(RecordInputStream.java:106)         在org.apache.poi.hssf.eventusermodel.HSSFRecordStream.getNextRecord(HSSFRecordStream.java:128)         在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)         在src.Excel.main(Excel.java:21)

非常感谢!我知道,我本来很懒,可以自己查看POI来源,但是,希望有人能够迅速指出我在代码中做过的任何愚蠢的事情。

2 个答案:

答案 0 :(得分:2)

神秘解决了,获取输入流的正确方法如下

FileInputStream file   = new FileInputStream("c:\\temp\\a.xls");
POIFSFileSystem poifs  = new POIFSFileSystem(file);
InputStream     stream = poifs.createDocumentInputStream("Workbook");

答案 1 :(得分:2)

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());
  }