Frage

Ich habe eine leere Tabelle, aber wenn ich mit Apache POI (Version 3.10) darauf zugreife, wird angezeigt, dass sie 1024 Spalten und 20 physische Spalten enthält.
Ich habe wirklich alle Zellen gelöscht, es sind nur noch einige Formatierungen übrig, aber kein Inhalt.
Und wenn ich mit LibreOffice Calc (Version 4.1.3.2) einige Spalten lösche, wird nur die Anzahl der Spalten angezeigt erhöht sich!Was ist los?
Gibt es eine zuverlässige Möglichkeit, die tatsächliche Anzahl von Spalten (oder Zellen in einer Zeile) zu ermitteln?

import java.net.URL;
import org.apache.poi.ss.usermodel.*;

public class Test {
    public static void main(final String... args) throws Exception {
        final URL url = new URL("http://aditsu.net/empty.xlsx");
        final Workbook w = WorkbookFactory.create(url.openStream());
        final Row r = w.getSheetAt(0).getRow(0);
        System.out.println(r.getLastCellNum());
        System.out.println(r.getPhysicalNumberOfCells());
    }
}
War es hilfreich?

Lösung

Nach einigen weiteren Nachforschungen denke ich, dass ich herausgefunden habe, was los ist.

Zunächst einige Begriffe aus POI:Es gibt einige Zellen, die in der Tabelle überhaupt nicht existieren – diese werden aufgerufen fehlen, oder nicht definiert/nicht definiert.Dann gibt es einige Zellen, die definiert sind, aber keinen Wert haben – diese werden aufgerufen leer Zellen.Beide Zelltypen erscheinen in einem Tabellenkalkulationsprogramm leer und können optisch nicht unterschieden werden.

Meine Tabelle enthält einige leere Zellen, die LibreOffice am Ende der Zeile hinzugefügt hat (möglicherweise ein Fehler).Wenn ich Spalten lösche, scheint LibreOffice die nachfolgenden Zellen (einschließlich der leeren) nach links zu verschieben und am Ende weitere leere Zellen hinzuzufügen (bis zu 1024).

Und jetzt der entscheidende Teil:weder getLastCellNum() noch getPhysicalNumberOfCells() Ignorieren Sie leere Zellen. getLastCellNum() gibt das Letzte definiert Zelle, und getPhysicalNumberOfCells() gibt die Anzahl an definiert Zellen, beide einschließlich leerer Zellen.Es scheint keine Methode zu geben, die leere Zellen überspringt.Das Javadoc für getPhysicalNumberOfCells() ist etwas irreführend – „Wenn nur die Spalten 0,4,5 Werte hätten, dann gäbe es 3“, aber tatsächlich werden auch leere Zellen gezählt, die eigentlich keine Werte haben.

Die einzige Lösung, die ich gefunden habe, besteht darin, die Zellen zu durchlaufen und zu prüfen, ob sie leer sind.

Randnotiz: getLastRowNum() Und getFirstCellNum() sind 0-basiert, aber getLastCellNum() ist 1-basiert, was?

Andere Tipps

Wahrscheinlich haben Sie eine Art Formatierung, die für Ihre Zeile angewendet wird.Ich habe eine leere XLSX-Datei, die mit Excel und Method EctricaDicetAgcode erstellt wurde, erzeugt NULL für leere Zeilen.

@Aditsu gemäß https://poi.apache.org/apidocs/dev/org/apache/poi/s/susermodel/row.html , getlastcellnum () erhält den Index der letzten in dieser Reihe enthaltenen Zelle plus ein.

+1 für libreoffice agedrugle!Es ist ein Fehler, und meiner Meinung nach ist sehr zufällig.Ich bekomme nach dem Zufallsprinzip und hilft oft, wenn ich leere Zeilen (balg) und leere Spalten (auf der rechten Seite) lösche. ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top