IndexOutOfBoundsException al intentar leer el archivo MS Excel utilizando Apache POI-HSSF

StackOverflow https://stackoverflow.com/questions/610466

Pregunta

Al intentar analizar el archivo de MS Excel con POI-HSSF v3.2 I estoy obteniendo IndexOutOfBoundsException. La hoja de cálculo que estoy tratando de leer no está vacía, se creó con MS Excel 2003 y BiffViewer incluido con el paquete de POI no tiene ningún problema en analizarla.

Mi código es el siguiente:

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

Y aquí está el rastro de pila que estoy obteniendo:

Excepción en el hilo " main " java.lang.IndexOutOfBoundsException         en java.io.FileInputStream.readBytes (Método nativo)         en java.io.FileInputStream.read (FileInputStream.java:199)         en org.apache.poi.hssf.record.RecordInputStream.nextRecord (RecordInputStream.java:106)         en org.apache.poi.hssf.eventusermodel.HSSFRecordStream.getNextRecord (HSSFRecordStream.java:128)         en org.apache.poi.hssf.eventusermodel.HSSFRecordStream.nextRecord (HSSFRecordStream.java:93)         en org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents (HSSFEventFactory.java:141)         en org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents (HSSFEventFactory.java:98)         en src.Excel.main (Excel.java:21)

Muchas gracias! Lo sé, estoy siendo perezoso y podría haber mirado la fuente de POI, pero, con suerte, alguien aquí podrá señalar rápidamente cualquier cosa tonta que haya hecho dentro de mi código.

¿Fue útil?

Solución

Misterio resuelto, la forma correcta de obtener un flujo de entrada es la siguiente

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

Otros consejos

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());
  }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top