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 :

Sélectionner une feuille d'un fichier Excel sélectionné via un FileChooser


Sujet :

Documents Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Sélectionner une feuille d'un fichier Excel sélectionné via un FileChooser
    Bonjour à tous,
    J'espère que le titre est assez clair, mais j'vais développer mon problème ci-dessous.

    J'ai un projet qui me demande de :
    1/ sélectionner n'importe quel fichier excel à partir d'une fenêtre de dialogue standard (type objet FSO)
    2/ sélectionner la feuille au choix de l'opérateur

    Pourquoi faire, me direz-vous éventuellement ?
    3/ récupérer de cette feuille le nom de la colonne contenant les informations qui intéressent l'opérateur (en fonction d'une liste évolutive de noms de colonnes, définie dans un fichier *.ini)
    4/ les informations qui sont intéressantes devront être décomposées en trois colonnes (préfixe, racine, suffixe). Ces trois colonnes seront positionnées en colonne A, B et C.


    Bon. Ayant un projet comme celui-ci à réaliser, je ne sais pas comment un programmeur expérimenté démarrerait (hormis la phase "Faire un organigramme de mon algorithme"), mais j'ai décidé de partir sur la doc d'Oracle en Java pour prendre un code qui me propose directement une fenêtre de dialogue standard, comme ceci :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    package test;
     
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
     
    import javax.swing.*;
    import javax.swing.SwingUtilities;
    import javax.swing.filechooser.*;
     
     
    @SuppressWarnings("serial")
    public class FileChooser extends JPanel implements ActionListener {
     
        static private final String newline = "\n";
        JButton openButton; //avant il y avait "saveButtoon" avec.
        JTextArea log;
        JFileChooser fc;
     
        public FileChooser() {
            super(new BorderLayout());
     
            log = new JTextArea(5,20);
            log.setMargin(new Insets(2,2,2,2));
            log.setEditable(false);
            JScrollPane logScrollPane = new JScrollPane(log);
     
            fc = new JFileChooser(); //créer un sélecteur de fichier.
     
     
            openButton = new JButton("Open a File...");
            openButton.addActionListener(this);
     
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(openButton);
     
            add(buttonPanel, BorderLayout.PAGE_START);
            add(logScrollPane, BorderLayout.CENTER);
        }
     
        public void actionPerformed(ActionEvent e) {
     
            if (e.getSource() == openButton) {
                int returnVal = fc.showOpenDialog(FileChooser.this);
     
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
     
                    log.append("Opening: " + file.getName() + "." + newline);
                } else {
                    log.append("Open command cancelled by user." + newline);
                }
                log.setCaretPosition(log.getDocument().getLength());
     
            } 
        }
     
        /** Returns an ImageIcon, or null if the path was invalid. */
        protected static ImageIcon createImageIcon(String path) {
            java.net.URL imgURL = FileChooser.class.getResource(path);
            if (imgURL != null) {
                return new ImageIcon(imgURL);
            } else {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
        }
     
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event dispatch thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("Ouvrir un fichier Excel");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //termine le processus lorsqu'on clique sur la croix rouge.
     
            frame.add(new FileChooser());
     
            frame.pack();
            frame.setVisible(true);
            frame.setLocationRelativeTo(null);
        }
     
        public static void main(String[] args) {
     
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
     
                    UIManager.put("swing.boldMetal", Boolean.FALSE); 
                    createAndShowGUI();
                }
            });
        }
    }
    Ce qui me donne ceci :

    Nom : FileChooserDemo2Metal.png
Affichages : 1626
Taille : 9,3 Ko

    Puis en cliquant sur "Open a file" :

    Nom : FileChooserOpenMetal.png
