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

C# Discussion :

Remplir un fichier excel


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut Remplir un fichier excel
    Bonjour,

    Je remplis un fichier excel comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    int row = 1;
    foreach (MaClasse c in listMaClasse)
    {
       row++;
       workSheet.Cells[row, "A"] = c.pays;
       workSheet.Cells[row, "B"] = c.ville;
       workSheet.Cells[row, "C"] = c.mois;
    }
    et cela fonctionne parfaitement. Pour chaque pays, j'ai plusieurs villes. Donc, l'affichage du pays se fait plusieurs fois.

    Je voudrais pouvoir afficher dans mon fichier Excel le résultat suivant:

    Pays1
    Ville1
    Ville2
    Ville3
    ...
    Pays2
    Ville1
    Ville2
    Ville3

    etc...
    au lieu de

    Pays1 Ville1
    Pays1 Ville2
    Pays1 Ville3

    Pays2 Ville1
    Pays2 Ville2
    Pays2 Ville3

    pour éviter les doublons.

    Merci,

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Pour avoir le résultat suivant :
    Pays1
    Ville1 Mois1
    Ville2 Mois2
    Ville3 Mois3

    Pays2
    Ville1 Mois1
    Ville2 Mois2
    Ville3 Mois3

    Pays3
    Ville1 Mois1
    Ville2 Mois2
    Ville3 Mois3

    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
     
    int row = 0;
    string pays =  string.Empty;
     
    foreach (MaClasse c in listMaClasse)
    {   
       if(pays != c.pays)
       {
          ++row;
          workSheet.Cells[row, "A"] = c.pays;
          pays = c.pays;
         ++row;
       }
       workSheet.Cells[row, "A"] = c.ville;
       workSheet.Cells[row, "B"] = c.mois;  
       ++row;
    }

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci pour votre aide. Et, si je veux afficher par exemple:

    Pays1 Mois1 Mois2 Mois3
    Ville1 valM1 valM2 valM3
    Ville2 valM1 valM2 valM3
    Ville3 valM1 valM2 valM3

    Pays2
    Ville1 valM1 valM2 valM3
    Ville2 valM1 valM2 valM3
    Ville3 valM1 valM2 valM3

    Pays3
    Ville1 valM1 valM2 valM3
    Ville2 valM1 valM2 valM3
    Ville3 valM1 valM2 valM3

    Sinon, j'ai un peu de mal à comprendre pourquoi les 2 incrémentations dans le if. Je suppose aussi que row++ et ++row c'est la même chose?

    Merci,

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Oui row++ et ++row sont identique (parait que ++row est plus performant).
    La première incrémentation sert à sauter une ligne à chaque nouveau pays, donc si c'est pas ce que tu veux il suffit de l'enlever et initialiser row à 1.

    Je regarde ce soir pour le reste.

  5. #5
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    c'est exactement ce que je veux. Sauf que je voudrais afficher le résultat suivant:


    France Janvier Février Mars
    Paris 1000 1500 2200
    Nantes 500 780 660
    Nice 100 200 300
    Les nombres correspondent à la valeur d'un autre champs.

    Merci,

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Ce serait bien que tu détailles un peu le contenu de ta classe MaClasse.

    J'imagine qu'il y a le même nombre de mois pour chaque ville d'un pays :
    France Janvier Février Mars
    Paris 1000 1500 2200
    Nantes 500 780 660
    Nice 100 200 300

    Italie Janvier Février Mars Avril
    Milan 1300 1000 2000 1400
    Rome 1500 700 600 750
    Tu pourrais essayer 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
     
    public void fillTable()
    {
     IDictionary<string, List<string>> paysVilles = new Dictionary<string, List<string>>(); 
     IDictionary<string, List<string>> paysMois = 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);      
     }
     
     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)] = valM; //je ne sais pas encore comment tu récupères cette valeur
              ++column;
           }
       }
       ++row;
     }
    }
     
    private static string intToColumn(int n)
    {
       if (n <= 26 && n > 0)
       {
          return (char)(n + 64) + "";
       }
       else if (n <= 702)
       {
           return (char)(n / 26 + 64) + "" + (char)(n % 26 + 64);
       }
     
       return string.Empty;                           
    }

  7. #7
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Ce serait bien que tu détailles un peu le contenu de ta classe MaClasse.

    J'imagine qu'il y a le même nombre de mois pour chaque ville d'un pays :
    valM; //je ne sais pas encore comment tu récupères cette valeur
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      class MaClasse
        {
            public string pays { get; set; }
            public string ville { get; set; }
            public string mois { get; set; }
            public int valM{ get; set; }
        }
    oui il y a le même nombre de mois pour chaque ville d'un pays

    valM est un autre champs comme pays et mois qu'on affiche dans la colonne mois comme par exemple

    pays mois
    ville valM
    Merci,

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    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
     
     
    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);
     
        villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val); //je pense qu'il n'y a qu'un seul triplet <ville, mois, val> ex : Paris Janvier 2000 et Paris Janvier 1500 impossible
     
     }
     
     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;
     }
    }
     
    private static string intToColumn(int n)
    {
       if (n <= 26 && n > 0)
       {
          return (char)(n + 64) + "";
       }
       else if (n <= 702)
       {
           return (char)(n / 26 + 64) + "" + (char)(n % 26 + 64);
       }
     
       return string.Empty;                           
    }

  9. #9
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    IDictionary<KeyValuePair<string, string>> villesMoisVal = new Dictionary<KeyValuePair<string, string>>();

    villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val); //je pense qu'il n'y a qu'un seul triplet <ville, mois, val> ex : Paris Janvier 2000 et Paris Janvier 1500 impossible
    oui il y a un seul triplet

    Erreur 6
    L'utilisation du type 'System.Collections.Generic.IDictionary<TKey,TValue>' générique requiert les arguments de type 2
    J'ai vu que le keyvaluepair s'utilise comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Create a new dictionary of strings, with string keys, 
            // and access it through the IDictionary generic interface.
            IDictionary<string, string> openWith = 
                new Dictionary<string, string>();
     
    foreach( KeyValuePair<string, string> kvp in openWith )
            {

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    J'avais pas fait attention au type de val qui est int (j'ai tout considéré comme des string)
    L'erreur ne vient pas du KeyValuePair.

    Il suffit de changer la déclaration de villesMoisVal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IDictionary<KeyValuePair<string, string>, int> villesMoisVal = new Dictionary<KeyValuePair<string, string>, int>();

  11. #11
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Lorsque je clique sur le bouton exporter, j'ai une exception

    L'exception ArgumentException n'a pas été gérée

    Un élément avec la même clé a déjà été ajouté.
    qui est levée au niveau de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val);

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    Lorsque je clique sur le bouton exporter, j'ai une exception



    qui est levée au niveau de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val);
    C'est bizarre, vu que tu m'as dit qu'il n 'y a qu'un seul triplet ville mois val possible, il ne devrait pas y avoir de double ajout.

    Il faut ajouter un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(!villesMoisVal.Keys.Contains(new KeyValuePair<string, string>(c.ville, c.mois))
       villesMoisVal.Add(new KeyValuePair<string, string>(c.ville, c.mois), c.val);

  13. #13
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci ça fonctionne parfaitement. Cependant, je vais essayer de calculer le total de villemoisval en horizontal et en vertical comme ceci:

    France Janvier Février Mars Total
    Paris 1000 1500 2200 4700
    Nantes 500 780 660 1940
    Nice 100 200 300 600
    Total 1600 2480 3160 7240
    En cas de problème, pourrais-je revenir vers vous?

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Oui pas de problème. Pouvez vous me montrer comment vous écrivez dans un fichier excel ?

  15. #15
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Pour écrire dans un fichier excel je fais 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
     
    using Excel = Microsoft.Office.Interop.Excel;
     
            static void fillTable(List<MaClasse> listMaClasse)
            {
                // Load up Excel, then make a new empty workbook.
                Excel.Application excelApp = new Excel.Application();
                excelApp.Workbooks.Add();
     
                // This example uses a single workSheet. 
                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 (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;
     }
     
    SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
                SaveFileDialog1 .InitialDirectory = @"C:\";
                SaveFileDialog1 .Title = "monTitre";
                SaveFileDialog1 .CheckFileExists = false;
                SaveFileDialog1 .CheckPathExists = false;
                SaveFileDialog1 .FileName = "monFichier";
                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(sfd.FileName) + ".", Path.GetFileName(SaveFileDialog1.FileName), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }            
     
    }
     
    private static string intToColumn(int n)
    {
       if (n <= 26 && n > 0)
       {
          return (char)(n + 64) + "";
       }
       else if (n <= 702)
       {
           return (char)(n / 26 + 64) + "" + (char)(n % 26 + 64);
       }
     
       return string.Empty;                           
    }

  16. #16
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    pour éviter de répéter l'affichage des mois comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    France Janvier Février Mars 
    Paris    1000   1500    2200
    Nantes 500     780     660
    Nice     100     200     300
     
    Italie Janvier Février Mars
    Rome  1000   500     600
    Milan   500     200    300
    Bari     300     300    400
    j'ai du remplacé row par 1 dans à la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
      foreach(string mois in paysMois[pays])
       {
         // workSheet.Cells[row, intToColumn(column)] = mois;
            workSheet.Cells[1, intToColumn(column)] = mois;
    cependant je ne vois pas comment faire pour calculer les totaux en vertical et en horizontal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    France Janvier Février Mars   Total
    Paris    1000   1500    2200   4700
    Nantes 500     780     660     1940
    Nice     100     200     300     600
    Total    1600   2480    3160   7240
     
    Italie Janvier Février Mars   Total
    Rome  1000   500     600    2100
    Milan   500     200    300    1000
    Bari     300     300    400    1000
    Total   1800  1000    1300   4100
    Merci,

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Si j'ai bien compris vous voudriez avoir comme résulta final ceci :
    France Janvier Février Mars Total
    Paris 1000 1500 2200 4700
    Nantes 500 780 660 1940
    Nice 100 200 300 600
    Total 1600 2480 3160 7240

    Italie Janvier Février Mars Total
    Rome 1000 500 600 2100
    Milan 500 200 300 1000
    Bari 300 300 400 1000
    Total 1800 1000 1300 4100
    Donc vous répéter les mois pour chaque nouveau pays, je ne comprends pas pourquoi vous parlez de ne pas répéter le mois.

    J'ai testé ça et ça a l'air de marcher :
    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
                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 (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.valM);
     
                 }
     
                 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;
                   }
                   workSheet.Cells[row, intToColumn(column)] = "Total";
     
                   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;
                 }

  18. #18
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Oui c'est bien le résultat que je voudrais avoir cependant vu que les mois sont pareils pour tous je trouve préférable de garder qu'une seule entête représentée par les mois et le libellé total en horizontal.

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Dans ce cas là il faut juste rajouter un test :

    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
     
    static void fillTable(List<MaClasse> listMaClasse)
    {
    bool first = true;
     
    [...]
     
    if(first)
    {
       int column = 2;
       foreach(string mois in paysMois[pays])
       {
              workSheet.Cells[1, intToColumn(column)] = mois;
              ++column;
       }
       workSheet.Cells[row, intToColumn(column)] = "Total";
       first = false;
    }

  20. #20
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Je viens de vérifier le résultat de mon fichier Excel et je remarque qu'il y a un problème au niveau des données extraites.

    Au lieu d'avoir le résultat suivant:

    France Janvier Février Mars Total
    Paris 1000 1500 2200 4700
    Nantes 500 780 660 1940
    Nice 100 200 300 600
    Total 1600 2480 3160 7240

    Italie Janvier Février Mars Total
    Rome 1000 500 600 2100
    Milan 500 200 300 1000
    Bari 300 300 400 1000
    Total 1800 1000 1300 4100
    j'ai :

    France Janvier Février Mars Total
    Paris 1000 1500 2200 4700
    Nantes 500 780 660 1940
    Nice 100 200 300 600
    Total 1600 2480 3160 7240

    Italie Janvier Février Mars Total
    Rome 1000 1500 2200 4700
    Milan 500 780 660 1940
    Bari 100 200 300 600
    Total 1600 2480 3160 7240
    c'est à dire les valeurs villesMoisVal de France sont répétées dans Italie alors qu'elles doivent être différentes.

Discussions similaires

  1. Impossible de remplir un fichier excel via ADO
    Par mioux dans le forum ASP.NET
    Réponses: 6
    Dernier message: 06/04/2009, 15h59
  2. problème code pour remplir un fichier Excel
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/07/2008, 09h51
  3. [Excel] Remplir un fichier excel suivant un template
    Par Masmeta dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/04/2008, 14h42
  4. Réponses: 0
    Dernier message: 04/04/2008, 13h22

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