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] Comment Lire le contenu des cellules Excel avec Java


Sujet :

Documents Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut [POI] Comment Lire le contenu des cellules Excel avec Java
    Bonjour à tout le monde,

    Je suis sur un projet, dans le quel je veux importer le contenu des feuilles Excel dans des tables d'une base des données.
    Après plusieurs recherches et étude de tuto, j'ai choisi l'API apache-poi.

    Je rencontre des problèmes quand je veux lire une à une les cellules pour les stocker dans des variables. Pour la première cellule, ça marche, mais après une erreur est générée.

    Voici une partie de mon code et l'erreur.

    Une partie de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (Iterator rowIt = sheet.rowIterator(); rowIt.hasNext();) {
    		        row = (HSSFRow) rowIt.next();
    		        if(row.getRowNum()!=0){ // en-tête du tableau
    		        for (Iterator cellIt = row.cellIterator(); cellIt.hasNext();) {
    		          cell = (HSSFCell) cellIt.next();
    		          film.setFilm_id((int)cell.getNumericCellValue());
    		          film.setTitre(cell.getStringCellValue());
    Au niveau de la dernière ligne, où je récupère du String, l'erreur apparaît
    NB : le titre est dans la cellule suivante à droite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mars 21, 2017 3:21:24 PM org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: "Servlet.service()" pour la servlet ImportFilm a généré une exception
    java.lang.IllegalStateException: Cannot get a text value from a numeric cell
    	at org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:643)
    	at org.apache.poi.hssf.usermodel.HSSFCell.getRichStringCellValue(HSSFCell.java:720)
    	at beans.Film.importer(Film.java:93)
    	at servlets.SImport.doPost(SImport.java:56)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292
            ......
    Aidez-moi, s'il vous plait.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu lis tes 2 valeurs dans la même cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     for (Iterator cellIt = row.cellIterator(); cellIt.hasNext();) { // parcourir toute les cellules de la ligne
    		          cell = (HSSFCell) cellIt.next(); // prendre la prochaine qui vient
    		          film.setFilm_id((int)cell.getNumericCellValue()); // lire le contenu de la cellule comme un int
    		          film.setTitre(cell.getStringCellValue()); // lire le contenu de la cellule (la même que lue l'instruction juste avant) comment une String
    Il te faut un moyen de déterminer quelle cellule tu list, parc exemple son index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     for (Iterator cellIt = row.cellIterator(); cellIt.hasNext();) { // parcourir toute les cellules de la ligne
    		          cell = (HSSFCell) cellIt.next(); // prendre la prochaine qui vient
    switch( cell.getColumnIndex() ) {
     
        case 0: // je lis la cellule de la colonne 0
            film.setFilm_id((int)cell.getNumericCellValue()); // lire le contenu de la cellule comme un int
            break;
        case 1: // je lis la cellule de la colonne 1                   
            film.setTitre(cell.getStringCellValue()); // lire le contenu de la cellule (la même que lue l'instruction juste avant) comment une String 
            break;
     
         /*...*/
     
    }
    Ça ne ferait pas de mal également de tester le type de la donnée dans la cellule avant de lire (il y a peut-être des erreurs dans le fichier Excel, ou alors le type n'est pas exactement le type attendu (par exemple, on peut saisir le nom du film 23 en chiffres, donc le getStringCellValue() ne fonctionnera pas, mais tu peux convertir le nombre 23 en String.

    Par exemple, pour lire une cellule sous forme de String quelque soit le type de la donnée dans la cellule (attention, l'exemple fait appel à des méthodes que je ne fournis pas) :

    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
    public String readAsString(Cell cell) {
        final String value;
        switch(cell.getCellTypeEnum()) {
        case STRING:
            value = nullIfEmpty(cell.getStringCellValue());
            break;
        case NUMERIC:
            if (DateUtil.isCellDateFormatted(cell)) {
                value=dateToString(cell.getDateCellValue());
            } else {
                return numberToString(cell.getNumericCellValue());
            }
            break;
        case BOOLEAN:
            value= booleanToString(cell.getBooleanCellValue());
            break;
        case BLANK:
            value=null;
    	break;
        case FORMULA:
            final org.apache.poi.ss.usermodel.CellValue cellValue = context.getFormulaEvaluator().evaluate(cell);
            switch(cellValue.getCellTypeEnum()) {
            case STRING:
    	    value = cellValue.getStringValue();
                break;
            case NUMERIC:
                value =  numberToString(cellValue.getNumberValue());
                break;
            case BOOLEAN:
                value = booleanToString(cellValue.getBooleanValue());
                break;
    	case ERROR:
                throw new ExcelErrorException(cell, cellValue.getErrorValue());
            default:
    	    throw new IllegalStateException();
    	} 
        break;
        case ERROR:
        	throw new ExcelErrorException(cell, cell.getErrorCellValue()); 
        case _NONE:
        default:
    	throw new IllegalStateException();
        } 
    return value;
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut
    Merci, le problème est résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/09/2013, 13h31
  2. Gérer des fichiers Excel avec java
    Par Aladin230 dans le forum Documents
    Réponses: 2
    Dernier message: 21/07/2009, 14h59
  3. [FPDF] Comment centrer le contenu des cellules d'un tableau généré avec FPDF ?
    Par hacksi dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 07/02/2008, 15h38
  4. Comment lire a partir d'un ByteBuffer avec java
    Par jlassiramzy dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2006, 15h36
  5. [EXCEL]Comment lire à partir d'un fichier Excel en java?
    Par BOUSHIH dans le forum Documents
    Réponses: 3
    Dernier message: 20/04/2006, 11h04

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