Affichages : 1847
Taille : 16,2 Ko


    A savoir que moi j'étais parti sur créer moi-même ma JFrame et on m'a expliqué que je n'allais pas ré-inventer le Java non plus, autant utiliser ce qui existe déjà...
    Bref. Outre le fait que je ne comprends que la moitié des éléments de ce code...

    J'aimerais savoir comment il est possible de faire en sorte que le programme, après avoir sélectionné le fichier .xls, demande à l'opérateur de sélectionner une feuille du classeur ?
    Et comment faire en sorte que l'opérateur ne puisse sélectionner que des fichiers .xls (et pas un .txt ou .png) ?

    Merci par avance de votre aide, j'suis perdu dans les méandres d'internet et de pages de codeurs qui proposent des choses HYPER COMPLIQUÉES qui ne sont pas du tout à ma portée, pour résoudre mon problème.

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut Une petite piste pour toi.
    Salut,

    J'ai une piste pour toi, déjà pour récupére le document tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File file = new File("NomDufichier"); //ici tu peux récuperer le nom choisie avec son chemin que tu obtiens avec ton chooser
     
    FileInputStream fis = new FileInputStream(file); //ici tu lis ce fichier
    pour la partie excel je te conseille ce tuto qui est très bien expliqué il te faudras sûrement une API.

    http://jmdoudoux.developpez.com/cour...tion-documents

    Voilà en expérant t'avoir un peu aidé

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonjour Jaythor, et merci de ta réponse !

    Je connais les deux lignes de commande que tu m'as mis ; hélas, mon cahier de charge demande précisément "Créer une application qui permette : 1/ De sélectionner n'importe quel fichier excel à partir d'une fenêtre de dialogue standard (type objet FSO), donc je suis obligé de passer par un code long et compliqué, je le crains x)

    En fait, pour mieux l'expliquer, il faut que l'utilisateur n'est pas besoin de rentrer dans le code pour exécuter le programme, cela doit agir comme si tu faisais "Ouvrir" sous Word.

    Je vais de ce pas lire la doc' que tu m'as envoyé pour l'utilisation d'un API, je t'en remercie o/

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut interface
    ok ^^

    Et pour ton interface si tu es assez à l'aise avec java tu peux essayer de voir pour passer vers javaFx depuis le JDK 8 c'est la bibliothèque qui succède swing. Je trouve personnellement le code moins charger et plus clair qu'avec swing le seul problème c'est qu'il demande un niveau technique légèrement plus élevé (mais c'est que mon avis ). Des notions du pattern MVC sont utiles voir nécessaires.

    Amuses-toi bien

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    ... tu m'as perdu là. JDK 8, pattern MVC, déjà que j'connaissais pas la bibliothèque swing avant de commencer ce programme

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut Quelques explications
    Ok pas de problème je vais t'expliqer quelques trucs .

    Alors JDK :

    => Java Developpement Kit : autrement dit c'est ce que tu as besoin pour dev en java (je prends des raccourcis mais c'est pas loin) on est actuellement à la version 8 donc JDK 8 CQFD

    https://fr.wikipedia.org/wiki/Java_Development_Kit



    MVC pattern :

    => Model View Controller (ou Modèle Vue Controlleur en français) est un modèle de conception d'application qui s'applique aux interfaces graphiques, le principe de ce modèle est de séparer les actions des utilisateurs avec les données globale de l'application.

    En outre un pattern (modèle conception) est une logique de développement, un ensemble de bonnes pratiques utilisées dans des cas spécifiques, c'est comme suivre un patron pour les couturiers tu vois ?

    https://fr.wikipedia.org/wiki/Mod%C3...ontr%C3%B4leur


    Donc pour le coup reste sur swing ^^



    En espérant t'avoir éclairé un petit peu plus

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Sans vouloir te faire peur... j'ai la version 1.6.0_25 sur ce PC (où je n'ai pas les droits d'admin yeaaah) apparemment, c'est grave docteur ?

    Bon, eh bien merci beaucoup pour ces débuts de piste, j'vais lire tout ça de suite, et si je bloque je sais par où repasser !

  8. #8
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Pour pouvoir traiter des fichiers excel il te faut utiliser la bibliothèque POI de Apache. Son utilisation est plutôt simple.

    Une fois ton fichier récupéré, il te faut créer ce qu'on appelle un Workbook. C'est l'objet Java qui représente un fichier Excel dans la bibliothèque POI.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Workbook workbook = new WorkbookFactory.create( selectedFile ); // selectedFile est le fichier récupéré via ton Filechooser
    De là tu as accès à tout un tas d'informations sur ton fichier. workbook.getNumberOfSheets() te donnera le nombre te feuille par exemple. Et Sheet sheet= workbook.getSheetAt( 0 ) te retournera la première feuille du classeur.

    Row row = sheet.getRow( i ) te retourne la Ième ligne et ainsi de suite.. Tout est décris dans la doc.

    Bref il n'y a rien de bien compliqué à récupérer toutes les informations de ton fichier Excel. La vrai question c'est de savoir comment tu souhaites présenter tout ça dans une interface pour l'utilisateur de ton programme.

    - Comment présenter le nombre de feuilles disponible (un edit? un combo?)
    - Comment présenter la liste des colonnes disponible ?
    - Comment présenter les données de ces colonnes ?

    etc.

    Mais commence déjà à t'habituer un peu à manipuler cette librairie cela te permettra de nourrir un peu cette réflexion et reviens plus tard si tu as des soucis

    Cdt.

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Shidate Kunan Voir le message
    Sans vouloir te faire peur... j'ai la version 1.6.0_25 sur ce PC
    1.6 = JDK 6 (version 6)

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Bon alors, le passage a JavaFX n'est pas vraiment une obligation et ne change rien au fond de l’exercice (juste que ca permet d'apprendre autre chose que Swing).
    Ensuite :

    1. Que ce soit avec le JFileChooser de Swing ou le FileChooser de JavaFX il est possible de spécifier des filtres et des extensions de fichiers pour faire une boite de dialogue qui permette de filtrer entre plusieurs types de format XL (ex : Excel 97-2003 Workbook (.xls), Excel Workbook (.xlsx), etc.)
      Voir :
    2. Ensuite il faudra présenter a l'utilisateur une boite de dialogue pour lui demander la feuille voir :

      Il sera bon quand même d'utiliser Apache POI pour connaitre par exemple le nombre de feuilles existante dans le document (toujours utile si on utilise un contrôle de type JSpinner (Swing) / Spinner (JavaFX) pour permettre a l'utilisateur de saisir son numéro de feuille. De plus si l'utilisateur doit également choisir le nom de la colonne alors il faudra que la boite de dialogue (ou son contenu) extrait ces noms lorsque l'utilisateur change le numéro de la feuille active. Apache POI permettra de faire cela.
    3. Utiliser Apache POI pour la suite.
    4. Idem.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    Me revoilà, j'avais un autre projet en même temps, du coup je me reconsacre pleinement à celui-ci.

    @bouye : j'ai pu appliquer ce que tu m'as suggéré, ça limite plus ou moins les dossiers/fichiers apparents dans la JFrame, mais il reste des dossiers qui ne contiennent pas de .xls

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     FileNameExtensionFilter filter = new FileNameExtensionFilter("XLS", "xls");
            fc.setFileFilter(filter);
            int returnVal = fc.showOpenDialog(getParent());
            if(returnVal == JFileChooser.APPROVE_OPTION) {
                System.out.println("Vous avez sélectionné le fichier : " + fc.getSelectedFile().getName());
            }

    @Nico02 : j'ai installé la bibliothèque POI dans le projet comme demandé, seulement je ne sais pas où mettre la commande que tu m'as donné.
    J'ai essayé quelques petites choses, dont ce que tu peux voir ci-dessus, avec les quatre variantes qu'on me propose.

    Nom : Workbook-issues.png
