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] Apache POI récupérer numéro Row si une cell contient un texte spécifique.


Sujet :

Documents Java

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 154
    Points : 87
    Points
    87
    Par défaut [POI] Apache POI récupérer numéro Row si une cell contient un texte spécifique.
    Bonjour a tous, voila j'ai une activity qui lit un fichier xls avec POI et qui fonctionne très bien.

    mais maintenant je voudrait pouvoir récupérer tous les numéro des colonnes ou dans leurs cellule numéro 3 contient le texte "NON" dans une Array.

    je suis en train de faire des essaye comme ceci mais sa ne fonctionne 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
            final ArrayList<ArrayList<String>> ArrayNonComplet=new ArrayList<>();
            while (rowIter.hasNext()) {
                final HSSFRow myRow = (HSSFRow) rowIter.next();
                final Cell cell = myRow.getCell(3);
                final String quittance = String.valueOf(cell);
                Log.d("Debug", String.valueOf(quittance));
                ArrayList<String> ArrayLigne=new ArrayList<String>();
     
     
                final ArrayList<String> ArrayNon=new ArrayList<>();
                final ArrayList<Integer> ArrayOui=new ArrayList<>();
                for (int i = 0; i <= sheet1.getLastRowNum(); i++) {
     
                    if ("NON".equals(quittance) == true) {
                        int numrow = i;
                        //   Toast.makeText(Quittance.this, "COUCOUCOCUCOUCOUC", Toast.LENGTH_SHORT).show();
                        // HSSFSheet sheet1 = wb.getSheetAt(0);
                        ArrayNon.add(String.valueOf(numrow));
                        Log.d("ArrayNon", String.valueOf(ArrayNon));
                        ArrayNonComplet.add(ArrayNon);
                        Log.d("ArrayNonComplet", String.valueOf(ArrayNonComplet));
     
                        //ArrayLigne.add (String.valueOf(myCell));
                       // ArrayFichier.add (String.valueOf(ArrayLigne));
                        // view.setTextColor(Color.WHITE);
                        //setBackgroundColor(Color.parseColor("#d60610"));
                        //view.setBackgroundColor(Color.RED);
                    } else {
                       // int numrow = i;
                       // ArrayOui.add(numrow);
                        // ArrayNon.add (position);
                       // Log.d("ArrayOui", String.valueOf(ArrayOui));
                        // Set the background color for alternate row/item
     
                    }
     
            }}
    Auriez vous une idées de a maniéré de faire pour y parvenir?

    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, inutile de faire une boucle dans la boucle qui parcourt les lignes (en plus, c'est faux ce que tu fais, de comparer "NON" à la valeur de la cellule : ce test sera soit vrai pour toutes les lignes, soit faux pour toutes les lignes (la valeur de quittance ne changeant pas dans la boucle interne). Récupère le numéro de ligne par myRow.getRowNum().

    Ensuite, on ne lit pas la valeur d'une cellule comme tu le fais (final String quittance = String.valueOf(cell)) mais par final String quittance = cell.getStringCellValue().

    Comme tu veux cumuler les numéros de lignes, il faut que la liste qui stocke les numéros de ligne soit déclarée en dehors de la boucle (si elle est déclarée dans le bloc de la boucle, elle n'existe que dans ce bloc, est réinitialisée à chaque nouveau tour de boucle, et, donc, ne peut pas cumuler. Il semble que tu aies cherché à faire ça avec ta variable ArrayNonComplet, mais pourquoi est-ce une liste de listes ? Il y a un numéro de ligne par ligne, non ? Et pourquoi du String pour stocker des numéros de lignes ?

    Tu ferais mieux d'écrire final Row myRow = rowIter.next(); au lieu de final HSSFRow myRow = (HSSFRow) rowIter.next();. Comme ça, ça fonctionnera quelque soit le type de classeur (ancien format ou nouveau).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    final List<Integer> numLineWhereNon=new ArrayList<>();
    while (rowIter.hasNext()) {
                final Row myRow = rowIter.next();
                final Cell cell = myRow.getCell(3);
                // éventuellement, ajouter ici le test du type de cellule, au cas où ton fichier ne serait pas conforme
                final String quittance = cell.getStringCellValue();
                if ( "NON".equals(quittance) ) {
                     numLineWhereNon.add(myRow.getRowNum());
               }
    }
    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 régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 154
    Points : 87
    Points
    87
    Par défaut
    Merveilleux sa marche a la perfection!!

    Alors la boucle dans la boucle c'etait dans le désespoir je ne savais pas comment récupérer le numéro de la Row...

    Ensuite, on ne lit pas la valeur d'une cellule comme tu le fais (final String quittance = String.valueOf(cell)) mais par final String quittance = cell.getStringCellValue().
    Aha est ce que je peut te demander pourquoi pour ma culture général? j'ai toujours utiliser cette technique jusqu’à maintenant et je n'ai jamais eu de souci...!

    ps: en utilisent ce code ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final String quittance = cell.getStringCellValue();
    quand je tombe sur une cellule vide et quelle me renvoie null mon app plante meme en fesant ce code si:

    String quittance = null;
    quittance = cell.getStringCellValue();
    j'image que c'est tous bete mais je suis débutant en programmation donc je ne comprand pas tous d'office ;-)

    pour ce qui est le la liste dans la liste avec mon ArraynonComplet la aussi un agissement dans le désespoir je ne l'ai rajouter que après plusieurs essaie sans succès... j'avais récuperer cette technique d'une autre que j'avais pour ajouter toutes les cell a la suite pour constitué une phrase mais aucune importance ici...

    Tu ferais mieux d'écrire final Row myRow = rowIter.next(); au lieu de final HSSFRow myRow = (HSSFRow) rowIter.next();. Comme ça, ça fonctionnera quelque soit le type de classeur (ancien format ou nouveau).
    merci beaucoup du conseille je modifierait tous mes code de cette maniéré!!

    bon le fichier est créer par mon application donc ce sera toujours du xls mais je vais tous de même faire cela proprement!!

    dans tous les cas merci pour ces infos est les explication précise de chaque point c'est agréable quand on début d'avoir des explication complété!!

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par der43e Voir le message
    Aha est ce que je peut te demander pourquoi pour ma culture général? j'ai toujours utiliser cette technique jusqu’à maintenant et je n'ai jamais eu de souci...!

    ps: en utilisent ce code ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final String quittance = cell.getStringCellValue();
    C'est une question de contrat : la méthode getStringCellValue() est la méthode pour récupérer la valeur d'une cellule de type String. La méthode toString() est une méthode faite pour donner une représentation String de l'instance d'objet.
    Si les développeurs ont choisi de renvoyer la valeur String contenue dans la cellule lorsqu'il s'agit d'une String, c'est, je dirais, une "coïncidence volontaire" : ils ont dû se dire que ce n'était pas plus mal de faire comme ça, parce que ça restait logique. Mais rien ne dit qu'il n'ait pas besoin d'intégrer un jour d'autres informations, et qu'ils soient donc obligés de modifier le retour de la méthode toString(). A noter également, que tu ne maîtrise pas la hiérarchie de classes qu'il y a derrière la classe que tu manipules : tu pourras peut-être utiliser un jour une extension de l'API qui étend la classe, en modifiant toString() pour des besoins quelconques.
    C'est un peu comme si tu as une classe comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Vehicule {
           private final String nom;
           public Vehicule(String nom) {
               this.nom=Objects.requiredNotNull(nom); 
           }
           public String getNom() {
                return nom;
           }
           public String toString() {
                return getNom();
           }
    }
    C'est une coïncidence que toString() retourne getNom().
    Si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class VehiculeVolant extends Vehicule {
           public VehiculeVolant(String nom) {
               super(nom);
           }
           public String toString() {
                return "flying " + super.toString();
           }
    }
    ce qui est licite (le contrait de la méthode toString() n'est pas de retourner la propriété nom de l'objet, c'est le contrat de la méthode getNom()), et bien, toString() ne retourne plus le nom du véhicule.


    Citation Envoyé par der43e Voir le message

    quand je tombe sur une cellule vide et quelle me renvoie null mon app plante meme en fesant ce code si:
    Il faut évaluer le type de la cellule ( getCellType() ou getCellTypeEnum() selon la version d'API), et si c'est Cell.CELL_TYPE_BLANK/CellType.BLANK, alors elle est vide (tu ne lis même pas la valeur, tu sais qu'elle est null), et si c'est Cell.CELL_TYPE_String/CellType.String, tu peux alors lire la valeur avec getStringCellValue() et dans tous les autres cas, il ne faut pas lire la valeur, et décider ce que tu veux (ça veut dire que la cellule n'est pas vide, mais ne contient pas une chaîne, donc que tu ne peux pas le traiter avec le procédé normal (comparer à "NON"), donc soit tu l'ignores (à traiter comme une case vide), soit tu soulèves une exception pour dire que le fichier est incorrect et qu'on ne peut pas le traiter.
    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.

Discussions similaires

  1. Apache POI: récupérer les noms de colonnes d'un fichier excel
    Par cedy-kassy dans le forum Général Java
    Réponses: 2
    Dernier message: 25/03/2014, 12h35
  2. Réponses: 2
    Dernier message: 06/11/2013, 12h03
  3. POI récupérer le nom d'une cellule excel?
    Par youna dans le forum Documents
    Réponses: 1
    Dernier message: 12/06/2013, 09h25
  4. Apache POI représenter une arborescence sur un slide
    Par elvis54 dans le forum Général Java
    Réponses: 0
    Dernier message: 02/06/2009, 09h04
  5. Réponses: 1
    Dernier message: 23/08/2007, 08h06

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