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

ASP.NET Discussion :

Comment générer un fichier Excel en ASP.NET [Tutoriel]


Sujet :

ASP.NET

  1. #1
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut Comment générer un fichier Excel en ASP.NET
    Bonjour,

    Cette discussion a été ouverte pour recueillir vos commentaires ou vos remarques sur le tutoriel : Comment générer un fichier Excel en ASP.NET

    Bonne lecture à tous

    http://philippe.developpez.com/artic...erexcelaspnet/



    Retrouver les meilleurs cours et tutoriels pour apprendre Microsoft Office Excel

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  2. #2
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    En attendant le lien voici ma contribution:
    Un XLS Helper pour produire des fichiers Excel XP
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    public static class XlsHelper
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="data">The DataSet</param>
        /// <returns></returns>
        public static string ToXLS(DataSet data)
        {
            StringBuilder xml = new StringBuilder();
            xml.Append(HeaderToXLS());
            foreach (DataTable dt in data.Tables)
            {
                xml.Append(RowToXLS(dt));
            }
            xml.Append(FooterToXLS());
            return xml.ToString();
        }
     
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        private static string HeaderToXLS()
        {
            StringBuilder xml = new StringBuilder();
            xml.Append("<?xml version=\"1.0\"?>\n");
            xml.Append("<?mso-application progid=\"Excel.Sheet\"?>\n");
            xml.Append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" ");
            xml.Append("xmlns:o=\"urn:schemas-microsoft-com:office:office\" ");
            xml.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" ");
            xml.Append("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" ");
            xml.Append("xmlns:html=\"http://www.w3.org/TR/REC-html40\">\n");
            xml.Append("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">");
            xml.Append("</DocumentProperties>");
            xml.Append("<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\n");
            xml.Append("<ProtectStructure>False</ProtectStructure>\n");
            xml.Append("<ProtectWindows>False</ProtectWindows>\n");
            xml.Append("</ExcelWorkbook>\n");
            xml.Append("<Styles>\n");
            xml.Append("<Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");
            xml.Append("<Alignment ss:Vertical=\"Bottom\"/>\n");
            xml.Append("<Borders/>\n");
            xml.Append("<Font/>\n");
            xml.Append("<Interior/>\n");
            xml.Append("<NumberFormat/>\n");
            xml.Append("<Protection/>\n");
            xml.Append("</Style>\n");
            xml.Append("<Style ss:ID=\"s21\">\n");
            xml.Append("<NumberFormat ss:Format=\"Short Date\"/>\n");
            xml.Append("</Style>\n");
            xml.Append("</Styles>\n");
            return xml.ToString();
        }
     
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dt">The DataTable</param>
        /// <returns></returns>
        private static string RowToXLS(DataTable dt)
        {
            StringBuilder xml = new StringBuilder();
     
            xml.AppendFormat("<Worksheet ss:Name=\"{0}\">\n", dt.TableName);
            xml.AppendFormat("<Table ss:ExpandedColumnCount=\"{0}\" ss:ExpandedRowCount=\"{1}\" x:FullColumns=\"1\" x:FullRows=\"1\">\n",
                dt.Columns.Count, dt.Rows.Count + 1);
            xml.Append("<Row>\n");
            foreach (DataColumn column in dt.Columns)
            {
                xml.AppendFormat("<Cell><Data ss:Type=\"String\">\n{0}</Data></Cell>\n",
                    System.Web.HttpUtility.HtmlEncode(column.ColumnName));
            }
            xml.Append("</Row>\n");
            string dataType = string.Empty;
            foreach (DataRow row in dt.Rows)
            {
                xml.Append("<Row>\n");
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    Type type = row[i].GetType();
     
                    if (type == typeof(decimal))
                    {
                        xml.AppendFormat("<Cell><Data ss:Type=\"Number\">{0}</Data></Cell>\n",
                            Convert.ToDouble(row[i], CultureInfo.CurrentCulture).ToString(CultureInfo.CreateSpecificCulture("en-US")));
                    }
                    else if (type == typeof(Int32))
                    {
                        xml.AppendFormat("<Cell><Data ss:Type=\"Number\">{0}</Data></Cell>\n",
                            Convert.ToInt32(row[i], CultureInfo.CurrentCulture).ToString(CultureInfo.CreateSpecificCulture("en-US")));
                    }
                    else if (type == typeof(DateTime))
                    {
                        xml.AppendFormat("<Cell ss:StyleID=\"s21\"><Data ss:Type=\"DateTime\">{0}</Data></Cell>\n",
                            Convert.ToDateTime(row[i]).ToString("s"));
                    }
                    else
                    {
                        xml.AppendFormat("<Cell><Data ss:Type=\"String\">{0}</Data></Cell>\n", row[i].ToString());
                    }
                }
                xml.Append("</Row>\n");
            }
     
            xml.Append("</Table>\n");
            xml.Append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">\n");
            xml.Append("<Selected/>\n");
            xml.Append("<Panes>\n");
            xml.Append("<Pane>\n");
            xml.Append("<Number>3</Number>\n");
            xml.Append("<ActiveRow>1</ActiveRow>\n");
            xml.Append("</Pane>\n");
            xml.Append("</Panes>\n");
            xml.Append("<ProtectObjects>False</ProtectObjects>\n");
            xml.Append("<ProtectScenarios>False</ProtectScenarios>\n");
            xml.Append("</WorksheetOptions>\n");
            xml.Append("</Worksheet>\n");
     
            return xml.ToString();
        }
     
        private static string FooterToXLS()
        {
            StringBuilder xml = new StringBuilder();
     
            xml.Append("</Workbook>\n");
     
            return xml.ToString();
        }
    }
    Son usage:
    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
    DataSet ds = new DataSet();
    DataTable dt = new DataTable("Feuille1");
     
    dt.Columns.Add(new DataColumn("Col1", typeof(int)));
    dt.Columns.Add(new DataColumn("Col2", typeof(string)));
    dt.Columns.Add(new DataColumn("Col3", typeof(DateTime)));
     
    for (int i = 0; i < 20; i++)
    {
        DataRow row = dt.NewRow();
        row["Col1"] = 1 + i;
        row["Col2"] = "Tést_" + i;
        row["Col3"] = new DateTime(DateTime.Now.AddDays(i).Year, DateTime.Now.AddDays(i).Month, DateTime.Now.AddDays(i).Day);
        dt.Rows.Add(row);
    }
     
    ds.Tables.Add(dt);
    string xls = XlsHelper.ToXLS(ds);
     
    using (FileStream fs = File.Create(@"C:\temp\test.xls"))
    {
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] arr = encoding.GetBytes(xls);
        fs.Write(arr, 0, arr.Length);
    }
    C'est un peu artisanal, mais ça marche plutôt bien.
    Un encodage UTF8 plutôt que HTML serait plus "universel", mais bon...
    La doc à ce sujet.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    L'article est très bien fait. Mais j'ai deux remarques.

    La bibliothèque CarlosAG fonctionne très bien sous office 2003 mais un message s'affiche sous office 2007 signalant que le document ne correspond pas à l'extension. Ce message n'empêche pas l'ouverture du document mais est assez désagréable.

    Ensuite, à la fin de l'article il est fait référence aux format xlsx. Pourquoi ne pas faire un bref récapitulatif du fonctionnement du SDK de génération de ces documents ?

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    Où est l'article?

    Moi je passe par un renderControl pour créer mon fichier excel à partir d'un gridview, sinon je construis une datatable en interne que j'exporte sous excel.

    Ca fonctionne très bien pour Office 2003, par contre pour Office 2007, il crée le fichier en Lecture Seule et nous dit que le format de l'extension .xls, n'est pas le bon format comparé à xlsx.

  5. #5
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Salut,

    Citation Envoyé par tortuegenie Voir le message
    Où est l'article?
    Ooops, ca y'est, le lien est dans le pot (grosse journee...)

    Citation Envoyé par tortuegenie
    Moi je passe par un renderControl pour créer mon fichier excel à partir d'un gridview, sinon je construis une datatable en interne que j'exporte sous excel.
    Oui, c'est une des options abordees

    Citation Envoyé par tortuegenie
    Ca fonctionne très bien pour Office 2003, par contre pour Office 2007, il crée le fichier en Lecture Seule et nous dit que le format de l'extension .xls, n'est pas le bon format comparé à xlsx.
    Citation Envoyé par replica Voir le message
    La bibliothèque CarlosAG fonctionne très bien sous office 2003 mais un message s'affiche sous office 2007 signalant que le document ne correspond pas à l'extension. Ce message n'empêche pas l'ouverture du document mais est assez désagréable.
    Ok, je ne m'etais jamais rendu comte de cette limitation cote Office 2007....parce que je suis sous 2003

    Au vu de l'erreur dans le cas de l'ouverture avec xlsx, je vais probablement modifier l'article avec un exemple de code ExcelPackage, qui genere des vrais beaux xlsx

    Ensuite, à la fin de l'article il est fait référence aux format xlsx. Pourquoi ne pas faire un bref récapitulatif du fonctionnement du SDK de génération de ces documents ?
    Tu parles de quel SDK, celui "de base", qui te demande d'ajouter plein de trucs horribles genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    eleWorksheet.SetAttribute(@"xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
    xws.AppendChild(eleWorksheet);
    ...bof...

    Si effectivement, la generation de "vrais" fichiers xlsx est une priorite, il vaut mieux passer par ExcelPackage, ou par NPOI pour des fichiers xls

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  6. #6
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Not Found

    The requested URL /articles/aspnetexcel was not found on this server.
    Sinon je suis plus qu'intéressé par cet article ; )

    Autant pour générer des fichiers Excel que pour les lires


    Edit: La même chose pour les fichiers PDF serait pas mal aussi dailleurs. Est-ce qu'il y a déjà quelque chose de fait?

  7. #7
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Ca va vraiment pas la tete, en ce moment

    Vivement la fin de la mission que j'aie un peu de bande pasante au niveau du cerveau

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    Si tu as l'occasion de tester un export excel avec office 2007, tu pourras voir toi-même, cela sera plus facile à comprendre que d'essayer de l'expliquer. Cela fonctionne mais du point de vue utilisateur non initié c'est un peu dangereux car il a des messages d'avertissement. Jette un coup d'oeil si tu peux.

    Pour le reste, article très sympathique pour les développeurs.

    Merci à toi

  9. #9
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par Leelith Voir le message
    Edit: La même chose pour les fichiers PDF serait pas mal aussi dailleurs. Est-ce qu'il y a déjà quelque chose de fait?
    Il y'a quelques tutos disponibles, plutot en anglais, d'ailleurs...Pour le moment, je n'ai jamais eu a regler le pb, donc je suis pas expert


    Citation Envoyé par tortuegenie Voir le message
    Si tu as l'occasion de tester un export excel avec office 2007, tu pourras voir toi-même, cela sera plus facile à comprendre que d'essayer de l'expliquer.
    Je te rassure, j'ai bien compris le pb ...

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    Petite question sur l'extraction Excel, avec renderControl au niveau d'Internet Explorer 6.

    J'ai un bouton pour faire mon extraction, tout fonctionne très bien sous IE7,8, Firefox, Chrome mais alors sous IE6, il ouvre une nouvelle fenêtre, charge bien ce qu'il faut puis referme la fenêtre, quelqu'un peut'il m'expliquer ce probleme. Je suppose que c'est encore une coquille à IE6 mais comment la contourner?

    Merci d'avance

Discussions similaires

  1. Comment générer un fichier Excel avec plusieurs feuilles ?
    Par sinoun dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 15/03/2018, 15h16
  2. Importer un fichier Excel en asp.net
    Par Hendy dans le forum Développement Web avec .NET
    Réponses: 4
    Dernier message: 27/06/2014, 14h59
  3. Réponses: 7
    Dernier message: 20/09/2012, 13h13
  4. Comment générer un fichier pdf avec asp et c#
    Par Berenger Nana dans le forum C#
    Réponses: 3
    Dernier message: 30/06/2011, 11h49
  5. Générer un fichier excel - asp.net 1.1
    Par p1k1 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 30/08/2007, 17h05

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