IndexOutOfBoundsException ao tentar ler o arquivo de MS Excel usando Apache POI-HSSF
-
03-07-2019 - |
Pergunta
Enquanto tentando analisar arquivo MS Excel usando POI-HSSF v3.2 I estou recebendo IndexOutOfBoundsException. A planilha que eu estou tentando ler não é esvaziá-la foi criado usando o MS Excel 2003 e BiffViewer incluído com o pacote POI não tem nenhum problema analisá-lo.
Meu código é o seguinte:
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);
}
}
E aqui está o rastreamento de pilha que estou recebendo:
Exception in thread java.lang.IndexOutOfBoundsException "main" em java.io.FileInputStream.readBytes (Método Nativo) em java.io.FileInputStream.read (FileInputStream.java:199) em org.apache.poi.hssf.record.RecordInputStream.nextRecord (RecordInputStream.java:106) em org.apache.poi.hssf.eventusermodel.HSSFRecordStream.getNextRecord (HSSFRecordStream.java:128) em org.apache.poi.hssf.eventusermodel.HSSFRecordStream.nextRecord (HSSFRecordStream.java:93) em org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents (HSSFEventFactory.java:141) em org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents (HSSFEventFactory.java:98) em src.Excel.main (Excel.java:21)
Muito obrigado! Eu sei, eu estou sendo preguiçosos e poderia ter olhou para a fonte POI mim mesmo, mas, esperançosamente, alguém aqui será capaz de apontar rapidamente o que quer coisa boba que eu fiz dentro do meu código.
Solução
Mistério resolvido, a maneira correta de conseguir um fluxo de entrada é a seguinte
FileInputStream file = new FileInputStream("c:\\temp\\a.xls");
POIFSFileSystem poifs = new POIFSFileSystem(file);
InputStream stream = poifs.createDocumentInputStream("Workbook");
Outras dicas
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());
}