IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Documents Java Discussion :

[POI] J'obtiens "0" sur les cellules vides


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut [POI] J'obtiens "0" sur les cellules vides
    Bonjour,

    j'utilise POI 3.5 pour lire un fichier XLS (j'ai eu le même problème avec l'API JXL). Pour les colonnes où sont stockés des numériques, quand la cellule est vide, POI tient absolument à me refiler un int qui vaut 0. Impossible d'avoir un "" malgré diverses feintes pour reformater la cellule.

    Franchement je me fiche pas mal si la cellule est un String, une date ou un numérique, je voudrais parser tout mon fichier en String et faire les traitements moi-même ! Je ne veux surtout pas de "switch case" sur les CellType. Car à ce moment le problème est déjà là : ma cellule vide est remplie par un 0.

    Comment faire ?

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Par définition les types primitifs (int, double, float, long, short) ne peuvent pas ne pas avoir de valeur.

    Le code suivant affichera 0;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a;
    System.out.println(a);
    Donc ton problème ne vient pas de POI mais de ta compréhension des mécanismes de java...

    Tu devrais plutôt aller voir du coté du type CELL_TYPE_BLANK...

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut
    Merci pour ma compréhension du java... J'ai bien compris pourquoi j'avais "0". Etonnant l'arrogance dans le monde des développeurs.

    Pour reformuler le problème, c'est que Excel (le problème ne vient pas directement de POI) donne automatiquement un format à une cellule. Si une colonne contient des numériques et des cellules vides, les cellules vides prendront le format numérique.

    Et alors quand je récupère le workbook avec POI, impossible de voir ces cellules vides autrement que "0".

    C'est sûr qu'agir directement sur l'XLS pour le reformarter, le transformer en csv ou je ne sais quoi aiderait mais bon...

    EDIT : enfin merci sinok d'avoir répondu. Désolé de me vexer bêtement, c'est moi l'arrogant... qui a perdu toute la journée sur ce problème

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le CELL_TYPE_BLANK ne fonctionne pas dans ton cas?

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut
    Les cellules en question sont de type 0, soit CELL_TYPE_NUMERIC.

    Je pense que mon cas est dû au fichier xls lui-même. Mais je suis étonné de ne pas retrouver ce problème sur les forums.

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Etrange ton problème, après quelques test de mon coté, pour les cellules vides deux cas se présentent: dans le cas ou le contenu a été effacé via un delete alors que la cellule était en édition, dans ce cas, c'est analysé comme un type String

    Dans le cas où le delete(suppr) est effectué quand la cellule est sélectionnée mais pas en édition, la cellule disparaît purement et simplement.

    De fait je ne retrouve absolument pas le comportement que tu décris avec la dernière version stable de POI.

    Cf le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    package poi;
     
    import java.io.IOException;
     
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.usermodel.WorkbookFactory;
     
     
     
    public class BlankTest {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Module de remplacement de méthode auto-généré
            try {
                Workbook wb = WorkbookFactory.create(BlankTest.class.getClass().getResourceAsStream("/poi.xls"));
                Sheet sheet = wb.getSheetAt(0);
                System.out.println("nbLignes= "+sheet.getLastRowNum());
                System.out.println("nbLignesPhy= "+sheet.getPhysicalNumberOfRows());
                for (int i = 0; i<sheet.getPhysicalNumberOfRows();i++) {
                    Row r = sheet.getRow(i);
                    System.out.println("nbCols= "+r.getLastCellNum());
                    System.out.println("nbColsPhy= "+r.getPhysicalNumberOfCells());
                    for(int j = 0; j < r.getLastCellNum(); j++) {
                        Cell c = r.getCell(j);
     
     
                        if(c == null) {
                            System.out.print("null ");
                        } else {
     
                            System.out.print("col indx: "+c.getColumnIndex()+" ");
                            System.out.print("cell type: "+c.getCellType()+" ");
                            if(c.getCellType() == Cell.CELL_TYPE_BLANK) {
                                System.out.print("vide");
                            } else if (c.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                                System.out.print("numeric "+c.getNumericCellValue());
                            } else if (c.getCellType() == Cell.CELL_TYPE_STRING) {
                                System.out.print("String "+c.getStringCellValue());
                            }
                            System.out.print(" ");
                        }
                    }
                    System.out.println();
                }
     
            } catch (InvalidFormatException e) {
                // TODO Bloc catch auto-généré
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Bloc catch auto-généré
                e.printStackTrace();
            }
        }
    }
    Utilisé sur le fichier excel en PJ
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [DataGridView] ToolTips sur les cellules
    Par Ticoche dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/01/2008, 09h18
  2. Filtrer sur les données vides dans un formulaire
    Par jevany dans le forum Access
    Réponses: 7
    Dernier message: 29/05/2006, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo