IndexOutOfBoundsException durante il tentativo di leggere il file MS Excel utilizzando Apache POI-HSSF
-
03-07-2019 - |
Domanda
Mentre provo ad analizzare il file MS Excel usando POI-HSSF v3.2 I sto ottenendo IndexOutOfBoundsException. Il foglio di calcolo che sto cercando di leggere non è vuoto, è stato creato utilizzando MS Excel 2003 e BiffViewer incluso nel pacchetto POI non ha problemi ad analizzarlo.
Il mio codice è il seguente:
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);
}
}
Ed ecco la traccia dello stack che sto ottenendo:
Eccezione nel thread "principale" java.lang.IndexOutOfBoundsException at java.io.FileInputStream.readBytes (metodo nativo) at 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)
Mille grazie! Lo so, sono semplicemente pigro e avrei potuto guardare me stesso alla fonte POI, ma, si spera, qualcuno qui sarà in grado di indicare rapidamente qualsiasi cosa sciocca che ho fatto nel mio codice.
Soluzione
Mistero risolto, il modo corretto di ottenere un flusso di input è il seguente
FileInputStream file = new FileInputStream("c:\\temp\\a.xls");
POIFSFileSystem poifs = new POIFSFileSystem(file);
InputStream stream = poifs.createDocumentInputStream("Workbook");
Altri suggerimenti
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());
}