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] Appeler une cellule par son nom


Sujet :

Documents Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut [POI] Appeler une cellule par son nom
    Bonjour,

    J'utilise POI pour lire et générer des fichiers Excel, et je voudrais savoir s'il est possible de récupérer une cellule d'Excel par son nom ?

    Je rempli un fichier réultat à partir d'un fichier type, qui contient les entêtes des colonnes d'un tableau.

    J'accède à une cellule par son indice de ligne et de colonne en dur dans mon code Java, mais si l'utilsateur décide de changer le fichier type (déplacer le tableau que je dois remplir) mon affichage risque d'être décalé ! Ce qui serait un peu embettant !

    Quelqu'un aurait une idée ?

    Merci

  2. #2
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    bonjour
    j'aime beaucoup poi (j'ai deux copain qui participe au develope de cette api) et j'ai souvens servi de tester

    tu veux acceder a une cell par son nom. mais je peut te demander comment tu donne un nom a une cell (HSSFCell)?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut
    Je parlais de nommer la cellule dans la feuille Excel !

    Par défaut elle s'appelle A1 par exemple, je la renomme en "libelle".

    Après, dans mon code j'aimerai faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
     
      /* HSSFCell c =  sheet.getCell("libelle"); */
    je ne sais pas si il y aurait une façon de faire ca, mais peut être que ca n'existe pas !

  4. #4
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    pour recuperer une cellule, on la recupere sur une Row pas sur une Sheet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
     
    HSSFRow row = sheet.getRow(0);
    HSSFCell cell = row.getCell((short)0);
     
    cell.setValue....
    les cellule n'ont pas de nom. juste des numero

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut
    C'est bien ce que je craignais !
    Merci

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 221
    Points
    221
    Par défaut
    Citation Envoyé par bbclone Voir le message
    les cellule n'ont pas de nom. juste des numero
    Je me permet de revenir sur ce topic avec un exemple :


    La case B3 s'appelle somme et il serait intéressant de pouvoir l'appeler sans passer par getRow(i).getCell(j). (si des lignes ont été insérées ci et là par exemeple)

    Je ne trouve ni de setCellName(String) ni de getCell(String)

    Merci.

    Captain Mich

  7. #7
    Membre régulier
    Profil pro
    Chef de projets
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 89
    Points
    89
    Par défaut
    Salut,

    Je fais actuellement des tests en utilisant les noms de cellule.

    Je n'ai pas trouvé de getCell(string) par contre il existe des méthodes qui permettent d'y arriver :
    wb.getNameAt
    wb.getNameIndex
    et hssfName.getReference

    il suffit d'écrire une méthode qui combine cela pour obtenir le contenu d'une cellule par son nom.

    Bon courage.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 221
    Points
    221
    Par défaut
    Merki Fredo !

    C'est pas très intruitif.

    1/ je récupère le HSSFName de la cellule dans le classeur (on ne travaille pas sur une feuille mais sur la globalité du classeur) à partir de son libellé.
    2/ ensuite, je récupère la feuille et la référence de la cellule qui est au format feuille!$colonne$ligne i.e. mafeuille!$F$12
    3/ j'extrais les coordonnées i.e. F$12 que je stocke dans un tableau de String
    4/ puis je caste les coordonnées
    5/ pour finalement retourner la cellule recherchée

    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
    public static HSSFCell getCellule(HSSFWorkbook classeur, String libelleCellule) throws Exception {
    	// 1/
    	HSSFName nomCellule = classeur.getNameAt(classeur.getNameIndex(libelleCellule));
    	// 2/
    	String referenceCellule = nomCellule.getReference();
    	String nomFeuille = nomCellule.getSheetName();
    	// 3/
    	referenceCellule = referenceCellule.substring(referenceCellule.indexOf('$')+1);
    	String [] coordonnees = referenceCellule.split("\\$");
    	// 4/
    	int ligne = Integer.parseInt(coordonnees[1]) - 1;
    	short colonne;
    	if(coordonnees[0].length() == 1) { // A->Z
    		char c_colonne = coordonnees[0].charAt(0);
    		colonne = (short)(c_colonne - 65);
    	} else { // AA -> IV
    		char c_colonne = coordonnees[0].charAt(0);
    		char c_colonne2 = coordonnees[0].charAt(1);
    		colonne = (short)(26*((short)(c_colonne - 65 + 1)) + (short)(c_colonne2 - 65));
    	}
    	// 5/	
    	return classeur.getSheet(nomFeuille).getRow(ligne).getCell(colonne);
    }

    NB: je gère les exceptions à la va-vite ...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 221
    Points
    221
    Par défaut
    ça marche aussi très bien avec les CellReference :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	// 4/
    	CellReference cellReference = new CellReference(coordonnees[0]+coordonnees[1]); 
    	HSSFRow row = classeur.getSheet(nomFeuille).getRow(cellReference.getRow());
    	// 5/
    	return row.getCell(cellReference.getCol());

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 221
    Points
    221
    Par défaut
    En plus mieux :
    Merci de donner vos remarques ^^

    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
    /**
             * Retourne une cellule depuis son libellé.
             * <br>Le libellé remplace la référence d'une case.
             * @param classeur Classeur Excel dans lequel s'effectue la recherche.
             * @param libelleCellule libellé de la cellule demandée.
             * @return HSSFCell, null si la case n'existe pas.
             * @see fr.laposte.intra.fi.sesame.util.PoiTools#getCellule(HSSFWorkbook , int , String ).
             */
    	public static HSSFCell getCellule(HSSFWorkbook classeur, String libelleCellule) {
    		HSSFCell cellule = null;
    		String motifReference = "([A-Z][A-Z]?)([1-9][0-9]*)";
    		String motif = "[A-Z]+([A-Z]|[0-9])*";
     
    		if(libelleCellule.matches(motif) && !libelleCellule.matches(motifReference)) {
    			try {
    				HSSFName nomCellule = classeur.getNameAt(classeur.getNameIndex(libelleCellule));
    				String referenceCellule = nomCellule.getReference();
    				String nomFeuille = nomCellule.getSheetName();
    				referenceCellule = referenceCellule.substring(referenceCellule.indexOf('$')+1);
    				String [] coordonnees = referenceCellule.split("\\$");
    				CellReference cellReference = new CellReference(coordonnees[0]+coordonnees[1]); 
    				HSSFRow row = classeur.getSheet(nomFeuille).getRow(cellReference.getRow());
    				cellule = row.getCell(cellReference.getCol());
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
     
    		return cellule;
    	} // getCellule
     
    	/**
             * Retourne une cellule depuis sa référence.
             * <br>Une référence correspond aux coordonnées de la case (i.e. A10, BF2).
             * @param classeur Classeur Excel dans lequel s'effectue la recherche.
             * @param feuille Feuille dans laquelle s'effectue la recherche.
             * @param referenceCellule Référence de la cellule recherchée.
             * @return HSSFCell, null si la case n'existe pas.
             * @see fr.laposte.intra.fi.sesame.util.PoiTools#getCellule(HSSFWorkbook , String )
             */
    	public static HSSFCell getCellule(HSSFWorkbook classeur, int feuille, String referenceCellule) {
    		HSSFCell cellule = null;
    		String motif = "([A-Z][A-Z]?)([1-9][0-9]*)";
     
    		if(referenceCellule.matches(motif)) {
    			try {
    				String coordonnees[] = {"", ""};
    				int i = -1;
    				while(++i < referenceCellule.length()) {
    					char c = referenceCellule.charAt(i);
     
    					if(c >= 65 && c <= 122) {
    						coordonnees[0] += c;
    						c = referenceCellule.charAt(i);
    					} else if(c >= 48 && c <= 57) {
    						coordonnees[1] += c;
    						c = referenceCellule.charAt(i);
    					}
    				}		
     
    				CellReference cellReference = new CellReference(coordonnees[0] + coordonnees[1]);
    				HSSFRow row = classeur.getSheetAt(feuille).getRow(cellReference.getRow());
    				cellule = row.getCell(cellReference.getCol());
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
     
    		return cellule;
    	} // getCellule

Discussions similaires

  1. Appeler une méthode par son nom sans utiliser eval
    Par rambc dans le forum Général Python
    Réponses: 5
    Dernier message: 30/10/2009, 16h05
  2. Appeler une variable par son nom
    Par averooès dans le forum VBA Access
    Réponses: 7
    Dernier message: 07/04/2009, 22h11
  3. Réponses: 3
    Dernier message: 08/09/2008, 21h20
  4. [POO] Appeler une fonction par son nom dans une variable
    Par whitespirit dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2008, 11h23
  5. [VB6] Appeler une procedure par son nom.
    Par kenn dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/05/2006, 09h29

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