Javaプログラムを使用して既存の.xlsxファイル(同じファイル)を読み書きしていますが、ファイルが破損しており、ファイルサイズがゼロバイトになっているため、" org.Apache.poi.EmptyFileException:提供されたファイルは空でした(長さ0バイト)」。
もう1つ、これは一貫して発生していません。プログラムはほとんどの場合ファイルの読み取りと書き込みを適切に行っていますが、10〜15回の実行に1回発生します。誰かがこれに対する解決策を持っているなら、それは役に立ちます。ところで、Apache POI3.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)
org.Apache.commons.io.IOUtils.closeQuietly(fos)とfisを使用してFileInputStreamとFileOutputStreamを閉じる必要があります。
同じファイルの読み取りと書き込みを同時に行っています。 FileOutputStream fosに書き込む前に、まずFileInputStreamfisを閉じてみてください。または、一時ファイルを使用して新しい結果を書き込み、名前を元の結果に変更します。
ところで。 closeは自動的にフラッシュを実行するため、個別に呼び出す必要はありません。
ファイルに書き込むときは、 flush
を使用していないようです。さらに、close
コードはfinally
ブロックで実行して、何か問題が発生した場合でもストリームが閉じられるようにする必要があります。
Java devとして、try-catch
ブロックを使用するときはfinally
ブロックを使用する必要があります。finallyブロックで、FileInputStream
を閉じてFileOutputStream
。閉じなかったため、ファイルハンドラーが開いている可能性があります。