Java - Apache POI - 读/写.xlsx文件 - 文件被破坏并变空

时间:2015-12-14 10:00:22

标签: java apache-poi filereader xlsx

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

还有一件事 - 这种情况不会持续发生。程序在大多数情况下正确地读取和写入文件,但在10-15次运行中发生一次。如果有人有解决方案,那将会很有帮助。顺便说一句,我正在使用Apache POI 3.13。

阅读文件程序:

MPI_Request request_arr[receivers_list.size() + senders_list.size()];
int request_index = 0;

//read data from senders
int dataRecv[senders_list.size()];
for ( auto &e : senders_list ) {
    MPI_Irecv( &dataRecv[request_index], 1, MPI_INT, e.remot_id, MPI_ANY_TAG, MPI_COMM_WORLD, &request_arr[request_index++] );
}

//send a data to all nodes on receiver list
for ( auto &e : receivers_list ) {
    //I assume that you want to send the same value to all processes here, so like doing a MPI_Bcast()
    MPI_Isend( &data, 1, MPI_INT, e.remot_id, 1234 , MPI_COMM_WORLD, &request_arr[request_index++] );
}

//wait for all receives complete 
for ( int count_req = 0; count_req < request_index; ++count_req ) {
    int curr_idx;
    MPI_Waitany( request_index, request_arr, &curr_idx, MPI_STATUS_IGNORE );

    if ( curr_idx < senders_list.size() ) {
        //the completed request is a receiving one
        //we can therefore freely access dataRecv[curr_idx]
        //do some code here ...
    }
}

写文件程序:

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();
    }
}

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

作为java dev,当您使用finally块时,需要使用try-catch块。 在你的finally块中,你必须关闭FileInputStreamFileOutputStream。当你没有关闭时,可能会打开文件处理程序。