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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    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 : 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 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
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    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 : 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,

    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
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    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 : 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
    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.

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