Получение ошибки Ваш InputStream не был ни потоком OLE2, ни потоком OOXML при создании файла через apache POI

Я пытаюсь проверить, существует ли уже мой файл Excel. Если он не существует, я хочу создать новый, а если он существует, я удалю его и создам новый. Я написал следующую программу, но получаю сообщение об ошибке: workbook= WorkbookFactory.create(instream);

Ошибка -> java.lang.IllegalArgumentException: ваш InputStream не был ни потоком OLE2, ни потоком OOXML в org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:89) в tryIng.main(tryIng .java:84)

Вот программа ->

 try {
                String filePath= "C:/Users/pritik/Desktop/t1.xlsx";
                File file = new File(filePath);
                filePath= file.getAbsolutePath(); 
                xlFile = new File(filePath);

                if(xlFile.exists() && !xlFile.isDirectory())
                    xlFile.delete(); //delete if file already exists.
                xlFile.createNewFile();

                inStream = new FileInputStream(xlFile);
                workbook =  WorkbookFactory.create(inStream);  // I get error at this line
                String sheetName="NewSheet";
                Sheet sheet = workbook.createSheet(sheetName);
                FileOutputStream fOut = new FileOutputStream(xlFile);

                int i,j;
                xRows = xTS.length;
                xCols = xTS[0].length;
                for(i =0;i<xRows;i++)
                {
                    row = sheet.createRow(i);
                    for(j=0;j<xCols;j++)
                    {
                        cell = row.createCell(j);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        cell.setCellValue(xTS[i][j]);
                    } 
                } 
                workbook.write(fOut);
                fOut.flush();
                fOut.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

person For Testing    schedule 24.03.2015    source источник


Ответы (1)


Не создавайте пустой файл и не пытайтесь его прочитать, это не сработает. Пустой файл с нулевым байтом недействителен и не может быть загружен. Вместо этого попросите POI создать для вас новый файл, который вы напишете позже.

Изменить код:

if(xlFile.exists() && !xlFile.isDirectory())
    xlFile.delete(); //delete if file already exists.
xlFile.createNewFile();

inStream = new FileInputStream(xlFile);          
workbook =  WorkbookFactory.create(inStream);

Вместо этого быть:

if(xlFile.exists() && !xlFile.isDirectory())
    xlFile.delete(); //delete if file already exists.

if (xlFile.toString().endsWith(".xls") {
   workbook = new HSSFWorkbook();
} else {
   workbook = new XSSFWorkbook();
}

Кроме того, если вы хотите прочитать существующий файл, не используйте поток, если у вас есть файл! См. эту часть документов POI, почему бы и нет.

person Gagravarr    schedule 24.03.2015
comment
Большое спасибо, Гаграварр. Это работает нормально. Я также прочитал информацию, которую вы предоставили в ссылке, и изменил свой код. Спасибо еще раз. - person For Testing; 25.03.2015
comment
@Gagravarr, почему вы не используете фабрику Workbook и используете рабочую книгу hss и xssf, есть ли какая-то причина - person Labeo; 19.10.2015
comment
@Labeo WorkbookFactory предназначен только для чтения существующих файлов. ОП хочет создать новый с нуля - person Gagravarr; 19.10.2015
comment
Да, у меня есть файлы, которые уже существуют, но я все равно получаю сообщение об ошибке - person Labeo; 19.10.2015
comment
@Labeo Тогда проверьте, что представляет собой файл на самом деле, а не то, что говорит расширение. Приложение Apache Tika в режиме --detect должно сказать вам - person Gagravarr; 19.10.2015