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

Contribuez .NET Discussion :

[C#] Méthode statique d'export dans Excel


Sujet :

Contribuez .NET

  1. #1
    Membre chevronné
    Profil pro
    Développeur freelance
    Inscrit en
    Août 2006
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : Août 2006
    Messages : 453
    Par défaut [C#] Méthode statique d'export dans Excel
    Bonjour,

    voici une méthode statique qui permet d'exporter une dataTable dans un fichier Excel.
    C'est assez basique, mais j'ai vu qu'il y avait bcp de questions sur le net donc je la mets à disposition.
    Cette méthode gère les entrées au delà des 65536 lignes en créant automatiquement des nouvelles feuilles.
    Rien de compliquer, mais si cela peut aider voici le code :
    Code c# : 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
    static public void ExportToExcel(String file, DataTable dt)
    {
        Excel.Application xlApp = null;
        Excel.Workbook xlBook;
        Excel.Worksheet xlSheet;
     
        try
        {
            if (dt != null)
            {
                xlApp = new Excel.Application();
                if (xlApp == null)
                {
                    throw new Exception("ERROR: EXCEL couldn't be started");
                }
     
                String newFile = Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file) + "_" + DateTime.Now.ToShortDateString().Replace("/", "") + ".xls");
     
                xlApp.Visible = false;
     
                object missing = Missing.Value;
                xlBook = xlApp.Workbooks.Add(missing);
     
                xlSheet = (Excel.Worksheet)xlBook.ActiveSheet;
     
                // On vérifie qu'il n'y a pas plus de 65535 lignes
                if (dt.Rows.Count < UInt16.MaxValue)
                {
                    /* Importation des données */
                    // Création des colonnes
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        xlSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                        // Remplissage du contenu
                        for (int y = 0; y < dt.Rows.Count; y++)
                        {
                            // Afin de configurer la cellule en mode texte
                            String text = "'" + dt.Rows[y].ItemArray[i].ToString();
                            ((Excel.Range)xlSheet.Cells[y + 2, i + 1]).Value2 = text;
                        }
                    }
                }
                else
                {
                    // Nombre de feuilles Excel
                    int nbSheet = dt.Rows.Count / UInt16.MaxValue;
                    if (dt.Rows.Count % UInt16.MaxValue > 0)
                        nbSheet++;
     
                    for (int i = xlBook.Sheets.Count; i <= nbSheet; i++)
                    {
                        xlBook.Sheets.Add(missing, missing, missing, missing);
                    }
                    for (int nb = 0; nb < nbSheet; nb++)
                    {
                        xlSheet = (Excel.Worksheet)xlBook.Sheets[nb + 1];
                        xlSheet.Name = dt.TableName + "_" + (nb + 1);
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            xlSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                            // Remplissage du contenu
                            for (int y = 0; y < UInt16.MaxValue; y++)
                            {
                                // On teste la fin de la DataTable
                                if (y + (nb * UInt16.MaxValue) >= dt.Rows.Count)
                                    break;
     
                                // Afin de configurer la cellule en mode texte
                                String text = "'" + dt.Rows[y + (nb * UInt16.MaxValue)].ItemArray[i].ToString();
                                ((Excel.Range)xlSheet.Cells[y + 2, i + 1]).Value2 = text;
                            }
                        }
                    }
                }
     
                // Sauvegarde du fichier
                xlSheet.SaveAs(newFile, missing, missing, missing, missing, missing, missing, missing, missing, missing);
            }
            else
                throw new Exception("Aucune donnée à afficher dans Excel");
        }
        finally
        {
            if (dt != null)
            {
                xlApp.Quit();
                xlSheet = null;
                xlBook = null;
                xlApp = null;
            }
        }
    }

    N'hésitez pas à me faire un retour si vous voyez des choses à améliorer.

    Mosco.

  2. #2
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (Exception e)
        {
            throw e;
        }
    à moins que ca soit délibérément voulu, tu peux mettre

    voire surtout virer le catch et laisser un try finally

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Louis-Guillaume Morand Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (Exception e)
        {
            throw e;
        }
    à moins que ca soit délibérément voulu, tu peux mettre

    Effectivement... pour l'explication : throw e va réinitialiser la pile (StackTrace) de l'exception, donc tu perds l'info sur le site d'origine de l'exception, alors que throw tout court conserve la pile


    Citation Envoyé par Louis-Guillaume Morand Voir le message
    voire surtout virer le catch et laisser un try finally
    Clair, parce qu'intercepter une exception pour la rebalancer sans rien faire d'autre, ça sert pas à grand chose

  4. #4
    Membre chevronné
    Profil pro
    Développeur freelance
    Inscrit en
    Août 2006
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : Août 2006
    Messages : 453
    Par défaut
    En fait, c'est lorsque je débugue pour avoir l'information de l'exception au niveau de ma méthode, mais oui j'ai oublié de le virer pour le code final.
    Je mets le code à jour.

    Merci pour les infos.

    Mosco

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par MoscoBlade Voir le message
    N'hésitez pas à me faire un retour si vous voyez des choses à améliorer.
    Hum, je ne pense que les performances ne seront pas terribles sur de grandes plages de données car l'écriture se fait cellule par cellule. As-tu essayé sur un grand nombre de lignes/colonnes ?

    Pour info, la version VB.NET existe sur la FAQ : Comment transférer un DataGrid dans Excel ?

  6. #6
    Membre chevronné
    Profil pro
    Développeur freelance
    Inscrit en
    Août 2006
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : Août 2006
    Messages : 453
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Hum, je ne pense que les performances ne seront pas terribles sur de grandes plages de données car l'écriture se fait cellule par cellule. As-tu essayé sur un grand nombre de lignes/colonnes ?
    Je suis d'accord les performances ne sont pas terribles
    Si vous avez des idées pour améliorer le morceau de code, n'hésitez pas à me faire part de vos remarques.
    Citation Envoyé par Skalp Voir le message
    Pour info, la version VB.NET existe sur la FAQ :
    Comment transférer un DataGrid dans Excel ?
    Je ne l'avais pas vu. Mon code gère plusieurs pages en revanche.

    Mosco

  7. #7
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Par défaut
    Effectivement, côté perf on peut difficilement faire pire
    Il faut coller le dataSet d'un coup. Voici un exemple :

    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
    /// <summary>
    /// Paste data into the specified Excel file
    /// </summary>
    /// <param name="oData">data to paste</param>
    /// <param name="fileName"></param>
    /// <param name="sheetIndex">Index of the sheet to paste data. Start to 1</param>
    /// <param name="topLeftCell">Top left cell to paste data (ex : "A1")</param>
    public void SaveDataToFile(object[,] oData, string fileName, int sheetIndex, string topLeftCell)
    {
    	workbooks = xlApp.Workbooks;
    	// Create workbook
    	workbook = workbooks.Add(Type.Missing);
    	sheets = workbook.Worksheets;
    	worksheet = (Worksheet)sheets.get_Item(sheetIndex);
    	range = worksheet.get_Range(topLeftCell, Type.Missing);
    	range = range.get_Resize(oData.GetLength(0), oData.GetLength(1));
     
    	// Copy data
    	range.set_Value(Type.Missing, oData);
     
    	// AutoFit columns to avoid 
    	worksheet.Columns.AutoFit();
    }
    Code source complet :
    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
    # // Code client :
    #
    # using (ExcelServer excelServer = new ExcelServer(ExcelServerLib.ExcelServer.Environement.Exe))
    # {
    # Excel.Application xlApp = excelServer.XlApp;
    # // ...do something with xlApp
    # } // here the process is closed and killed
    #
    #
    # // Dans vos projets, je vous conseille d'utiliser une classe intermédiaire, par exemple ExcelInterop, qui contiendra toutes vos fonctions métiers. Cette classe héritera de ExcelServer, et utilisera son constructeur, qui prend en paramètre le type d’environnement
    # public class ExcelInterop : ExcelServer
    # {
    # public ExcelInterop(): base(Environement.Exe)
    # {}
    #
    # // ici les fonctions métiers
    # }

Discussions similaires

  1. Champs blanc dans un etat exporté dans Excel
    Par DeveloMagaly dans le forum WinDev
    Réponses: 1
    Dernier message: 14/05/2008, 09h12
  2. [CSV] Format des données exportées dans Excel
    Par magsmile dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2007, 17h46
  3. Exporter dans Excel automatiquement.
    Par JarAsh dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/07/2007, 16h23
  4. choix de la feuille d'exportation dans Excel
    Par Mr White dans le forum Access
    Réponses: 4
    Dernier message: 02/12/2005, 18h41
  5. export dans Excel
    Par mathieu57 dans le forum C++
    Réponses: 4
    Dernier message: 17/10/2005, 13h07

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