2012-05-07 165 views
0

我有一個Apache POI XSSF的問題,因爲它沒有讀取空白單元格值。如何在apache POI中獲取空單元格值XSSF

我有一個實現DefaultHandler的類。在該類中,所有非空白單元格都可以從startElement和endElement方法讀取。

我想讀取數據單元中間的空白單元格。

任何人都可以提供如何這樣做的例子或方向如何調試呢?

+0

空白單元格,或細胞從未被使用?你知道.xlsx文件格式是稀疏的,不是嗎?從未使用過,也未曾使用過樣式的單元格不會存儲在其中 – Gagravarr

+0

另外,您是使用.xlsx用戶模型,還是自己在做低級SAX解析? – Gagravarr

+0

是空白單元我的意思是數據是這樣的 A1 B1 C1 1 abc 我無法讀取此B1單元 –

回答

0

如果我沒有記錯,如果您嘗試讀取未分配值的單元格值,則會出現NullPointerException或類似錯誤。您可以在try-catch語句中圍繞正在檢查單元的代碼,然後編寫自己的代碼來處理這種情況。

如果我的內存不正確地服務於我,並且拋出的錯誤不是NullPointerException,那麼請將catch異常類更改爲相關的錯誤類。

2

今天遇到這個非常相同的問題。我正在使用XSSF事件模型。但是XSSF不會爲空白列提供列元素或值元素。很可能是因爲支持XML就是這樣。

關鍵是檢查單元格引用的屬性(您知道Excel使用的A1,A2,A3)。屬性被傳遞給startElement()回調方法。然後我們可以檢測丟失的單元格引用所以如果我們爲前一列元素得到L1,並且爲當前列元素得到N1,我們知道M1是空白/丟失單元格。

public void startElement(String uri, String localName, String qName,  Attributes atts) throws SAXException { 
if (qName.equals("c")) { 
    String newColRef = atts.getValue("r"); 
    coverColumnDistanceWithNulls(currentColRef, newColRef); 

而且coverColumnDistanceWithNulls()只是增加了空的currentColRef和newColRef

之間的每個丟失的單元格引用
private void coverColumnDistanceWithNulls(String fromColRefString, String toColRefString) { 
    int colRefDistance = getDistance(fromColRefString, toColRefString); 
    while (colRefDistance > 1) { 
     logger.debug("Covering distance with null"); 
     rowValues.add(null); 
     --colRefDistance; 
    } 
} 

private int getDistance(String fromColRefString, String toColRefString) { 
    String fromColRef = getExcelCellRef(fromColRefString); 
    String toColRef = getExcelCellRef(toColRefString); 
    logger.debug("fromCol: {} toCol: {}", new Object[] {fromColRefString, toColRefString}); 
    return excelCellReferenceOrder.get(toColRef) - excelCellReferenceOrder.get(fromColRef); 
} 

private String getExcelCellRef(String fromColRef) { 
    if (fromColRef != null) { 
     int i = 0; 
     for (;i < fromColRef.length(); i++) { 
      if (Character.isDigit(fromColRef.charAt(i))) { 
       break; 
      } 
     } 
     if (i == 0) { 
      return fromColRef; 
     } 
     else { 
      return fromColRef.substring(0, i); 
     } 
    } 
    return null; 
} 
+0

你的代碼中的這個excelCellReferenceOrder對象是什麼?返回excelCellReferenceOrder.get(toColRef) - excelCellReferenceOrder.get(fromColRef);你能否請你張貼一些細節。我面臨着同樣的問題。 – ROCKY

1

建設關審計局比的回答是:

private void coverColumnDistance(String fromColRefString, String toColRefString) { 
    int colRefDistance = getDistance(fromColRefString, toColRefString); 
    while (colRefDistance > 0) { 
     c = getRow().addCell(""); 
     colRefDistance--; 
    } 
} 

private int getDistance(String fromColRefString, String toColRefString) { 
    String fromColRef = getExcelCellRef(fromColRefString); 
    String toColRef = getExcelCellRef(toColRefString); 
    int distance = 0; 
    if (fromColRef == null || fromColRef.compareTo(toColRef) > 0) 
     return getDistance("A", toColRefString) + 1; 
    if (fromColRef != null && toColRef != null) { 
     while (fromColRef.length() < toColRef.length() || fromColRef.compareTo(toColRef) < 0) { 
      distance++; 
      fromColRef = increment(fromColRef); 
     } 
    } 
    return distance; 
} 

public String increment(String s) { 
    int length = s.length(); 
    char c = s.charAt(length - 1); 

    if(c == 'Z') { 
     return length > 1 ? increment(s.substring(0, length - 1)) + 'A' : "AA"; 
    } 

    return s.substring(0, length - 1) + ++c; 
} 

private String getExcelCellRef(String fromColRef) { 
    if (fromColRef != null) { 
     int i = 0; 
     for (; i < fromColRef.length(); i++) { 
      if (Character.isDigit(fromColRef.charAt(i))) { 
       break; 
      } 
     } 
     if (i == 0) { 
      return fromColRef; 
     } 
     else { 
      return fromColRef.substring(0, i); 
     } 
    } 
    return null; 
} 
相關問題