Elle est là ton erreur, renseigne les 2 valeurs en une seule fois car si le 1er if passe et pas le second, tu te retrouves avec une valeur nulle.
Version imprimable
Faut que je trouve une collection qui permet de faire ca:
for(){//pour parcourrir mon fichier excel
if(si j'apercoit "Agent"){
[je renseigne rien][je met mon agent]
}
if(si j'apercoit "Validation"){
[je renseigne ma validation][je renseigne rien]
}
}
Resultat de mon affichage, j'ai :
[ma validation][mon agent]
Heu ? Tu peux avoir des agents sans validation (ou inversement) ?
a++
Donc tes if doivent être imbriqués :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 ArrayList<Agent> listAgent = new ArrayList<Agent>(); for(){//pour parcourrir mon fichier excel Agent agt = new Agent(); if(si j'apercoit "Agent"){ //[je renseigne rien][je met mon agent] agt.setAgent(l'ahent que je renseigne); if(si j'apercoit "Validation"){//on cherche une validation que si on a un agent (cf ton dernier message) //[je renseigne ma validation][je renseigne rien] agt.setValidation(la validation que je renseigne); } listAgent.add(agt);//on ajoute l'agent à chaque fois que j'ai aperçu "Agent" } }
Et pour afficher, je fais comment ?
La méthode System.out.println() invoque la méthode toString de l'objet, il faut la redéfinir dans la classe AgentCode:
1
2
3 for (Agent agt : listAgent) System.out.println(agt);
Code:
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 package Modele; public class Agent { int num_ligne_agent; String Agent; String Validation; int num_ligne_validation; public Agent() { super(); } public Agent(int num_ligne_agent, String agent, String validation, int num_ligne_validation) { super(); this.num_ligne_agent = num_ligne_agent; Agent = agent; Validation = validation; this.num_ligne_validation = num_ligne_validation; } public int getNum_ligne_agent() { return num_ligne_agent; } public void setNum_ligne_agent(int num_ligne_agent) { this.num_ligne_agent = num_ligne_agent; } public String getAgent() { return Agent; } public void setAgent(String agent) { Agent = agent; } public String getValidation() { return Validation; } public void setValidation(String validation) { Validation = validation; } public int getNum_ligne_validation() { return num_ligne_validation; } public void setNum_ligne_validation(int num_ligne_validation) { this.num_ligne_validation = num_ligne_validation; } public String toString() {//redéfinition de la méthode toString //cette mise en forme n'est qu'un exemple return "Agent : \n ligne numéro : "+num_ligne_agent+"\n numéro validation : "+num_ligne_validation" }
je fais ca:
Ca m'affiche ces valeur làCode:
1
2
3
4 for (Agent agt : listAgent) System.out.println(agt.getAgent()+"--"+agt.getValidation());
je veux obtenir:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 null--null null--null null--null Agent 4030--null null--null null--null null--null null--null null--null null--null null--null null--null null--null null--null null--null null--null null--null null--2.0
Agent 4030--2.0
A moins que les lignes aient des liens entre elles, tu n'as pas du faire comme je t'ai dit à 15h38 au moment de parcourir le fichier excel
En faite, c'est pas ca que je fais :
C'est ca:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 ArrayList<Agent> listAgent = new ArrayList<Agent>(); for(){//pour parcourrir mon fichier excel Agent agt = new Agent(); if(si j'apercoit "Agent"){ //[je renseigne rien][je met mon agent] agt.setAgent(l'ahent que je renseigne); if(si j'apercoit "Validation"){//on cherche une validation que si on a un agent (cf ton dernier message) //[je renseigne ma validation][je renseigne rien] agt.setValidation(la validation que je renseigne); } listAgent.add(agt);//on ajoute l'agent à chaque fois que j'ai aperçu "Agent" } }
je suis obligé de faire cette fermeture car c'est des test Indépendant. selon la ligne qu'il lit et la colonne.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ArrayList<Agent> listAgent = new ArrayList<Agent>(); for(){//pour parcourrir mon fichier excel Agent agt = new Agent(); if(si j'apercoit "Agent"){ //[je renseigne rien][je met mon agent] agt.setAgent(l'ahent que je renseigne); }//JE FAIS UNE FERMETURE ICI //avec cette if(si j'apercoit "Validation"){//on cherche une validation que si on a un agent (cf ton dernier message) //[je renseigne ma validation][je renseigne rien] agt.setValidation(la validation que je renseigne); } listAgent.add(agt);//on ajoute l'agent à chaque fois que j'ai aperçu "Agent" } }
Agent se trouve à la colonne 0 de mon fichier excel et il peut se trouver dans plusieurs lignes.
En revanche, Validation n'apparait pas toujours pour chaque agent.
exemple dans mon extract.xls:
Code:
1
2
3
4
5 col A |col B |col C |col D |col D |vide | 0 |Agent|vide | vide |machin | vide |vide | ...| 18|vide |vide |vide |Validation|2 |vide |
Voilà, j'ai réussi à faire à afficher ca:
En faisant ceci:Code:
1
2
3
4
5 Agent: Agent 4030 Validation: 2.0 Agent: Agent 4037 Validation: 1.0 Agent: Agent 4047 Validation: 2.0 Agent: Agent 4053 Validation: 2.0
Cela vous parait-il juste au niveau programmation?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 int k = 0;//pour passer à la colonne suivante for (Agent agt : listAgent){ if(agt.getAgent()!=null){//si l'agent n'est pas null ag=agt.getAgent();//obtenir L'agent tab[0][k]=ag; //System.out.println("k: "+k); } if(agt.getValidation()!=null){//si la validation n'est pas null va=agt.getValidation();//obtenir la validation tab[1][k]=va;//assigner les 2 valeurs trouvées k++;//passe à la colonne suivante } } for (int d=0; d<tab.length;d++){ if(tab[0][d] != null || tab[1][d]!=null){//si l'une des cellules n'est pas null //afficher l'agent + la validation System.out.println("Agent: "+tab[0][d]+" Validation: "+tab[1][d]); } }
N'est-ce pas une bétise ?
En tout cas, Quand je vérifie mon fichier excel je vois que les agent qui n'ont pas de validation n'apparaissent.
Je prend en compte que ceux qui ont une validation.
Au moins en faisant ça ça fait ce que tu veux. Mais d'un point de vu programmation stocker des données dans des tableaux de String, ça ne me parait pas correct. Surtout si c'est pour sauter les lignes qui ont des données nulles.
Da plus, tu as précisé que si l'agent est nul, il ne peut pas être validé, pour tant en faisant 2 test indépendant, tu le tolères
Je trouve ta solution bien compliquée pour faire ça :calim2:
Je butte un peu sur la structure de ton fichier excel.
Chaque ligne est-elle indépendante ou faut-il considérer un ensemble de ligne pour chaque agent?
En d'autres termes a-t-on ceci:
ou cela:Code:
1
2
3
4
5 ligne1: agent1, info1_agent1, info2_agent1, ... ligne2: agent2, info1_agent2, info2_agent2, ... ... lignex: agentX, info1_agentX, info2_agentX, ...
Dans tous les cas ce pseudo code pourrait fonctionner:Code:
1
2
3
4
5
6ligne1: agent1, info1_agent1, info2_agent1, ... ligne2: info5_agent1, info6_agent1, ... ... lignex: agentX, info1_agentX, info2_agentX, ... lignex+1: info5_agentX, info6_agentX, ...
Comme ça tu peux extraite la première boucle dans une méthode que lit ton fichier excel et te retourne une liste d'agent et la 2e boucle dans une méthode qui affiche une liste d'agent qui elle même appelle une méthode qui affiche un agent.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Pour chaque ligne du fichier excel Si col0 commence par'Agent' Créer nouvel agent Fin si Si col4 commence par 'Validation' // Attention au risque d'écrasement si plusieurs ligne d'un même agent continnent 'validation' ... agent.setValidation(valeur de la colonne 5) Ajouter agent à listeAgent Fin si Fin pour Pour chaque agent de listeAgent Si agent a une validation afficher agent Fin si Fin pour
Si tu n'a pas besoin de conserver cette liste d'agent et pour faire plus vite, tu même afficher directement ton agent avec sa validation dans le 'Si col4 commence par 'Validation'
Ben, j'ai pas trouver de structures adaptés pour mettre mon agent qui est un String et sa validation qui est un int.
Non, c'est pas ce que j'ai dit.Citation:
Da plus, tu as précisé que si l'agent est nul, il ne peut pas être validé, pour tant en faisant 2 test indépendant, tu le tolères
J'ai dit qu'en parcourant le fichier si après avoir trouver le mot agent à la colonne 0, on ne trouve pas validation à la colonne 4 alors on affiche juste Agent + vide.
Sinon on affiche Agent + sa validation.
Je pense que t'as pas compris.Citation:
pour tant en faisant 2 test indépendant, tu le tolères
Ces 2 test son fait pour récupérer les informations dans la colonne 0 puis dans la colonne 4.
Je ne peux pas faire de si la colonne_0_lue != null et si la colonne_4_lue !=null car j'ai fait un for avant qui parcours ligne par ligne.
Code:
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 for (Iterator rowIt = sheet.rowIterator(); rowIt.hasNext();){ row = (HSSFRow) rowIt.next(); Agent a = new Agent(); n++;// pour avoir le numéro de chaque ligne lue if(row.getCell(0) != null){//si les lignes de la colonne 0 ne sont pas null if(row.getCell(0).getStringCellValue().startsWith("Agent")){// et si on apercoit "Agent" nom_agent=row.getCell(0).getStringCellValue();//on récupère notre agent a.setAgent(nom_agent);//on récupère notre agent dans notre objet System.out.println(a.getAgent()); //on l'affiche } } if(row.getCell(1) != null){// si les lignes de la colonne 2 ne sont pas null if(row.getCell(1).getStringCellValue().startsWith("Validation")){// et si on apercoit "validation" valid++; //Nombre de validation détecter dans le fichier n_l_valid = n; // on récupère le numéro de ligne de la Validation //System.out.println(nom_agent); n_l_valid--;//on décrémente pour récupérer la validation dans le fichier valid_recupere=sheet.getRow(n_l_valid).getCell(4);// on récupére la validation dans le fichier //System.out.println("Validation: "+valid_recupere);//on l'affiche a.setValidation(valid_recupere.toString());//on récupère notre agent dans notre objet System.out.println(a.getValidation());//on l'affiche } } //if(nom_agent. !=null)//si le nom de l'agent à changer: récuperer nom_agent+validation listAgent.add(a); }//fin du for
Pour Fifan31:
J'ai fait ce que tu m'as dit donc ca:
Ce la m'affiche ca:Code:
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 for (Iterator rowIt = sheet.rowIterator(); rowIt.hasNext();){ row = (HSSFRow) rowIt.next(); Agent a = new Agent(); n++;// pour avoir le numéro de chaque ligne lue if(row.getCell(0) != null && row.getCell(0).getStringCellValue().startsWith("Agent")){//si les lignes de la colonne 0 ne sont pas null nom_agent=row.getCell(0).getStringCellValue();//on récupère notre agent a.setAgent(nom_agent);//on récupère notre agent dans notre objet System.out.println(a.getAgent()); //on l'affiche } if(row.getCell(1) != null && row.getCell(1).getStringCellValue().startsWith("Validation")){// si les lignes de la colonne 2 ne sont pas null valid++; //Nombre de validation détecter dans le fichier n_l_valid = n; // on récupère le numéro de ligne de la Validation //System.out.println(nom_agent); n_l_valid--;//on décrémente pour récupérer la validation dans le fichier valid_recupere=sheet.getRow(n_l_valid).getCell(4);// on récupére la validation dans le fichier //System.out.println("Validation: "+valid_recupere);//on l'affiche a.setValidation(valid_recupere.toString());//on récupère notre agent dans notre objet System.out.println(a.getValidation());//on l'affiche listAgent.add(a); } }//fin du for for (Agent agt : listAgent){ if(agt.getValidation()!=null) System.out.println("agent: "+agt.getAgent()+"--validation: "+agt.getValidation()); }
Je comprend pas pourquoi il me met null ??Code:
1
2
3
4
5 Agent: null Validation: 2.0 Agent: null Validation: 1.0 Agent: null Validation: 2.0 Agent: null Validation: 2.0
Effectivement, je ne comprend pas ce que tu cherches à faire concrètement. Cela me parait assez complexe et ne suis pas convaincu que ça soit justifié.
Pour ta structure String-int tu peux faire une classe qui associe un String et un int en tant qu'attribut de la classe.
Je met résolu car le principal est fait.
Un grand Merci a vous tous !
L'affichage obtenu ne correspond pas à ce que je vois dans le code:
etCode:Agent: null Validation: 2.0
Après, il faut voir comment est implémenté ton agent...Code:System.out.println("agent: "+agt.getAgent()+"--validation: "+agt.getValidation());
Contacte moi en MP si tu veux, j'ai un exemple en CSV qui fonctionne.
Avec les données suivantes:
J'obtient:Code:
1
2
3
4
5 agent1;validation;2.5;4;5 8;4;2;3;4 agent2;xxx;3;4;5 toto;validation;3.3;6;7 agentX;validation;99;8;7
Code:
1
2
3
4
5 Agents valides: Agent:agent1 -- Validation:2.5 Agent:agentX -- Validation:99 Agents sans validation: Agent:agent2