Je n'ai pas ce problème chez moi.
Version imprimable
Je n'ai pas ce problème chez moi.
Avant d'exporter les données vers le fichier Excel je les affiche tout d'abord dans un datagridview. Dans le datagridview les données sont correctes mais je n'arrive pas à comprendre pourquoi elles ne le sont pas dans le fichier Excel.
Le code ci-dessous fonctionnait correctement :
et maintenant je remarque que villesMoisValCode:
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 public void fillTable() { IDictionary<string, List<string>> paysVilles = new Dictionary<string, List<string>>(); IDictionary<string, List<string>> paysMois = new Dictionary<string, List<string>>(); IDictionary<KeyValuePair<string, string>> villesMoisVal = new Dictionary<KeyValuePair<string, string>>(); foreach (MaClasse c in listMaClasse) { if(!paysVilles.Keys.Contains(c.pays)) paysVilles.Add(c.pays, new List<string>()); if(!paysVilles[c.pays].Contains(c.ville)) paysVilles[c.pays].Add(c.ville); if(!paysMois.Keys.Contains(c.pays)) paysMois.Add(c.pays, new List<string>()); if(!paysMois[c.pays].Contains(c.mois)) paysMois[c.pays].Add(c.mois); if(!villesMoisVal.Keys.Contains(new KeyValuePair<string, string>(c.ville, c.mois)) villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val); } int row = 0; foreach(string pays in paysVilles.Keys) //ou paysMois.Keys normalement c'est pareil { ++row; workSheet.Cells[row, "A"] = pays; int column = 2; foreach(string mois in paysMois[pays]) { workSheet.Cells[row, intToColumn(column)] = mois; ++column; } foreach(string ville in paysVille[pays]) { ++row; workSheet.Cells[row, "A"] = ville; column = 2; foreach(string mois in paysMois[pays]) { workSheet.Cells[row, intToColumn(column)] = villesMoisVal[new KeyValuePair<string, string>(ville, mois)]; ++column; } } ++row; } }
prend à chaque fois la valeur du premier pays de la liste comme suit:Code:
1
2 workSheet.Cells[row, intToColumn(column)] = villesMoisVal[new KeyValuePair<string, string>(ville, mois)];
Citation:
France Janvier Février
Paris 1000 1250
Italie Janvier Février
Rome 1000 1250
Merci,
Avec ça, j'arrive à avoir les bonnes valeurs dans le messagebox.
Cependant, ça ne regle pas le probleme.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
52
53
54
55
56
57 public void fillTable() { IDictionary<string, List<string>> paysVilles = new Dictionary<string, List<string>>(); IDictionary<string, List<string>> paysMois = new Dictionary<string, List<string>>(); IDictionary<string, List<string>> villeMoisVal = new Dictionary<string, List<string>>(); foreach (MaClasse c in listMaClasse) { if(!paysVilles.Keys.Contains(c.pays)) paysVilles.Add(c.pays, new List<string>()); if(!paysVilles[c.pays].Contains(c.ville)) paysVilles[c.pays].Add(c.ville); if(!paysMois.Keys.Contains(c.pays)) paysMois.Add(c.pays, new List<string>()); if(!paysMois[c.pays].Contains(c.mois)) paysMois[c.pays].Add(c.mois); if(!villeMoisVal .Keys.Contains(c.pays)) villeMoisVal .Add(c.pays, new List<string>()); if(!villeMoisVal [c.pays].Contains(c.val.ToString())) villeMoisVal [c.pays].Add(c.val.ToString()); } int row = 0; foreach(string pays in paysVilles.Keys) //ou paysMois.Keys normalement c'est pareil { ++row; workSheet.Cells[row, "A"] = pays; int column = 2; foreach(string mois in paysMois[pays]) { workSheet.Cells[row, intToColumn(column)] = mois; ++column; } foreach(string ville in paysVille[pays]) { ++row; workSheet.Cells[row, "A"] = ville; column = 2; foreach(string vmv in villeMoisVal[pays]) { MessageBox.Show(vmv); workSheet.Cells[row, intToColumn(column)] = vmv; ++column; } } ++row; } }
Ce code ci-dessous m'affiche bien les pays et les villes comme il le faut à partir du datagridview. Cependant, il y a un problème au niveau des villesMoisVal car il m'affiche les mêmes valeurs du premier pays de la liste dans tous les autres pays et villes comme dans le tableau ci-dessous. De plus, si l'on devait afficher les mois de janvier 2010 à janvier 2011 ça n'affiche que jusqu'à décembre et si par exemple une ville n'a des données qu'à partir de Juillet les valeurs vont s'afficher dans la première colonne de la feuille excel et non pas à partir de la colonne de Juillet.
Citation:
PAYS1 Octobre Novembre Décembre Total
Ville1 1000 2000 3000 6000
Ville2 4000 5000 6000 15000
Total 5000 7000 9000 21000
PAYS2
Ville1 4000 5000 6000 21000
Total 4000 5000 6000 21000
PAYS3
Ville1 1000 2000 3000 6000
Ville2 4000 5000 6000 15000
Total 5000 7000 9000 21000
PAYS4
Ville1 4000 5000 6000 21000
Total 4000 5000 6000 21000
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
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
97
98
99
100
101
102 bool first = true; Excel.Application excelApp = new Excel.Application(); excelApp.Workbooks.Add(); Excel._Worksheet workSheet = excelApp.ActiveSheet; IDictionary<string, List<string>> paysVilles = new Dictionary<string, List<string>>(); IDictionary<string, List<string>> paysMois = new Dictionary<string, List<string>>(); IDictionary<KeyValuePair<string, string>, int> villesMoisVal = new Dictionary<KeyValuePair<string, string>, int>(); foreach (MyStats s in listStats) { if (!paysVilles.Keys.Contains(c.pays)) paysVilles.Add(c.pays, new List<string>()); if (!paysVilles[c.pays].Contains(c.ville)) paysVilles[c.pays].Add(c.ville); if (!paysMois.Keys.Contains(c.pays)) paysMois.Add(c.pays, new List<string>()); if (!paysMois[c.pays].Contains(c.mois)) paysMois[c.pays].Add(c.mois); if(!villesMoisVal.Keys.Contains(new KeyValuePair<string, string>(c.ville, c.mois))) villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val); } int row = 0; foreach (string pays in paysVilles.Keys) { ++row; workSheet.Cells[row, "A"] = pays; int column = 2; if (first) { foreach (string mois in paysMois[pays]) { workSheet.Cells[1, intToColumn(column)] = mois; ++column; } workSheet.Cells[row, intToColumn(column)] = "Total"; first = false; } foreach (string ville in paysVilles[pays]) { ++row; workSheet.Cells[row, "A"] = ville; column = 2; int total = 0; foreach (string mois in paysMois[pays]) { workSheet.Cells[row, intToColumn(column)] = villesMoisVal[new KeyValuePair<string, string>(ville, mois)]; total += villesMoisVal[new KeyValuePair<string, string>(ville, mois)]; ++column; } workSheet.Cells[row, intToColumn(column)] = total; } ++row; workSheet.Cells[row, "A"] = "Total"; for (int i = 2; i <= paysMois[pays].Count + 2; ++i) { int total = 0; for (int j = row - paysVilles[pays].Count; j < row; ++j) { Excel.Range range = workSheet.Cells[j, intToColumn(i)]; total += range.Value; } workSheet.Cells[row, intToColumn(i)] = total; } ++row; } SaveFileDialog SaveFileDialog1 = new SaveFileDialog(); SaveFileDialog1.InitialDirectory = @"C:\"; SaveFileDialog1.Title = "Save text Files"; SaveFileDialog1.CheckFileExists = false; SaveFileDialog1.CheckPathExists = false; SaveFileDialog1.FileName = "Statistiques"; SaveFileDialog1.DefaultExt = ".xlsx"; SaveFileDialog1.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*"; SaveFileDialog1.FilterIndex = 1; SaveFileDialog1.RestoreDirectory = true; SaveFileDialog1.CreatePrompt = true; if (SaveFileDialog1.ShowDialog() == DialogResult.OK) { workSheet.SaveAs(Path.GetFullPath(SaveFileDialog1.FileName)); excelApp.Quit(); MessageBox.Show("Le fichier " + Path.GetFileName(SaveFileDialog1.FileName) + " a été enregistré dans " + Path.GetFullPath(SaveFileDialog1.FileName) + ".", Path.GetFileName(SaveFileDialog1.FileName), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
Je pense que le problème se trouve dans le code suivant car je le remarque en mode debug
de plus, comme je l'ai dit précédemment pays2 reçoit les valeurs de pays1 et que si pays2 n'a pas de valeur en août l'affichage des valeurs de septembre et octobre de pays2 commence à partir de la 1ère colonne au lieu d'afficher 0 ou null en Août et les valeurs de Septembre et Octobre dans leurs colonnes respectives.Code:
1
2
3
4
5
6
7
8
9
10
11
12 IDictionary<KeyValuePair<string, string>, int> AgenceCa = new Dictionary<KeyValuePair<string, string>, int>(); if(!villesMoisVal.Keys.Contains(new KeyValuePair<string, string>(c.ville, c.mois))) villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val); foreach (string mois in paysMois[pays]) { workSheet.Cells[row, intToColumn(column)] = villesMoisVal[new KeyValuePair<string, string>(ville, mois)]; total += villesMoisVal[new KeyValuePair<string, string>(ville, mois)]; ++column; }
Je pense qu'il ne faut pas déclarer villesMoisVal comme ceci:Citation:
PAYS1 Août Septembre Octobre Total
Ville1 1000 2000 3000 6000
Total 1000 2000 3000 6000
PAYS2
Ville1 2000 3000
mais plutôt comme:Code:IDictionary<KeyValuePair<string, string>, int> villesMoisVal = new Dictionary<KeyValuePair<string, string>, int>();
et caster en integer.Code:IDictionary<string, List<string>> villesMoisVal = new Dictionary<string, List<string>>();
Je ne comprends toujours pas où est le problème mais bon.
Comment comptez vous remplir la variable villesMoisVal ?
ville1 - [valM1 valM2 valM3]
ville2 - [valM1 valM2 valM3]
peut être comme ça:
???Code:
1
2
3
4
5
6
7
8
9 IDictionary<string, List<string>> villesMoisVal = new Dictionary<string, List<string>>(); if(!villesMoisVal.Keys.Contains(c.pays)) villesMoisVal.Add(c.pays, new List<string>()); if(!villesMoisVal[c.pays].Contains(c.val.ToString())) villesMoisVal[c.pays].Add(c.val.ToString());
Pourrais-je vous envoyer un MP pour vous expliquer une chose qui pourra nous aider à mieux se comprendre?
Pas de problème. C'est vrai que je ne comprends pas tout là :)
Je vous ai envoyé un MP en espérant que vous comprendrez.
Merci,