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 :

Afficher une feuille excel à partir d'une ligne spécifique


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Par défaut Afficher une feuille excel à partir d'une ligne spécifique
    Salut à tous,

    Comme l'intitulé le dit : je voudrai pouvoir commencer la lecture d'une feuille Excel selon la première qui à le mot "abs".
    J'ai essayer de le faire de cette façon :
    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
    public JTable createJTableWithExcel(Sheet sheet) {
    		// Create new table
    		JTable table = new JTable();
    		// Reading the excel file
    		// Count the line number
    		int nbRows = sheet.getLastRowNum();
    		// Count the column number
    		int nbColumns = numberMaxColumn(sheet);
    		/*
    		 * System.out.println("In the sheet " + sheet.getSheetName() +
    		 * " there are " + nbRows + " lines and " + nbColumns + " columns");
    		 */
    		// Create new object array
    		Object[][] obj = new Object[nbRows][nbColumns];
    
    		// Array header
    		String[] title = new String[nbColumns];
    		// Browsing the sheet and retrieves the lines one by one
    		for (int rowContent = 0; rowContent < nbRows; rowContent++) {
    			row = sheet.getRow(rowContent);
    
    			// Browsing the line and retrieves the columns
    			if (row != null) {
    				for (int columnContent = 0; columnContent < nbColumns; columnContent++) {
    					// Retrieves the cell and this value but begging at "abs"
    					cell = row.getCell((short) columnContent);
    					if (cell.getStringCellValue() == "abs") {
    						//for hide the first column begin in the second column, so index 1
    						columnContent = 1;
    						//begin in row index
    						rowContent = cell.getRowIndex();
    						
    						Object value = contentCell(cell);
    						obj[rowContent][columnContent] = value;
    	
    						// the title
    						title[columnContent] = (String) obj[0][columnContent];
    					}
    				}
    			}
    		}
    		table.setModel(new DefaultTableModel(obj, title));
    		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    
    		return table;
    	}
    Apparemment on ne peux pas utiliser cell.getStringCellValue() dans mon cas car il est null.

    ► Merci pour vos aides

  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
    Déjà, pour commencer, toujours tester l'égalité des chaînes avec equals() (== c'est pour l'identité).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (cell.getStringCellValue() == "abs") {
    Ensuite, dans une cellule, il peut y avoir des données de types différents : toujours tester le type et lire le contenu en fonction.

    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
    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_STRING:
                        ... = cell.getRichStringCellValue().getString();
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        if (DateUtil.isCellDateFormatted(cell)) {
                            ... = cell.getDateCellValue();
                        } else {
                           ... =  cell.getNumericCellValue();
                        }
                        break;
                    case Cell.CELL_TYPE_BOOLEAN:
                       ... =  cell.getBooleanCellValue();
                        break;
                    case Cell.CELL_TYPE_FORMULA:
                        ... = cell.getCellFormula(); // ou voir la documentation pour évaluer la formule au besoin
                        break;
                    default: 
                }
            }
    De plus, d'après ta description, on devrait lire toutes les lignes dès qu'on trouve "abs", alors que ton code lit toutes les lignes qui contiennent le mot "abs", ce qui n'est pas du tout la même chose. Pour faire ça il faut utiliser par exemple un flag :

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    flag = faux
    pour toutes les lignes
        si la ligne contient le mot abs
            flag = vrai
        fin si
        si flag est vrai 
           récupérer la ligne
        fin si
    fin pour

    Ou alors faire 2 boucles : une première pour chercher la ligne avec "abs" (elle incrémente l'index de ligne), et une seconde qui copie toutes les lignes à partir de l'index de ligne déterminé dans la première boucle.

    Enfin, attention, ton tableau ne va pas contenir uniquement les lignes que tu lis : il va contenir des valeurs null pour toutes les lignes non lues, et ce, aux mêmes positions de lignes (donc un tableau avec des trous que tu ne connaîtras pas (il faudra tester toutes les cellules d'une ligne et si elles sont toutes null, alors la ligne doit être ignorée).
    Vraiment pas très pratique et source de problèmes. Soit tu utilises un compteur que tu incrémentes à chaque nouvelle ligne (le compteur étant le nombre de lignes utiles dans le tableau), soit tu utilises une liste pour cumuler les lignes, et tu la convertis éventuellement en tableau ensuite.
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Par défaut
    Je vois l'idée mais pas simple à mettre en pratique, en fait c'est surtout savoir quel est la syntaxe pour dire : String abs = la ligne qui contient "abs";
    A savoir que dans ma premier boucle, celle qui balaye les lignes contient déjà :
    row = sheet.getRow(rowContent); afin de récupérer toutes les lignes.
    Et dans ma seconde ligne à un moment donner j'ai également :
    Object value = contentCell(cell);
    la méthode contentCell() récupère le format de la cellule tel que tu me la donner au dessus.

    A partir delà, comment faire ceci :
    ► une première pour chercher la ligne avec "abs" (elle incrémente l'index de ligne),
    donc row récupère toutes les lignes et là je dois chercher "abs" mais comment ?

    ► et une seconde qui copie toutes les lignes à partir de l'index de ligne déterminé dans la première boucle.
    donc je suppose faire un : for (Object r : row) { String copy = r }

    ► Soit tu utilises un compteur que tu incrémentes à chaque nouvelle ligne (le compteur étant le nombre de lignes utiles dans le tableau),
    du-coup avec ce qu'il y a juste avant, ça déterminerait le conteur de lignes utiles non ?

  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
    Citation Envoyé par nadong94 Voir le message
    A partir delà, comment faire ceci :
    ► une première pour chercher la ligne avec "abs" (elle incrémente l'index de ligne),
    donc row récupère toutes les lignes et là je dois chercher "abs" mais comment ?
    Bah, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object value = contentCell(cell);
    if ( "abs".equals(value) ) {
       // la ligne contient une cellule de valeur "abs"
    }
    Soit dans une boucle
    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
     
    int rowIndex=0;
    for( ; rowIndex< nbRows; rowIndex++) {
     
        /*...*/
     
       Object value = contentCell(cell);
       if ( "abs".equals(value) ) {
          // la ligne contient une cellule de valeur "abs"
          break;
       }
     
    }
     
    // créer un tableau pour stocker les lignes de dimension nbRows-rowIndex.
     
    for(int i=0 ; rowIndex< nbRows; rowIndex++,i++) {
     
        // copie de la ligne d'index rowIndex dans le tableau à l'index i
     
     
    }
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Par défaut
    Le programme tourne en boucle, et n'affiche pas le premier System.out.println :
    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
     
    public JTable createJTableWithExcel(Sheet sheet) {
    		// Create new table
    		JTable table = new JTable();
    		// Reading the excel file
    		// Count the line number
    		int nbRows = sheet.getLastRowNum();
    		// Count the column number
    		int nbColumns = numberMaxColumn(sheet);
    		// Create new object array
    		Object[][] obj = new Object[nbRows][nbColumns];
     
    		// Array header
    		String[] header = new String[nbColumns];
    		int absIndex = 0;
    		// Browsing the sheet and retrieves the lines one by one
    		for (int rowContent = 0; rowContent < nbRows; rowContent++) {
    			row = sheet.getRow(rowContent);
     
    			// Browsing the line and retrieves the columns
    			if (row != null) {
    				for (int columnContent = 0; columnContent < nbColumns; columnContent++) {
    					// Retrieves the cell and this value but begging at "abs"
    					cell = row.getCell((short) columnContent);
    					//il affiche seulement 2 à l'infini
    					System.out.println("c : "+ columnContent);
    					Object value = contentCell(cell);
    					if ( "abs".equals(value) ) {
    						absIndex = cell.getRowIndex();
    						//il plante avant ceci
    						System.out.println("absIndex : "+ absIndex);
    						break;
    					}
    					//for hide the first column begin in the second column, so index 1
    					columnContent = 1;
    					//begin in abs index
    					rowContent = absIndex;
     
    					obj[rowContent][columnContent] = value;
     
    					// the title
    					for (int i = 0; i < table.getColumnCount(); i++)
    					{
    						TableColumn column1 = table.getTableHeader().getColumnModel().getColumn(columnContent);
    						System.out.println(i);
    						column1.setHeaderValue(header[i]);
    					}
    				}
    			}
    		}
    		table.setModel(new DefaultTableModel(obj, header));
    		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
     
    		return table;
    	}

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Par défaut
    Avec cette petite modification logique d'ailleurs il ne bogue plus mais il ne respecte pas la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Object value = contentCell(cell);
    if ( "abs".equals(value) ) {
    	absIndex = cell.getRowIndex();
    	System.out.println("absIndex : "+ absIndex);
    	//for hide the first column begin in the second column, so index 1
    	columnContent = 1;
    	//begin in abs index
    	rowContent = absIndex;
    	break;
    }
    obj[rowContent][columnContent] = value;
    je fait un :
    columnContent = 1; pour commencer à la deuxième colonne (chose qu'il ne fait pas)
    rowContent = absIndex; pour commencer à l'index de "abs" mais ça non plus il ne le fait pas

    J'ai du oublier quelque chose

  7. #7
    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
    1. Le programme tourne en boucle parce que :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      for (int columnContent = 0; columnContent< nbColumns; columnContent++) {
         /*...*/
         //for hide the first column begin in the second column, so index 1
         columnContent = 1;
      Et qu'il n'y a pas de "abs" dans la première colonne, et qu'il y a plus de 2 colonnes (columnContent est incrémenté en fin d'itération, donc passe à 2).

      Forcément, quand on modifie l'indice de boucle de manière à ce qu'il soit toujours hors condition de sortie, on ne sort pas de la boucle.


      De la même façon
      va
      • La première fois, s'il n'y a pas "abs" dans la première colonne de la première ligne, absIndex vaudra 0, donc rowContent repassera à 0, puis sera incrémenté, donc ça va boucler en gros sur la ligne 1, indéfiniment
      • Sinon, absIndex sera l'index de la ligne, donc en fin d'itération, sera la ligne suivante : si celle-ci ne contient pas de "abs", rowContent va repasser à absIndex (la ligne d'avant), puis on incrémentera, et donc on bouclera indéfiniment sur la ligne suivant la première ligne qui contient "abs"


    2. Le break ci-dessous
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      if ( "abs".equals(value) ) {
         absIndex = cell.getRowIndex();
         //il plante avant ceci
         System.out.println("absIndex : "+ absIndex);
         break;
      }
      sort de la boucle for (int columnContent = 0; columnContent < nbColumns; columnContent++) { : ça ne sert à rien, à part que la ligne qui contient "abs" ne sera pas sélectionnée, ou plutôt la fin de la ligne ne le sera pas (après la colonne qui contient "abs" y compris celle-ci)


    3. La boucle suivante est effectuée (si on break pas parce qu'on a "abs") avant d'affecter le tableau de données à la JTable, donc quand il n'y a pas encore de colonnes...
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
       
      // the title
      for (int i = 0; i < table.getColumnCount(); i++) {
          TableColumn column1 = table.getTableHeader().getColumnModel().getColumn(columnContent);
          System.out.println(i);
          column1.setHeaderValue(header[i]); 
      }
      Cela dit comme header[i] n'est pas affecté, même si ça fonctionnait, ça mettrait null dans tous les titres.
    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.

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 15/10/2007, 14h41
  2. Réponses: 1
    Dernier message: 05/03/2007, 20h10
  3. Réponses: 2
    Dernier message: 04/10/2006, 10h45
  4. [VBA]Renseigner une feuille excel à partir d'un site web
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/01/2006, 13h43
  5. Réponses: 5
    Dernier message: 05/07/2005, 20h25

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