org.apache.poi.openxml4j.exceptions.InvalidOperationException:无法打开指定的文件

时间:2014-09-24 06:05:08

标签: apache-poi

我的代码无效,它始终显示上述异常。 但我总能看到生成的tmp文件。

这是代码,有人可以建议一下:

FileInputStream fis =null;
        try{
        fis= new FileInputStream(new File("/home/amar/Desktop/new/abc.xls"));

        Workbook wb = new org.apache.poi.xssf.usermodel.XSSFWorkbook(fis);
                int numOfSheets = wb.getNumberOfSheets();
System.out.println("bhargo num of sheets is " + numOfSheets);
        for(int i=0; i<numOfSheets; i++){
            org.apache.poi.ss.usermodel.Sheet sheet = wb.getSheetAt(i);
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext())
            {
                Row row = rowIterator.next();
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {
                    Cell cell = (Cell) cellIterator.next();
                    if (cell.getCellType() == cell.CELL_TYPE_STRING) {
                        System.out.println("bhargo cell value is " + cell.getStringCellValue().trim());
                    }
                }
            }
            }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally{
        System.out.println("bhargo, closing the stream");
    try {
        fis.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

2 个答案:

答案 0 :(得分:2)

这里有很多问题:

    fis= new FileInputStream(new File("/home/amar/Desktop/new/abc.xls"));
    Workbook wb = new org.apache.poi.xssf.usermodel.XSSFWorkbook(fis);

首先,as explained in the Apache POI documentation,如果您有文件,请不要使用InputStream!它更慢并且使用更多内存

其次,XSSF是使用.xlsx文件的代码,但您的文件是.xls文件,因此无效。

第三,Apache POI的代码会自动计算出你的文件类型,并为你创建合适的工作簿

因此,您的代码应该是

Workbook wb = WorkbookFactory.create(new File("/home/amar/Desktop/new/abc.xls"));

这将直接从文件

创建正确的工作簿

答案 1 :(得分:1)

我能够解决我的问题。 我正在使用linux,因此它将文件保存在旧版本的excel中