Affichages : 1584
Taille : 24,2 Ko

    Le souci est que je ne sais pas lequel choisir, et cliquer au hasard continuellement pour corriger les fautes ne rime à rien, alors j'en reviens à vous demander comment résoudre ce problème

    - Comment présenter le nombre de feuilles disponible (un edit? un combo?)
    - Comment présenter la liste des colonnes disponible ?
    - Comment présenter les données de ces colonnes ?
    - Aucune idée, je présume qu'en utilisant simplement "workbook.getNumberOfSheets()", je créerai ensuite une fenêtre d'information qui indiquera à l'utilisateur le nombre de feuilles existantes.
    - La liste des colonnes se fait directement via un fichier .ini que l'utilisateur pourra ouvrir s'il le désire pour éditer le listing des colonnes qui devront être traitées.
    - Les données seront soumis à un test pour voir si elle corresponde à une certaine norme de nommage (ce sont des listing de nom de fils conducteurs), et si elles correspondent, elles seront surlignées/mis en gras dans la colonne ; ainsi, lorsque le programme aura fini de s'exécuter, le fichier Excel s'ouvrirait et les données intéressantes seraient bien mis en évidence !


    Par ailleurs, je remarque que j'ai de gros soucis de compréhension théorique, très (très très très) probablement dû au fait que j'ai été jeté dans la programmation en Java sans connaissances aucunes, et malgré toute la doc que j'ai pu lire, il y a encore des tas de choses basiques, que je ne comprends pas.
    Du coup, j'ai essayé d'analyser le code en entier, et il y a certains points qui ressortent que je ne parviens pas à comprendre :

    Ligne 48 et 59-60 du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    openButton.addActionListener(this);
    [...]
     if (e.getSource() == openButton) {
                int returnVal = fc.showOpenDialog(FileChooser.this);
    Quel est le lien entre ces deux ".this" ? A quoi ça sert concrètement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import java.awt.*;
    import java.awt.event.*;
     
    import javax.swing.*;
    import javax.swing.filechooser.*;
    J'ai cru lire qu'il ne valait mieux pas mélanger awt et swing dans un programme, et pourtant la doc Oracle qui est la base de mon programme était comme celà.
    Il y a des risques de complication par la suite ? Ou ce n'est pas grave ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class FileChooser extends JPanel implements ActionListener {
    Il ne doit y avoir qu'une seule public class dans mon programme, ou il peut y en avoir plusieurs ?
    Si oui, quelle est l'utilité, surtout dans mon cas ?
    Sur la même lignée, je ne comprends pas la différence entre "public", "public void", "public static void main" et "public static void" (les trois étant utilisés dans mon programme) : pourquoi utiliser l'un et pas l'autre, dans tel ou tel cas ?

    Je sais que ça fait beaucoup de questions, mais les explications que j'ai pu lire ne sont pas claires :/
    Merci par avance pour vos réponses, et votre patience !


    Programme complet :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
     
    import javax.swing.*;
    import javax.swing.filechooser.*;
     
    import org.apache.poi.hssf.model.Workbook;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    //import org.apache.poi.ss.usermodel.Cell;
    //import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
     
     
     
    @SuppressWarnings({ "serial", "unused" })
    public class FileChooser extends JPanel implements ActionListener {
     
        static private final String newline = "\n";
        JButton openButton; //avant il y avait "saveButtoon" avec.
        JTextArea log;
        JFileChooser fc;
     
        public FileChooser(JFrame frame) {
            super(new BorderLayout());
     
            //Créer le journal d'abord, car les paramètres suivants doivent se référer à lui.
            log = new JTextArea(5,20);
            log.setMargin(new Insets(5,5,5,5));
            log.setEditable(false);
            JScrollPane logScrollPane = new JScrollPane(log); //crée les barres de scroll horizontale et verticale
     
            fc = new JFileChooser(); //créer un sélecteur de fichier.
            /*fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
             *fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
             * Tentative pour ne faire apparaitre QUE les fichiers et pas les dossiers.
             * */
     
            FileNameExtensionFilter filter = new FileNameExtensionFilter("XLS", "xls");
            fc.setFileFilter(filter);
            int returnVal = fc.showOpenDialog(getParent());
            if(returnVal == JFileChooser.APPROVE_OPTION) {
                System.out.println("Vous avez sélectionné le fichier : " + fc.getSelectedFile().getName());
            }
     
            openButton = new JButton("Ouvrir un fichier...");
            openButton.addActionListener(this);
     
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(openButton);
     
            add(buttonPanel, BorderLayout.PAGE_START);
            add(logScrollPane, BorderLayout.CENTER);
        }
     
        public void actionPerformed(ActionEvent e) {
     
            if (e.getSource() == openButton) {
                int returnVal = fc.showOpenDialog(FileChooser.this);
     
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
     
                    log.append("Opening: " + file.getName() + "." + newline);
                } else {
                    log.append("Open command cancelled by user." + newline);
                }
                log.setCaretPosition(log.getDocument().getLength());
     
            } 
        }
     
        public static void main(String[] args) {
     
            JFrame frame = new JFrame("Ouvrir un fichier...");
     
            frame.getContentPane( ).add(new FileChooser(frame));
            frame.pack( );
     
            frame.setVisible(true);
            frame.setLocationRelativeTo(null);

  12. #12
    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 Shidate Kunan Voir le message
    - Aucune idée, je présume qu'en utilisant simplement "workbook.getNumberOfSheets()", je créerai ensuite une fenêtre d'information qui indiquera à l'utilisateur le nombre de feuilles existantes.
    - La liste des colonnes se fait directement via un fichier .ini que l'utilisateur pourra ouvrir s'il le désire pour éditer le listing des colonnes qui devront être traitées.
    - Les données seront soumis à un test pour voir si elle corresponde à une certaine norme de nommage (ce sont des listing de nom de fils conducteurs), et si elles correspondent, elles seront surlignées/mis en gras dans la colonne ; ainsi, lorsque le programme aura fini de s'exécuter, le fichier Excel s'ouvrirait et les données intéressantes seraient bien mis en évidence !
    Tu peux mettre un composant directement dans le JFileChooser (avec setAccessory()), qui liste les feuilles qui valident tes conditions (en redéfinissant approveSelection() tu peux même empêcher la sélection si aucune feuille n'est sélectionnée).
    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.

  13. #13
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    openButton.addActionListener(this);
    [...]
     if (e.getSource() == openButton) {
                int returnVal = fc.showOpenDialog(FileChooser.this);
    L'utilisation du mot clé this permet de faire référence à l'objet courant. Dans le cas de openButton.addActionListener(this), le paramètre de la méthode addActionListener() est de type ActionListener. Or comme ta classe FileChooser implémente justement cette interface. Du coup l'utilisation de this permet de passer l'instance courante de ta classe FileChooser en paramètre à cette méthode. C'est un moyen pour ton instance peut s'auto-désigné (ce qui est très pratique si tu peux avoir plusieurs instances avec des paramètres différents).

    Pour fc.showOpenDialog(FileChooser.this); c'est le même principe mais ça s'applique dans le cas où une classe interne à besoin de référencé l'instance de la classe qui l'englobe.

    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
     
    class Person{
        String name;
     
        public void setName(String name){
            this.name = name;
        }
     
        class Displayer {
            String getPersonName() { 
                return Person.this.name; 
            }
     
        }
    }
    Ici la classe interne Displayer fait référence à l’instance courante de la classe Person.

    J'ai cru lire qu'il ne valait mieux pas mélanger awt et swing dans un programme, et pourtant la doc Oracle qui est la base de mon programme était comme celà.
    Il ne faut pas mélanger les composants graphique effectivement, or les Events eux appartiennent au package awt et tu n'y peux rien. Par contre pour le pourquoi du comment, va falloir demander à d'autres

    Il ne doit y avoir qu'une seule public class dans mon programme, ou il peut y en avoir plusieurs ?
    Tu peux en avoir autant que tu veux. L'idée sera de toujours donner la visibilité minimum à une classe (ou un attribut). Tu auras d'ailleurs beaucoup de mal à faire une appli avec une seule classe publique

    Sur la même lignée, je ne comprends pas la différence entre "public", "public void", "public static void main" et "public static void" (les trois étant utilisés dans mon programme) : pourquoi utiliser l'un et pas l'autre, dans tel ou tel cas ?
    Tout simplement car ce n'est pas la même chose !

    Chaque mot clé à sa propre signification. Mais quand on déclare des méthode/attributs, on fait une combinaison de ces mot clés pour donner un sens particulier

    Le mot clé public fait référence à la visibilité de ta méthode/attribut.
    Il existe public, private,package-private et protected. Je te laisse faire quelques recherches dessus pour plus d'infos.

    Le mot clé void fait référence au type de retour de ta méthode. void signifie que la méthode ne renvoie aucune donnée (dans d'autres langage on appelle ça une procédure). Ici tu peux avoir n'importe quel objet : void, String, Integer, MonObjet...

    Le mot clé static lui permet de définir si une méthode/attribut appartient à la classe elle même où si elle appartient à une instance de cette classe.

    La différence c'est que les méthode/attribut de classe n'on pas besoin d'instance pour être utilisés.

    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
     
    class Test{
     
    	public static int STATIC_INT = 2; // attribut de classe
     
    	int x; // attribut de d'instance
    	int y;
     
           // constructeur
    	public Test( int x, int y){ 
    		this.x = x; this.y = y; 
    	}
     
            // methode de classe
    	public static int additionStatic( int a, int b ){ return a + b };
     
            // méthode d'instance
    	public int addition(){
    		return x + y;
    	}
    	......
    	System.out.println( Test.additionStatic( 1, 2 ) ); // OK
     
    	System.out.println( Test.addition()  ); // NOK, il te faut une instance de la classe Test pour utilisé cette méthode
     
    	Test instance = new Test( 1, 2 );
    	System.out.println( instance.addtion() ); // OK
     
    	System.out.println( Test.STATIC_INT ); // OK car STATIC_INT appartient à la classe
     
    	System.out.println( Test.x ); // NOK car x n'appartient PAS à la classe mais à une instance
    	System.out.println( instance.x ); // OK on affiche la valeur x de l'instance
    }
    C'est la combinaison de tout ces mot clés vont permettre de définir des comportement spécifiques.

    public void foo() est une méthode d'instance publique qui ne retourne aucune valeur.
    private static String foo() est une méthode privée (inutilisable en dehors de cette classe) de classe qui retourne une String
    public MonObjet foo() etc...

    Le seul cas particulier c'est :

    public LeNomDeMaClasse() qui lui représente le constructeur de ton classe (elle ne retourne rien mais on ne met pas le mot void). Les règles de visibilités s'appliquent par contre de la même manière.

    Il y aurait encore pleins de choses à dire sur tout ça mais je te laisse chercher un peu de ton coté

    N'hésite pas si tu as d'autres questions.

    Cdt.

    Ps : Le lien que tu donnes ne fonctionne pas, donc je ne peux pas te répondre là dessus

  14. #14
    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 Nico02 Voir le message
    Ps : Le lien que tu donnes ne fonctionne pas, donc je ne peux pas te répondre là dessus
    Tu parles de ce lien ?
    Citation Envoyé par Shidate Kunan Voir le message
    La pièce jointe avait été supprimée : je l'ai rétablie dans le message.

    @Shidate Kunan,
    La réponse à cette question est que tu fais new WorkbookFactory.create(...), ce qui perturbe Eclipse qui ne peut te donner le bon Quick Fix. create() est une méthode static de la classe WorkbookFactory. On ne fait de new dans ce cas là, on appelle directement la méthode : Workbook workbook = WorkbookFactory.create( selectedFile );. En plus, ça n'a aucun sens en Java de faire new suivi d'une référence d'instance, or ici le new s'applique au résultat de l'appel de create(), ce qu'on veut mettre dans la variable workbook. Comme en plus, tu n'as probablement pas fait l'import nécessaire, Eclipse ne sait pas ce que c'est que WorkbookFactory. En plus, tu fais référence à une variable selectedFile (alors que tu passes un paramètre que tu n'utilises pas) qui est déclarée où ? C'est ce selectedFile qui devrait être passé en paramètre, non ?
    Tous ces problèmes combinés empêchent donc Eclipse de te dire "supprime le new, et ajoutes l'import de org.apache.poi.ss.usermodel.WorkbookFactory).
    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.

  15. #15
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Tu parles de ce lien ?
    La pièce jointe avait été supprimée : je l'ai rétablie dans le message.
    Exact. Mais je n'ai pas grand chose à rajouter du coup

Discussions similaires

  1. [XL-2007] importer une feuille d'un fichier Excel
    Par dodo69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/06/2021, 15h40
  2. Réponses: 12
    Dernier message: 22/03/2010, 14h07
  3. Réponses: 12
    Dernier message: 27/01/2010, 08h59
  4. Réponses: 2
    Dernier message: 02/12/2008, 13h15
  5. renommer une feuille d'un fichier excel depuis Access en VBA
    Par alexkickstand dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/08/2007, 17h55

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