0

Apache POI XSSF が空白のセル値を読み取らないという問題があります。

DefaultHandler を実装するクラスがあります。そのクラスでは、すべての非空白セルは startElement および endElement メソッドから読み取ることができます。

データセルの真ん中にある空白のセルを読みたいです。

これをデバッグする方法の例や指示を誰でも提供できますか?

4

3 に答える 3

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の間に欠落しているセル参照ごとにnullを追加するだけです。

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;
}
于 2013-02-19T13:29:04.877 に答える
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;
}
于 2014-12-30T19:40:49.403 に答える
0

私の記憶が正しければ、値が割り当てられていないセル値を読み取ろうとすると、NullPointerException などを取得します。セルを調べているコードを try-catch ステートメントで囲み、そのようなシナリオに対処する独自のコードを記述できます。

メモリが正しく機能せず、スローされたエラーが NullPointerException でない場合は、catch 例外クラスを関連するクラスに変更します。

于 2012-05-15T18:14:55.353 に答える