2012-06-01 180 views
0

我正嘗試使用Apache POI讀取舊的(2007之前和XLS)Excel文件。我的程序進入行的末尾並進行迭代,直到找到不爲空或空的東西。然後它迭代幾次並抓住那些單元。此程序可以在XLSX就好了閱讀和XLS文件在Office 2010製作使用Apache POI從Excel讀取單元格中的問題

我收到以下錯誤信息:

Exception in thread "main" java.lang.NumberFormatException: empty String 
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) 
    at java.lang.Double.parseDouble(Unknown Source) 

在該行:

num = Double.parseDouble(str); 

從代碼:

str = cell.toString(); 

if (str != "" || str != null) { 
    System.out.println("Cell is a string"); 
    num = Double.parseDouble(str); 
} else { 
    System.out.println("Cell is numeric."); 
    num = cell.getNumericCellValue(); 
} 

其中cell是文檔中最後一個非空或n的單元格或n ULL。當我嘗試打印第一個不爲空或空的單元格時,它不打印任何內容,所以我認爲我沒有正確訪問它。

+0

你爲什麼不使用的細胞類型,以確定它是否是一個字符串或數字或空? – Gagravarr

+0

我試過了,當我這樣做的時候會返回一個答案,當我把它當作返回的答案時,單元格仍然顯示爲「空白」。我打開了其引用的excel文件,數字是正確的,它試圖讀取的單元格不是空白的。 – Nick

+0

你確定你不是一個人嗎? Excel從A1開始,POI從0行0列開始。(POI有實用方法將excel引用轉換爲行/列以避免這種錯誤) – Gagravarr

回答

2

最好是評估細胞類型,然後做你所需要的。我用這個代碼來處理單元格數據(檢查我甚至處理空白單元格):

switch (cell.getCellType()) { 
    case Cell.CELL_TYPE_STRING: 
     str = cell.toString().trim(); 
     break; 
    case Cell.CELL_TYPE_NUMERIC: 
     if (DateUtil.isCellDateFormatted(cell)) { 
      //you should change this to your application date format 
      objSimpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      str = objSimpleDateFormat.format(cell.getDateCellValue()); 
     } else { 
      num = cell.getNumericCellValue(); 
     } 
     break; 
    case Cell.CELL_TYPE_BLANK: 
     str = ""; 
     break; 
    case Cell.CELL_TYPE_ERROR: 
     str = ""; 
     break; 
    case Cell.CELL_TYPE_BOOLEAN: 
     str = String.valueOf(cell.getBooleanCellValue()); 
    break; 
} 
+0

@luigi感謝您的回覆。我會很快測試這個。 – Nick

+0

@尼克,告訴我,如果上面的代碼適合你。如果是這樣,那麼我不會提供更完整的示例代碼。基本上,我認爲這個代碼應該工作。 –

3

也許你讀空白單元格的原因是由於使用了正確的Apache POI子組件來讀取Excel文件。對於XLS格式使用HSSF(可怕的SpreadSheet格式),對於XLSX格式使用XSSF(XML SpreadSheet格式)。


至於代碼本身,你可能想要改進你的布爾表達式。你現在,因爲你正在使用或操作(||)的方式,

  • 你的if語句的第一部分將執行,如果str != null,並
  • else部分的if語句將執行如果str == null

if語句將在調用Double.parseDouble如果str不能被解析爲數字拋出NumberFormatException的第一部分。

也許下面的代碼片段將幫助您:

if (str == null || str.trim().isEmpty()) { 
    // handle null and empty strings 
} else if (cell.getType() == Cell.CELL_TYPE_NUMERIC) { 
    System.out.println("Cell is numeric."); 
    num = cell.getNumericCellValue(); 
} else { 
    // If the cell is not numeric, Double.parseDouble(str) 
    // will most likely throw a NumberFormatException 
} 

要了解更多關於Cell,讀取其Javadoc

+0

異常NumberFormatException是提示,所以我給了你最後的投票。 –

+0

在更靈活的情況下,你的代碼會對我有所幫助,但問題是我不知道爲什麼他們被讀爲空或空,我不知道如何處理它們。他們不應該閱讀爲空或空,我看過表格,官方數據是字符串,類似於「0.205」。 – Nick

+0

@Nick,這段代碼有效:double num = Double.parseDouble(「0.205」);試試看! –

0

這將是很好,如果我們都知道哪些代碼行號引起的異常。

我懷疑你的第一行代碼是原因。對象單元格可能爲空,並且空地址不能轉換爲字符串類型。您可以通過代碼進行檢查。

注意:該代碼適用於Office 2010是好的,但我認爲這種類型的問題可能發生在任何Excel版本中。

+0

我剛剛更新了主帖,以反映找到錯誤的位置。雖然錯誤並不能反映整個問題。爲什麼當我的單元格確實不是空白時,我的單元格會被視爲空白? – Nick

相關問題