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] Importer informations Excel dans ComboBox


Sujet :

Documents Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut [POI] Importer informations Excel dans ComboBox
    Bonjour,

    J'ai un pépin qui m'a pris toute la journée d'aujourd'hui, et mon dernier recours est de poster un petit message avant d'abandonner.

    Pour le travail je dois utiliser un tableau Excel comme BDD, dans le but de lire les informations contenues dedans et de créer un logiciel de Statistiques. Ce fichier est mis à jour tous les mois par le siège social, ce qui fait qu'il n'est pas question de le transformer, sous peine de devoir le faire tous les mois.

    On me demande, à terme, d'intégrer énormément de fonction de tri et même des graphiques dans cette application, via des checkbox, combo, etc, ... Mais afin de commencer léger j'ai simplement fait une petite page avec deux combobox et un textfield, dans le but que la comboBox1 reprenne l'intitulé des lignes, et que la comboBox2 reprenne l'intitulé des colonnes, afin de faire une recherche croisée et d'afficher directement le résultat dans le textfield.

    Malgré une journée de tests et de recherches, tout ce que j'ai réussi à faire c'est de print le contenu de la première colonne dans la console en utilisant la librairie POI 3.15.

    Je ne trouve aucune info valable sur le net, et je commence à sérieusement désespérer

    D'avance un tout grand merci à ceux qui pourront m'aider.

  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,

    Tu as une page avec de très nombreux exemples sur le site d'Apache.

    Et si tu as une question précise, n'hésite pas à la poser dans le forum.
    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
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup pour cette page. En effet, en triant les infos qu'elle contient j'ai pu rassembler et mettre ensemble ce qui m'était utile. Étant débutant j'ai dû tester pas mal de choses avant d'y arriver mais hey, c'est comme ça qu'on apprend.

    Par contre je me permets de revenir vers ce sujet car, malgré que j'ai réussi à afficher les mois dans une ComboBox, et les données dans l'autre, à l'aide d'un système d'incrémentation qui m'a l'air tout à fait foireux, je n'ai absolument aucune idée de quoi faire pour demander à un TextField d'afficher le résultat correspondant (Par exemple si j'ai choisi "Janvier" dans la première Combo, et "% d'absence" dans la seconde, j'aimerais qu'il m'affiche le résultat qui est présent dans le fichier Excel).

    Voici mon code pour toutes ces opérations, afin que vous puissiez voir où j'en suis dans mon raisonnement.

    Un tout grand merci !

    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
     
    public class Indicateur {
     
    Vector periodList = new Vector(); // La liste pour la Combo période
    Vector indicList = new Vector(); // La liste pour la Combo Indicateurs
    JComboBox comboPeriode = new JComboBox(periodList);
    JComboBox comboIndicateurs = new JComboBox(indicList);
    JTextField tResult = new JTextField(20); // Le TextField pour le résultat
     
    public Indicateur() throws IOException, InvalidFormatException {
     
    // Code de mise en page
     
    Workbook wb = WorkbookFactory.create(new File("EXCEL FILE PATH"));
            Sheet sheet902 = wb.getSheetAt(0);
            int row = 5;
            int cell = 3;
    // La liste des mois se trouve de la cellule C à P, donc cette combo doit reprendre de 3 à 15, d'où la variable cell
            while (cell < 15) {
                periodList.add(sheet902.getRow(1).getCell(cell).toString());
                cell++;
            }
    // La liste des données reprises dans le tableau se trouve de la ligne 5 à 165, d'où la variable row
            while (row < 165){
                indicList.add(sheet902.getRow(row).getCell(1).toString());
                row++;
            }
        }
    }

  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
    Salut,

    Ton problème est de faire le lien entre le couple de sélection des combos et la donnée correspondante dans la feuille Excel. Autrement dit, c'est de retrouver la référence de la cellule corrspondant à une colonne correspondant à une période (mois) et une ligne (indicateur). Autrement dit, retrouver le numéro de row pour l'indicateur choisi, et le numéro de cell dans la row pour le mois choisi.

    Tu as plusieurs solutions pour faire ça, entre autres(liste non exhaustive) :

    1. Utiliser des Map : elles te permettront d'associer les valeurs des combos avec les index correspondants
      Par exemple, pour les périodes :
      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
      public class Indicateur {
       
      /** ... **/
       
       
      private Map<String, Integer> periodMap = new HashMap<>();
       
      public Indicateur() throws IOException, InvalidFormatException {
       
      /** ... **/
       
      while (cell < 15) {
                  String label = sheet902.getRow(1).getCell(cell).toString();
                  periodList.add(label);
                  map.put(label, cell);
                  cell++;
              }
       
      /** ... **/
       
      }
      Et pour la récupérer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int selectedPeriodCell = perdiodMap.get(comboPeriode.getSelectedIndex());
      idem pour la row (avec une autre map).
      puis
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Row selectedRow = sheet902.getRow(selectedIndicateurs);
      Cell cell selectedCell= selectedRow.getCell(selectedPeriodCell);
    2. Utiliser des classes associant libéllé e numéro
      Au lieu de faire des combos de String, tu fais une classe du genre :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      public class Label {
          public final int index;
          public final int String text;
          public Label(int index, String text) {
               this.index=index;
               this.text=text;
          } 
          public String toString() {
               return text;
          }
      }
      et
      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
      public class Indicateur {
       
      /** ... **/
      Vector<Label> periodList = new Vector<>(); // La liste pour la Combo période
      Vector<Label> indicList = new Vector<>(); // La liste pour la Combo Indicateurs
      JComboBox<Label> comboPeriode = new JComboBox<>(periodList);
      /** ... **/ 
       
      public Indicateur() throws IOException, InvalidFormatException {
       
      /** ... **/
       
      while (cell < 15) {
                  Label label = new Label(cell,sheet902.getRow(1).getCell(cell).toString());
                  periodList.add(label);
                  cell++;
              }
       
      /** ... **/
       
      }
      Et pour la récupérer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int selectedPeriodCell = ((Label)comboPeriode.getSelectedItem()).index;
    3. charger l'ensemble des données, et les stocker dans une map, dont la clef sera le couple de coordonnées. Ainsi, tu peux fermer ton classeur rapidement, et continuer d'avoir accès aux données. Si tu as besoin de quand même conserver la CellReference (par exemple, si tu dois modifier ton doc ensuite, tu peux la stocker aussi.
    4. Eventuellement, mais avec risques d'avoir à changer le code si la structure de la feuille change, ou d'autres modifications (genre changement de l'ordre d'affichage des items dans la combo), tu peux simplement faire un lien direct avec le selectedIndex :
      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
      public class Indicateur {
       
      /** ... **/
      private static final int CELL_START = 3;
       
      private Map<String, Integer> periodMap = new HashMap<>();
       
      public Indicateur() throws IOException, InvalidFormatException {
       
      /** ... **/
       
      int cell = CELL_START;
      while (cell < 15) {
                  String label = sheet902.getRow(1).getCell(cell).toString();
                  periodList.add(label);
                  map.put(label, cell);
                  cell++;
              }
       
      /** ... **/
       
      }
      Et pour la récupérer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int selectedPeriodCell = comboPeriode.getSelectedIndex())+CELL_START;
    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.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut
    La méthode des maps me semblait être la plus efficace, et facile à mettre en œuvre pour un relatif débutant, malheureusement je butte sur cette ligne qui empêche le programme de compiler :

    J'ai pourtant importé les classes nécessaires, mais rien n'y fait. Aussi, comme je ne comprenais pas à 100% la suite du code, et que je déteste recopier bêtement, j'ai décidé de tester la deuxième méthode.

    J'ai réussi à l'adapter, et mes Combo affichent bien les données, c'est parfait. Je me suis juste permis de corriger cette ligne qui si je ne me trompe était erronée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Label {
        public final int index;
        public final int String text;
        public Label(int index, String text) {
             this.index=index;
             this.text=text;
        } 
        public String toString() {
             return text;
        }
    }
    Par contre là où je sèche, c'est que je n'arrive pas à afficher le résultat escompté. J'ai dans un premier temps simplement essayé de Print le résultat de la sélection des Combo dans la console, mais il ne se passe rien. Évidemment je me dis qu'il manque quelque chose à la fin du code pour actualiser le résultat, j'ai donc essayé de mettre des ActionListener sur les Combo à la fin du code, mais malgré cela je n'arrive pas à afficher le résultat, que ce soit dans la console ou dans le TextField avec un jTextField.setText.
    A mon avis je m'y prends mal, si tu étais d'accord de m'aider à pointer l'endroit où je me trompe, ce serait fort aimable !
    Voici à quoi cela ressemble maintenant :

    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
    while (cell < 16) {
                Label label = new Label (cell,sheet902.getRow(1).getCell(cell).toString());
                periodList.add(label);
                cell++;
            }
            while (row < 165){
                Label label2 = new Label (cell,sheet902.getRow(row).getCell(1).toString());
                indicList.add(label2);
                row++;
            }
            int selectedPeriodCell = ((Label)comboPeriod.getSelectedItem()).index;
            int selectedIndicRow = ((Label)comboIndicateurs.getSelectedItem()).index;
           Label label3 = new Label (cell,sheet902.getRow(selectedIndicRow).getCell(selectedPeriodCell).toString());
     
          comboPeriod.addActionListener(new ActionListener() {
               @Override
               public void actionPerformed(ActionEvent e) {
                   System.out.println(label3);
               }
           });

  6. #6
    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 Neufunk Voir le message
    La méthode des maps me semblait être la plus efficace, et facile à mettre en œuvre pour un relatif débutant, malheureusement je butte sur cette ligne qui empêche le programme de compiler :

    C'est parce que la variable c'est periodMap, pas map (j'ai effectivement un peu tapé vité et n'est pas modifié le nom lorsque j'ai ajusté celui de l'attribut (pour la map des indicateurs, il faut bien sûr le nom de la variable de la map correspondante).



    Citation Envoyé par Neufunk Voir le message
    J'ai réussi à l'adapter, et mes Combo affichent bien les données, c'est parfait. Je me suis juste permis de corriger cette ligne qui si je ne me trompe était erronée :
    oui, un raté lors du copier/coller de la ligne d'avant (j'étais pas encore complètement réveillé visiblement au moment où je t'ai répondu).
    D'ailleurs, j'ai fait une troisième erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int selectedPeriodCell = perdiodMap.get(comboPeriode.getSelectedIndex());
    Il fallait lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int selectedPeriodCell = perdiodMap.get(comboPeriode.getSelectedItem());


    Citation Envoyé par Neufunk Voir le message
    Par contre là où je sèche, c'est que je n'arrive pas à afficher le résultat escompté. J'ai dans un premier temps simplement essayé de Print le résultat de la sélection des Combo dans la console, mais il ne se passe rien.
    Hum, il ne se passe vraiment rien ? Il faudrait voir comment tu écoutes les évenements de sélection de combo ? Cela devrait être du genre


    (avec la soluton map) :
    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
     
    comboPeriode.addActionListener( e-> {
     
           int cell = periodMap.get(comboPeriode.getSelectedItem());
           int row = indicMap.get(comboIndicateurs .getSelectedItem());
           System.out.println( "row: " + row + ", cell: " + cell);
     
    });
    comboIndicateurs.addActionListener( e-> {
     
           int cell = periodMap.get(comboPeriode.getSelectedItem());
           int row = indicMap.get(comboIndicateurs .getSelectedItem());
           System.out.println( "row: " + row + ", cell: " + cell);
     
    });
    et avec la deuxième solution :

    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
     
    comboPeriode.addActionListener( e-> {
     
           int cell = comboPeriode.getSelectedItem().index;
           int row = indicMap.getSelectedItem().index;
           System.out.println( "row: " + row + ", cell: " + cell);
     
    });
    comboIndicateurs.addActionListener( e-> {
     
           int cell = comboPeriode.getSelectedItem().index;
           int row = indicMap.getSelectedItem().index;
           System.out.println( "row: " + row + ", cell: " + cell);
     
    });
    Attention, aucun des deux cas ne peut fonctionner (tu auras des NullPointerException) si tu autorises une saisie libre dans la combo (de choisir un item qui n'existe pas dans la liste) .
    Il faut soit interdire la saisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    comboPeriode.setEditable(false);
    comboIndicateurs.setEditable(false);
    Soit interdire la saisie de valeurs qui ne sont pas dans la combo (faire une autocompletion par exemple).


    En revanche, ça ne peut pas bien fonctionner :
    Citation Envoyé par Neufunk Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            while (row < 165){
                Label label2 = new Label (cell,sheet902.getRow(row).getCell(1).toString());
                indicList.add(label2);
                row++;
            }
    Non, là l'index, c'est row, pas cell, donc new Label(row, sheet902.getRow(row).getCell(1).toString();... c'est les indices de lignes qu'il faut faire correspondre avec les indicateurs.
    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.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut
    Au temps pour moi, apparemment, à partir de la ligne où je fais intervenir le classeur Excel, le programme ne veut plus rien exécuter.
    Tout semble OK lorsque je navigue dans le programme, mais si je fais ceci, j'ai bien TEST qui s'affiche à l'ouverture de ma fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     System.out.print("TEST");
    Workbook wb = WorkbookFactory.create(new File("C:/FILEPATH"));
    Si je fais ceci par contre, ça ne print pas à l'ouverture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbook wb = WorkbookFactory.create(new File("C:/FILEPATH"));
    System.out.print("TEST");
    Ça explique pourquoi je n'arrive absolument pas à écouter les Combo et à sortir le résultat.

    Par contre, j'ai à chaque fois ces messages d'erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at com.asdnamur.statistiques.Indicateur.<init>(Indicateur.java:83)
    	at com.asdnamur.statistiques.HomePage$4.actionPerformed(HomePage.java:90) <4 internal calls>
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) <31 internal calls>
    Il semble que ce soit dû aux cellules vides du classeur. Je vais devoir trouver un moyen de régler ce problème, puisque apparemment il empêche la suite du code de fonctionner correctement.

    En tout cas je te remercie énormément pour ton temps, je garde ce sujet sous le coude pour le moment où j'aurai réussi à résoudre ces erreurs.

  8. #8
    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 Neufunk Voir le message
    Au temps pour moi, apparemment, à partir de la ligne où je fais intervenir le classeur Excel, le programme ne veut plus rien exécuter.
    Tout semble OK lorsque je navigue dans le programme, mais si je fais ceci, j'ai bien TEST qui s'affiche à l'ouverture de ma fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     System.out.print("TEST");
    Workbook wb = WorkbookFactory.create(new File("C:/FILEPATH"));
    Si je fais ceci par contre, ça ne print pas à l'ouverture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbook wb = WorkbookFactory.create(new File("C:/FILEPATH"));
    System.out.print("TEST");
    Mais c'est le nom de ton fichier Excel ça ? Ça se peut, mais ça ressemble plutôt à un nom de dossier, un chemin de fichier Excel étant plutôt avec une extension après (genre .xlsx ou .xls).

    Citation Envoyé par Neufunk Voir le message
    Il semble que ce soit dû aux cellules vides du classeur. Je vais devoir trouver un moyen de régler ce problème, puisque apparemment il empêche la suite du code de fonctionner correctement.
    J'avais donné dans un autre post un moyen de lire le contenu d'une cellule sous forme de String, quelque soit son contenu (ça renvoit null, si la cellule est vide (soit de type BLANK), mais il se peut également que la ligne ou la cellule n'existe pas (dans ce cas l'instance de Row est null, ou l'instance de Cell est null).

    Il faudra donc faire quelque chose commen çà
    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
    public class ExcelUtils {
     
         public static Row getRow(Sheet sheet, int rowIndex) {
                   return sheet.getRow(rowIndex);
         }
         public static Cell getCell(Sheet sheet, int rowIndex, int cellIndex) {
                   Row row = getRow(sheet, rowIndex);
                   if ( row!=null ) {
                        return row.getCell(cellIndex);
                   }
                   return null;
         }
         public static String readAsString(Sheet sheet,  int rowIndex, int cellIndex) {
                   Cell cell = getCell(sheet, rowIndex, cellIndex);
                   if ( cell!=null ) {
                        return readAsString(cell);
                   }
                   return null;
         }
          public static String readAsString(Cell cell) {
                /** ... voir autre discussion ... **/
          }
          private static boolean nullOrEmpty(String s) {
                 return s==null || s.trim().isEmpty() || "'".equals(s); // le dernier cas est un truc qui fait que la cellule est apparait vide (mais n'est pas blank)
          }
     
          // pour les autres méthodes (manquantes dans l'exemple) je te laisse voir comment tu veux les implémenter - toutefois, si tu en as besoin, je peux aussi te donner les indications pour lire le contenu d'une cellule dans le format d'affichage dans Excel (telles qu'elles apparaissent à l'utilisateur qui manipule le fichier dans Excel).
     
    }
    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.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut
    Non non, du tout pour le fichier Excel, mais comme le chemin passe par plein de dossier nominatif, etc, je remplace pour poster sur le net

    Par contre je n'arrive pas à résoudre ces NullPointerException, j'y suis depuis 7h30 et vraiment rien n'y fait, je suis simplement pas assez calé pour résoudre ça, et copier du code bêtement sur le net ne m'aide pas, ne saisissant qu'à moitié à quoi il sert, ni comment l'intégrer à ce que j'ai déjà.

    J'ai alors changer l'ordre d’exécution du code (écoute des Combos avant de rechercher les cellules à mettre dedans) pour tout de même arriver à ce qu'une des Combo me affiche le résultat dans un TextField. L'autre combo (Row, comboIndicateur) m'envoie plein d'exceptions dés que j'y touche, mais ça marche tout de même.

    Voici donc ce que j'ai en ce moment :

    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
     
    package ...
     
    import ...
     
    public class Indicateur {  
     
        Vector<String> indicList = new Vector<String>();
        Vector<String> periodList = new Vector<String>();
        JComboBox<String> comboIndicateurs = new JComboBox<String>(indicList);
        JLabel title3 = new JLabel("Période : ");
        JComboBox<String> comboPeriod = new JComboBox<>(periodList);
        JTextField tResult = new JTextField(20);
        private Map<String, Integer> periodMap = new HashMap<>();
        private Map<String, Integer> indicMap = new HashMap<>();
     
      public Indicateur() throws IOException, InvalidFormatException {
     
    /** ... **/
     
     // Initialisation du Workbook avec fichier EXCEL
            Workbook wb = WorkbookFactory.create(new File("FILEPATH"));
            Sheet sheet902;
            sheet902 = wb.getSheetAt(0);
     
            // ActionListener sur les Combo
            comboPeriod.addActionListener(e -> {
                int cell = periodMap.get(comboPeriod.getSelectedItem());
                int row = indicMap.get(comboIndicateurs.getSelectedItem());
                System.out.println("row: " + row + ", cell: " + cell);
                tResult.setText(sheet902.getRow(row).getCell(cell).toString());
            });
     
            comboIndicateurs.addActionListener(e -> {
                int cell = periodMap.get(comboPeriod.getSelectedItem());
                int row = indicMap.get(comboIndicateurs.getSelectedItem());
                System.out.println("row: " + row + ", cell: " + cell);
                tResult.setText(sheet902.getRow(row).getCell(cell).toString());
            });
     
                    // Boucles pour récupérer les infos nécessaires + mise en MAP pour récupérer le résultat
                    int rowTab = 5;
                    int cellTab = 3;
                    while (cellTab < 16) {
                        String label = sheet902.getRow(1).getCell(cellTab).toString();
                        periodList.add(label);
                        periodMap.put(label, cellTab);
                        cellTab++;
                    }
                    while (rowTab < 165) {
                        String label2 = sheet902.getRow(rowTab).getCell(1).toString();
                        indicList.add(label2);
                        indicMap.put(label2, rowTab);
                        rowTab++;
                    }
                    System.out.println("Suite de l'exécution test"); // -> Ne print pas
                }
            }
        }
    }
    Par contre ce qui m'ennuie, encore plus que ces exceptions, c'est que le TextField tResult "me donne la formule contenue dans la ccellule, et non le résultat. Les résultat étant calculé par Excel et mis en cache à chaque ouverture/fermeture, il y a apparemment possibilité de récupérer le cache de la cellule et non pas son contenu. Ce code à l'air de fonctionner pour plusieurs personnes, mais impossible de l'intégrer, je ne vois vraiment pas où ni comment l'adapter. Aurais-tu une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     for(Cell cell : row) {
         if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
            System.out.println("Formula is " + cell.getCellFormula());
            switch(cell.getCachedFormulaResultType()) {
                case Cell.CELL_TYPE_NUMERIC:
                    System.out.println("Last evaluated as: " + cell.getNumericCellValue());
                    break;
                case Cell.CELL_TYPE_STRING:
                    System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                    break;
            }
         }
     }
    Merci d'avance, je suis désolé pour ces questions incessantes, s'attaquer à un fichier Excel était peut-être déjà un peu beaucoup pour moi, mais j'en avais vraiment besoin et j'imagine qu'il faut bien apprendre un jour où l'autre.

  10. #10
    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 Neufunk Voir le message
    Non non, du tout pour le fichier Excel, mais comme le chemin passe par plein de dossier nominatif, etc, je remplace pour poster sur le net
    Utilise alors plutôt une variable quand tu postes le code, parce qu'avec une chaîne de caractères, on pense naturellement que l'erreur est là.

    Citation Envoyé par Neufunk Voir le message
    Par contre je n'arrive pas à résoudre ces NullPointerException, j'y suis depuis 7h30 et vraiment rien n'y fait, je suis simplement pas assez calé pour résoudre ça, et copier du code bêtement sur le net ne m'aide pas, ne saisissant qu'à moitié à quoi il sert, ni comment l'intégrer à ce que j'ai déjà.
    Montre-nous la stacktrace exacte, ainsi que le code, en nous précisant la ligne concernée (il peut y avoir des décalages entre ton code et celui posté, il suffit de nous dire la ligne "n" est à la ligne "m" dans le post). Sans ça difficile de te guider.
    De ton côté, utilise le mode debug en pas à pas, et/ou des traces.

    Par contre ce qui m'ennuie, encore plus que ces exceptions, c'est que le TextField tResult "me donne la formule contenue dans la ccellule, et non le résultat. Les résultat étant calculé par Excel et mis en cache à chaque ouverture/fermeture, il y a apparemment possibilité de récupérer le cache de la cellule et non pas son contenu. Ce code à l'air de fonctionner pour plusieurs personnes, mais impossible de l'intégrer, je ne vois vraiment pas où ni comment l'adapter. Aurais-tu une idée ?
    Dans le code de lecture que je t'ai donné, il y a une indication de comment évaluer la formule (pour la valeur en cache, c'est problématique: déjà comment être sûr que les valeurs sont bien à jour, donc il faut éventuellement réévaluer (wb.getCreationHelper().createFormulaEvaluator().evaluateAll(), et pour avoir essayé, c'est horriblement lent, donc je préfère passer par l'évaluation directe (au moins je ne rééavalue que ce que je lis))) :

    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
    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();
    	}
    j'utilise un contexte pour éviter d'avoir à regénérer FormulaEvaluator, DataFormatter etc, mais pour l'obtenir, il suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final CreationHelper creationHelper = workbook.getCreationHelper();
    /*FormulaEvaluator*/formulaEvaluator = creationHelper.createFormulaEvaluator();
    // au besoin, si tu veux la valeur exacte telle qu'elle est vue dans Excel :
    /*DataFormatter*/dataFormatter = new DataFormatter( locale /* une locale, par exemple Locale.getDefault()*/);
    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. Importer Feuil Excel dans Access
    Par beurnoir dans le forum Access
    Réponses: 4
    Dernier message: 21/10/2009, 16h46
  2. Import feuille Excel dans MySql ?
    Par loady dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 11/08/2006, 14h39
  3. Importation fichier Excel dans table Access
    Par kemasse dans le forum Access
    Réponses: 2
    Dernier message: 27/06/2006, 15h12
  4. problème pour importer données excel dans Access
    Par sarah67 dans le forum Access
    Réponses: 8
    Dernier message: 20/02/2006, 08h17
  5. Importer Feuil Excel dans Access
    Par beurnoir dans le forum Access
    Réponses: 2
    Dernier message: 27/10/2005, 14h13

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