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

Windows Forms Discussion :

Exporter Datatable vers Excel


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut Exporter Datatable vers Excel
    Bonjour,

    Existe-t-il un moyen d'exporter rapidement le contenu d'un Datatable (créé par moi et qui contient plusieurs milliers de cellules) dans un fichier Excel ?

    Tout ce que je trouve sur le Web c'est des méthodes avec des requêtes (c'est bon pour Access mais pas pour un Datatable) ou des boucles pour écrire cellule par cellule (c'est lent, très lent, trop lent).

    Merci d'avance pour vos idées.

  2. #2
    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
    Points : 2 927
    Points
    2 927
    Par défaut
    Tu peux te connecter au fichier Excel avec une connexion OleDb.
    A partir de cette connexion, tu dois pouvoir remplir une feuille avec ton DataTable.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 125
    Points : 59
    Points
    59
    Par défaut
    bonjour,
    pour ton problème un petit tour ici http://faqvbnet.developpez.com/?page...dgrid_to_excel devrait faire l'affaire

  4. #4
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Merci de vos réponses.

    @ rochdi123 :

    Merci pour le lien mais je connaissais. Malheureusement cette méthode effectue le transfert cellule par cellule. Ce qui est beaucoup trop lent pour moi.

    @ Skalp :

    J'ai fais quelques recherche sur la piste que tu me propose, mais je dois avouez que je n'y arrive pas du tout . Voici ce que j'ai pour le moment:

    Code VB.NET : 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
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
     
            Dim xlApp As Excel.Application
            Dim xlWorkBook As Excel.Workbook
            Dim xlWorkSheet As Excel.Worksheet
            Dim misValue As Object = System.Reflection.Missing.Value
     
            xlApp = New Excel.Application
            xlApp.Visible = False
            xlWorkBook = xlApp.Workbooks.Add(misValue)
            xlWorkSheet = xlWorkBook.Worksheets("sheet1")
     
            myDataTable 'qui est remplie avec mes données
     
            'ici, j'aimerais effectuer une requête du type:
            'SELECT a, MAX(data1) AS b, MAX(data2) AS c FROM myDataTable
            'et mettre le résultat dans mon fichier excel
     
            xlWorkSheet.SaveAs("C:\Documents and Settings\nomvariable.xls")

    Comme tu peux le voir, je patauge complètement pour ce qui est d'effectuer une requête sur mon DataTable et d'enregistrer directement le résultat en Excel.

    Merci.

  5. #5
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Je sais qu'il y a aussi ceci:http://faqvbnet.developpez.com/?page...xcel_transfert mais cela permet le transfert d'une base de données SQL Server à Excel et je ne sais pas s'il y a moyen de transposer la connexion à un DataTable.

  6. #6
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    A force de recherche, j'envisage la solution suivante:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim TableConnection As New SqlConnection()
     
    TableConnection.ConnectionString ="ce qu'il me manque"
    Dim TableAdapter As SqlDataAdapter = New SqlDataAdapter("SELECT a, MAX(data1) AS b, MAX(data2) AS c FROM myDataTable", TableConnection)
    TableAdapter.Fill(myTable)
    TableConnection.Close()

    Cette solution est-elle faisable? Si oui, que dois-je mettre comme paramètres dans ma ConnectionString?

    Merci d'avance.

  7. #7
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Apparemment, la piste que j'envisageais ci-dessus n'est pas possible. Il en va de même pour DataTable.Select() et DataTable.Compute().

    Je ne vois pas d'autre solution que de coder moi même la requête en parcourant mon DataTable.

    Quelqu'un aurait-il une idée pour cette horreur ... heu ... cette solution?

    Thanks!

  8. #8
    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
    Points : 2 927
    Points
    2 927
    Par défaut
    Il y aurait peut-être la solution du presse-papier Windows.
    Voir l'article de bidou : Piloter Office

  9. #9
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour Skalp,

    Pourrais-tu, s'il-te-plaît, m'en dire plus sur l'idée que tu as sur la solution du presse-papier Windows dont tu me parles ? Je ne vois pas trop où tu veux en venir.

  10. #10
    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
    Points : 2 927
    Points
    2 927
    Par défaut
    Une solution serait effectivement de parcourir ta DataTable avec une boucle et de générer une chaîne du même type que ci-dessous pour pouvoir utiliser le presse-papier (voir le code ci-dessous) :
    Citation Envoyé par Support Microsoft
    Utilisation du Presse-papiers Windows
    Vous pouvez utiliser le Presse-papiers Windows pour transférer des données dans une feuille de calcul. Pour coller des données dans plusieurs cellules d'une feuille de calcul, vous pouvez copier une chaîne dans laquelle les colonnes sont séparées par des caractères de tabulation et les lignes par des retours chariot. Le code ci-dessous montre comment Visual C# .NET peut utiliser le Presse-papiers Windows pour transférer des données vers Excel :

    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
    // Copier une chaîne dans le Presse-papiers Windows.
    string sData = "FirstName\tLastName\tBirthdate\r\n"  +
    	"Bill\tBrown\t2/5/85\r\n"  +
    	"Joe\tThomas\t1/1/91";
    System.Windows.Forms.Clipboard.SetDataObject(sData);
     
    // Créer un nouveau classeur dans Excel.
    m_objExcel = new Excel.Application();
    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
    m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
     
    // Coller les données en partant de la cellule A1.
    m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
    m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    m_objRange = m_objSheet.get_Range("A1", m_objOpt);
    m_objSheet.Paste(m_objRange, false);
     
    // Enregistrer le classeur et quitter Excel.
    m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
    	m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
    	m_objOpt, m_objOpt);
    m_objBook.Close(false, m_objOpt, m_objOpt);
    m_objExcel.Quit();
    Remarque : m_objOpt = Type.Missing.
    Plus d'informations ici.

  11. #11
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Merci pour ta proposition Skalp, mais le fait de faire DataTable->TextFile->ExcelFile me fait perdre encore du temps.
    J'ai donc opté pour la solution suivante:
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            j = 0
            For Each myColumn2 In Result.Columns
                xlWorkSheet.Cells(1, j + 1) = Result.Columns(j).ColumnName
                j = j + 1
            Next
     
            i = 0
            For Each myRow2 In Result.Rows
                j = 0
                For Each myColumn2 In Result.Columns
                    xlWorkSheet.Cells(i + 2, j + 1) = Result.Rows(i).Item(j)
                    j = j + 1
                Next
                i = i + 1
            Next
    Cela me permet de faire DataTable->ExcelFile directement. Cela mets 1 minute au lieu des 20 que j'avais avec ma version ultérieure. J'aurais voulu quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlWorkSheet.Add(Result)
    et qui ne prenne que 3-4 secondes mais cela n'a pas l'air d'être possible. Je laisse le post ouvert dans le cas ou quelqu'un trouverait cette solution "magique" .

    Merci à tous.

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Si tu veux avoir une solution permettant de générer un fichier excel de façon instantané, il n'y a qu'une solution : faire une transformation xsl.
    Voici un lien pour faire ce que tu veux :
    http://aspalliance.com/471_Convert_X...heet_Using_XSL

  13. #13
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Merci pour ta réponse tomtom potter.

    Je devrais donc faire DataTable -> XML -> ExcelFile? Je dois avouer que je ne m'y connais pas du tout en XML et j'ai peur que le passage de ma DataTable en XML ne prenne du temps. Mais je vais investiguer ta solution. Je reste cependant ouvert à tout autre proposition.

    Merci et bonne journée.

  14. #14
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    bonjour tout lemonde
    la solution deCHRIS@XEROS elle est parfaite le l'ai testé ça marche bien mais le seul souci que j'ai c'est que les champs de la derniere ligne ne s'affiche pas

  15. #15
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour bendsiham,

    Pour ton problème de dernière ligne qui ne s'affiche pas, vérifie bien que tu parcours ton fichier Excel à partir des coordonnées (ligne, colonne) (1,1) et que tu parcours le DataTable à partir des coordonnées (ligne, colonne) (0,0).

    Vérifie aussi que tu ne dépasses pas la limite de ligne d'Excel (65536 lignes par feuille pour Excel 2003 mais je ne connais pas la limite des versions 2007 et 2010).

    Désolé pour la réponse tardive mais j'étais en vacances

    Bonne journée.

  16. #16
    Membre à l'essai Avatar de DocBS
    Homme Profil pro
    Ingénieur Recherche
    Inscrit en
    Mai 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Recherche
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 7
    Points : 12
    Points
    12
    Par défaut Datatable vers Excel via Presse-papier
    Bonjour à tous ceux qui suivent encore cette discussion.

    J'avais également besoin d'une solution rapide pour transférer un Datatable vers Excel. La solution de la double boucle
    avec écriture dans chaque cellule de la feuille Excel est très lente quand on a beaucoup de données. J'ai cherché un peu
    du côté ASP.NET avec transformation XSL, mais ça m'a pris trop de temps et j'ai abandonné.
    La solution que j'ai trouvé utilise le presse-papier, mais via le biais d'une RichTextBox. En effet, je transforme la
    Datatable en lignes de texte dans la RichTextBox, puis je fait un copier coller de ce texte vers un tableau Excel.
    C'est très rapide.

    La création des lignes de texte utilise la fonction String.Join, qui effectue une boucle implicite sur tous les éléments
    d'un array, et des expressions lambda dans la fonction Select, pour produire le texte pour chaque élément.
    On obtient un code très compact.
    J'ai découvert cette façon de faire grâce à jwavila dans sa publication sur WordPress :
    http://http://vb2010.wordpress.com/2...atable-to-csv/

    Dans les lignes de texte, j’utilise des tabulations pour séparer les données et je remplace la virgule décimale par
    un point, sinon ça pose des problèmes à Excel.

    Voici le code :

    Code VB.NET : 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
    Dim datable1 as new System.Data.DataTable
    Dim RichTextBox1 as new System.Windows.Forms.RichTextBox ' déclaration explicite pour être complet. '
    'Elle peut être implicite en créant une RichTextBox dans un formulaire'
    Dim out as String
    Dim excelapp As New Excel.Application
    Dim wb As Excel.Workbook
    Dim ws As Excel.Worksheet
     
    out = String.Join(vbTab, datatable1.Columns.Cast(Of DataColumn)().Select(Function(d) d.ColumnName).ToArray())
    RichTextBox1.AppendText(out + vbNewLine)
    For Each rw As DataRow In datatable1.Rows
         out = String.Join(vbTab, rw.ItemArray.Select(Function(s) s.ToString).ToArray)
         out = out.Replace(",", ".")
         RichTextBox1.AppendText(out + vbNewLine)
    Next
     
    wb = excelapp.Workbooks.Add
    ws = wb.Worksheets.Add()
    RichTextBox1.SelectAll()
    RichTextBox1.Cut()   'plus besoin du texte après, donc couper au lieu de copier'
    ws.Range("A1").Select()
    ws.Paste()

  17. #17
    Nouveau Candidat au Club
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juin 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Algérie

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Juin 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Exportation rapide D'une dataTable vers un fichier Excel
    Bonjour,
    J'avais exactement le souci que @Xeron et en voyons les réponses proposées d'exporter la dataTable vers un fichier excel ou une presse papier pour ensuite l'exporter de là vers Excel, je l'ai trouvé tiré par les oreilles.
    J'ai donc fouiné encore plus et j'ai fini par trouver une solution qui m'a beaucoup aidé et qui a bien optimisé le temps voir la réponse 7 du lien suivant:
    https://stackoverflow.com/questions/...table-to-excel

    Bon courage

Discussions similaires

  1. export datatable vers excel
    Par mattmax dans le forum VB.NET
    Réponses: 5
    Dernier message: 19/12/2012, 18h32
  2. exporter une datatable vers excel
    Par lady sina dans le forum JSF
    Réponses: 5
    Dernier message: 20/06/2012, 10h38
  3. exporter un rich datatable vers excel
    Par khaled84 dans le forum Documents
    Réponses: 6
    Dernier message: 17/01/2011, 18h43
  4. C#: exportation d'un DataTable vers Excel
    Par Leelith dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/02/2010, 19h05
  5. Export ASP vers excel
    Par steph04 dans le forum ASP
    Réponses: 4
    Dernier message: 04/05/2005, 01h22

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