Apache POI XSSF存在问题,因为它没有读取空白单元格值。
我有一个实现DefaultHandler的类。在该类中,所有非空单元格都能够从startElement和endElement方法中读取。
我想读取数据单元格中间的空白单元格。
有人可以举例说明如何调试吗?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
建立Sab Than的回答:
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;
}
答案 2 :(得分:0)
如果我没记错,如果您尝试读取尚未赋值的单元格值,则会出现NullPointerException或类似情况。你可以在try-catch语句中包围正在检查单元格的代码,然后编写自己的代码来处理这种情况。
如果我的内存没有正确地为我服务而且抛出的错误不是NullPointerException,那么将catch异常类更改为相关的类。