通过 apache POI 创建文件时出现错误 "Your InputStream was neither an OLE2 stream, nor an OOXML stream"

Getting error "Your InputStream was neither an OLE2 stream, nor an OOXML stream" when created file through 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();
        }   

不要创建一个空文件并尝试读取它,那是行不通的。空的零字节文件无效,无法加载。相反,让 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();
}

此外,如果您确实想要读取现有文件,请不要在有文件的情况下使用流!参见 this bit of the POI docs 为什么不。