2016-03-01 63 views
2

我有excel文件(*.xls*.xlxs),它可以有記錄或沒有記錄。首先,我將文件存儲在某個臨時位置,然後複製文件的內容,然後嘗試讀取文件。如果Excel工作表包含記錄,但如果工作表沒有記錄且文件爲空,則此方案工作正常。這種情況不起作用。我正在使用apache-poi來讀取excel文件內容。如何檢查excel文件是否爲空?

public static boolean isRowEmpty(Row row) { 
    for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) { 
     Cell cell = row.getCell(c); 
     if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) { 
      return false; 
     } 
    } 
    return true; 
} 

我得到IOException : unable to read entire header 0 bytes read expected 512 bytes。有人可以建議我擺脫這種異常並檢查excel文件是否爲空?

+0

如果該文件真的是空的(0字節),則它不是有效的XLS文件。所以你應該在用apache-poi打開之前檢查文件的大小。請參閱File.length方法:https://docs.oracle.com/javase/7/docs/api/java/io/File.html#length()。 – Xvolks

+1

@Xvolks該文件存在,所以File.length()將返回一個值,它不會是0L,因此該檢查不適用。 – Harleen

+0

@Harleen,請查看我的回答 –

回答

3

使用谷歌搜索和org.apache.poi庫的一些實驗暗示,檢查xls文件是否爲空是不正常的,即使它大概內部的數據結構也是不正常的。這很難說,例如,如果Oracle BD是空的。 任何方式,你都可以獲取紙張數量,然後迭代所有紙張,檢查行和單元格,並且如果你什麼都沒發現,就認爲文件是空的。

HSSFWorkbook wBook = new HSSFWorkbook(new FileInputStream("your_path")); 
for(int i = 0; i < wBook.getNumberOfSheets(); i++){ 
     System.out.println("Sheet " + i + " has data: " + isSheetEmpty(wBook.getSheetAt(i))); 
} 
boolean isSheetEmpty(HSSFSheet sheet){ 
     Iterator rows = sheet.rowIterator(); 
     while (rows.hasNext()) { 
      HSSFRow row = (HSSFRow) rows.next(); 
      Iterator cells = row.cellIterator(); 
      while (cells.hasNext()) { 
       HSSFCell cell = (HSSFCell) cells.next(); 
       if(!cell.getStringCellValue().isEmpty()){ 
        return true; 
       } 
      } 
     } 
     return false; 
} 
+0

測試此代碼後,我進行了少量修改。它現在工作正常 –

+0

我的問題現在解決了。實際上,當我在做HSSFWorkbook時,工作簿對象被設置爲空wBook = new HSSFWorkbook(inStream);但與您的一段代碼:HSSFWorkbook wBook = new HSSFWorkbook(new FileInputStream(「your_path」));它正在創建工作簿對象。現在IOException不會到來。非常感謝!!!!! – Harleen

-1
if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) { 
    return true; 
} 
return false; 

試試這個!

+0

請添加一些解釋。目前,您的答案被標記爲「低質量」,可能會被刪除。 –

相關問題