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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    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 éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    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 éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    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 éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    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 éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    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 éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    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 éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    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
    Membre averti
    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
    Par défaut
    Oui pas de problème. Pouvez vous me montrer comment vous écrivez dans un fichier excel ?

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