2012-05-07 130 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; 
} 
相关问题