Java-apachepoi-Read/Write.xlsx文件-文件损坏并变为空

Java-apachepoi-Read/Write.xlsx文件-文件损坏并变为空,java,apache-poi,filereader,xlsx,Java,Apache Poi,Filereader,Xlsx,我正在使用Java程序读写一个现有的.xlsx文件(同一个文件),但该文件已损坏,文件大小变为零字节,这导致“org.apache.poi.EmptyFileException:提供的文件为空(零字节长)” 还有一件事是——这种情况并不是始终如一的。该程序大部分时间都在正确地读取和写入文件,但在10-15次运行中只会发生一次。如果有人对此有解决方案,这会很有帮助。顺便说一句,我使用的是Apache POI 3.13 读取文件程序: public String getExcelData(Strin

我正在使用Java程序读写一个现有的.xlsx文件(同一个文件),但该文件已损坏,文件大小变为零字节,这导致“org.apache.poi.EmptyFileException:提供的文件为空(零字节长)”

还有一件事是——这种情况并不是始终如一的。该程序大部分时间都在正确地读取和写入文件,但在10-15次运行中只会发生一次。如果有人对此有解决方案,这会很有帮助。顺便说一句,我使用的是Apache POI 3.13

读取文件程序:

public String getExcelData(String sheetName, int rowNum, int colNum){
    String retVal = null;
    try {
        FileInputStream fis = new FileInputStream("/Absolute/File/Path/Test-File.xlsx");
        Workbook wb = WorkbookFactory.create(fis);
        Sheet s = wb.getSheet(sheetName);
        Row r = s.getRow(rowNum);
        Cell c = r.getCell(colNum);
        retVal=(c.getStringCellValue());
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return retVal;
写入文件程序:

public void writeToExcel(String sheetName,int rowNum,int cellNum,String desc){
    try {
        FileInputStream fis = new FileInputStream("/Absolute/File/Path/Test-File.xlsx");
        Workbook wb = WorkbookFactory.create(fis);
        Sheet s = wb.getSheet(sheetName);
        Row r = s.getRow(rowNum);
        Cell c = r.createCell(cellNum);
        c.setCellValue(desc);
        FileOutputStream fos = new FileOutputStream("/Absolute/File/Path/Test-File.xlsx");
        wb.write(fos);
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
错误跟踪:

Exception in thread "main" org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)
at org.apache.poi.util.IOUtils.peekFirst8Bytes(IOUtils.java:55)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:201)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:168)
at ExcelLibrary.getExcelData(ExcelLibrary.java:139)
at Driver.main(Driver.java:82)

当您写入文件时,您似乎没有使用。此外,您的
close
代码应该在
finally
块中完成,以确保即使发生错误,流也会关闭。

您需要使用org.apache.commons.io.IOUtils.closequity(fos)关闭FileInputStream和FileOutputStream和fis。

您正在同时读取和写入同一文件。在写入FileOutputStream之前,请尝试先关闭FileInputStream fis。 或者使用临时文件写入新结果,然后将其重命名为原始结果


顺便说一句,close自动执行flush,因此不必单独调用它。

作为java开发人员,在使用
try catch
block时,需要使用
finally
block。
在最后一个块中,您必须关闭
FileInputStream
FileOutputStream
。可能是因为您没有关闭而打开了filehandler。

在写入FileOutputStream fos和excel之前,我关闭了FileInputStream fis,并且excel运行了近10次,但后来又出现了相同的问题,文件变为空。如果有问题,请告诉我这个问题的另一个解决方案是,我在Microsoft Excel mac 2011上使用OSX 10.9.5。就我所看到的
公共字符串getExcelData(字符串sheetName,int rowNum,int colNum)
能够从给定的工作表、行和列中获取一个单元格值。对于此小任务,每次它从存储的文件创建新工作簿时都会执行此任务。
公共void writeToExcel(String sheetName、int rowNum、int cellNum、String desc)
每次从存储的文件创建新工作簿时,都会将一个单元格值写入给定的工作表、行和列,并保存整个工作簿。为什么不在此方法之外打开工作簿,并在设置了所有单元格值的情况下只保存一次?访问了解如何正确关闭xlsx