Question

J'ai une feuille de calcul vide, mais lorsque j'y accède avec Apache POI (version 3.10), il est indiqué qu'elle comporte 1 024 colonnes et 20 colonnes physiques.
J'ai vraiment supprimé toutes les cellules, il ne reste qu'un peu de mise en forme, mais aucun contenu.
Et si je supprime certaines colonnes avec LibreOffice Calc (version 4.1.3.2), le nombre de colonnes uniquement augmente!Que se passe-t-il?
Existe-t-il un moyen fiable d'obtenir le nombre réel de colonnes (ou de cellules d'une rangée) ?

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());
    }
}
Était-ce utile?

La solution

Après une enquête plus approfondie, je pense avoir compris ce qui se passe.

Tout d’abord, quelques termes de POI :il y a des cellules qui n'existent pas du tout dans la feuille de calcul - on les appelle manquant, ou indéfini/non défini.Ensuite, certaines cellules sont définies, mais n'ont aucune valeur - elles sont appelées vide cellules.Les deux types de cellules apparaissent vides dans un tableur et ne peuvent pas être distingués visuellement.

Ma feuille de calcul contient des cellules vides que LibreOffice a ajoutées à la fin de la ligne (peut-être un bug).Lorsque je supprime des colonnes, LibreOffice semble décaler les cellules suivantes (y compris les cellules vides) vers la gauche et ajoute d'autres cellules vides à la fin (jusqu'à 1024).

Et maintenant l'élément clé :ni l'un ni l'autre getLastCellNum() ni getPhysicalNumberOfCells() ignorer les cellules vides. getLastCellNum() donne le dernier défini cellule, et getPhysicalNumberOfCells() donne le nombre de défini cellules, toutes deux comprenant des cellules vides.Il ne semble pas exister de méthode disponible permettant d'ignorer les cellules vides.Le javadoc pour getPhysicalNumberOfCells() est quelque peu trompeur - "si seules les colonnes 0,4,5 ont des valeurs, alors il y en aurait 3", mais cela compte aussi les cellules vides, qui n'ont pas vraiment de valeurs.

La seule solution que j'ai trouvée est donc de parcourir les cellules et de vérifier si elles sont vides.

Remarque complémentaire : getLastRowNum() et getFirstCellNum() sont basés sur 0 mais getLastCellNum() est basé sur 1, wtf ?

Autres conseils

Il est fort probable qu'une sorte de mise en forme soit appliquée à votre ligne.J'ai un fichier xlsx vide créé avec Excel et la méthode getRow produit null pour les lignes vides.

@adiitsu selon https://poi.apache.org/apidocs/dev/org/apache/poi/sss/usermodel/row.html , GetLastCellnum () Obtient l'index de la dernière cellule contenue dans cette rangée plus une.

+1 pour LibreOffice Struge!C'est un bug, et à mon avis est très aléatoire.Je deviens null de manière aléatoire et aide souvent si je supprime des lignes vides (ci-dessous) et des colonnes vides (sur le côté droit). ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top