IndexOutOfBoundsException при попытке прочитать файл MS Excel с помощью Apache POI-HSSF - PullRequest
0 голосов
/ 04 марта 2009

При попытке анализа файла MS Excel с помощью POI-HSSF v3.2 я получаю IndexOutOfBoundsException. Электронная таблица, которую я пытаюсь прочитать, не пустая, она была создана с использованием MS Excel 2003, и BiffViewer, включенный в пакет POI, не имеет проблем с ее анализом.

Мой код выглядит следующим образом:

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 в java.io.FileInputStream.readBytes (собственный метод) в 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) в org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents (HSSFEventFactory.java:141) в org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents (HSSFEventFactory.java:98) в src.Excel.main (Excel.java:21)

Большое спасибо! Я знаю, я просто ленив и мог бы сам посмотреть на источник POI, но, надеюсь, кто-то здесь сможет быстро указать на все глупости, которые я совершил в своем коде.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2009
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());
  }
2 голосов
/ 04 марта 2009

Загадка решена, правильный способ получения входного потока выглядит следующим образом

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