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

VB.NET Discussion :

Copier/Coller depuis un datagrid view vers Excel : Traitement long


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut Copier/Coller depuis un datagrid view vers Excel : Traitement long
    Bonjour à tous,

    J'ai fait un programme qui permet d'exporter vers excel depuis un datagridview. Pour un petit jeu de ligne je n'ai aucun problème mais lorsque j'ai environ 50000 lignes le traitement n'aboutit pas.

    Voila le code que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Me.DataGridView1.SelectAll()
     
    ' Add the selection to the clipboard.
                Clipboard.SetDataObject(Me.DataGridView1.GetClipboardContent())
                wsExcel.PasteSpecial(NoHTMLFormatting:=True)
    La partie Clipboard.SetDataObject(Me.DataGridView1.GetClipboardContent()) met déjà un peu de temps mais ça passe encore mais par contre le PasteSpecial lui ne se fait pas.

    Comment pourrais-je augmenter la rapidité de traitement ?

    Merci par avance pour vos retour.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .net - Office - Quadiant
    Inscrit en
    Février 2020
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Développeur .net - Office - Quadiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2020
    Messages : 585
    Points : 1 080
    Points
    1 080
    Par défaut
    Bonjour,

    Ne serait-il pas plus rapide de faire un pilotage d'Excel pour remplir celui-ci ?

    ONTAYG

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Bonjour ONTAYG,

    Et bien en principe c'est ce que j'aurai fait, cela dit ce datagridview est remplit de différente manière selon les paramètres. De plus si tu fait allusion à une boucle qui balaye le datagridview pour alimenter chaque cellule d'excel, ceci est beaucoup trop long.

    Le copier coller du gridview était pour moi la solution la plus rapide, donc si tu as une autre astuce...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .net - Office - Quadiant
    Inscrit en
    Février 2020
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Développeur .net - Office - Quadiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2020
    Messages : 585
    Points : 1 080
    Points
    1 080
    Par défaut
    Re,

    Désolé, je n'avais pas d'autres solutions, mais vu que tu as testé en pilotant Excel, je ne sais pas quoi dire d'autre. Désolé

  5. #5
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Bonjour,

    Le copier-coller fonctionne "pas trop mal" (quid des données numériques, dates ?) sur de petites quantités de données, mais il est limité par la mémoire et va forcément quand on ajoute la consommation d'Excel, rapidement atteindre la saturation. Ce qui impliquera une utilisation du fichier d'échange, qui même sur un SSD va nettement ralentir le traitement.
    La bonne solution, c'est d'utiliser des outils prévus pour.
    Il y a l'OpenXML de Microsoft, ou bien OleDB (on lit et écrit dans Excel comme avec une BD).
    Personnellement j'utilise cette dernière option, pour des imports / exports. C'est rapide, et relativement simple à mettre en œuvre.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Je comprends bien, mais le transfert depuis un datagridview peut-il se faire rapidement via les méthodes que tu décris ?
    Je pose la question car sauf erreur de ma part la récupération des informations depuis le datagridview ne pourra se faire que cellule par cellule ligne par ligne. (a moins qu'il y ait une autre astuce) et la sur un jeu de données volumineux c'est plutôt lent. j'avais une fois tenté de cocher environ 10000 lignes via une boucle dans un datagridview et c’était très long.

    J'ai opté pour le copier coller car le selectAll était plutôt efficace.

    je comprend bien le fonctionnement via oledb mais j'ai en revanche un peu plus de mal a voir comment le mettre en place...
    un coup de pouce serait bienvenue...

    Pour info j'appelle une procédure stockée dans sql server et je stocke le résultat dans un datagridview...

    merci par avance

  7. #7
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Cocher 10000 lignes peut être long selon la manière dont tu le traites.
    Déjà si tu dois travailler sur des DataGridView "massives", il faut activer le DoubleBuffering pour l'affichage, sinon tu va avoir du mal à défiler les listes. Mais çà ne joue pas ou peu (dans le mauvais sens en plus) sur la vitesse de remplissage.
    En revanche pense à masquer la DataGridView (visible false) durant le traitement, tu gagneras vraiment du temps, le système ne gérant plus alors la mise à jour de l'affichage à chaque ajout d'enregistrement.

    Pour le remplissage, traite par ligne (row) au lieu de cellule.
    Même chose à la lecture (For Each row in DatagridView.rows...).

    Mais dans le cas qui nous intéresse, même pas la peine de s'embêter.
    Pour un remplissage depuis Excel, c'est très simple avec OleDB. Exemple (loadedFile étant le nom du fichier choisi via un OpenFileDialog) :
    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
            'déclaration du dataset
            Dim dat01 As DataSet
            dat01 = New DataSet
     
            'déclaration et utilisation d'un OLeDBConnection
            Using Conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Trim(loadedFile) & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1;CharacterSet=65001;""")
     
                'déclaration du DataAdapter. Notre requête sélectionne toute les cellules de la Feuille 01_COMMERCE
                Using Adap As OleDbDataAdapter = New OleDbDataAdapter("select * from [01_COMMERCE$]", Conn)
                    'Chargement du Dataset
                    Adap.Fill(dat01)
                    'On Binde les données sur le DGV
                    dgv_XLS01.DataSource = dat01.Tables(0)
                End Using
            End Using

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Merci pour la réponse mais je crois que ton code fonctionne à l'inverse de ce que je veux faire.

    Je ne veux pas remplir un datagridview a partir d'un fichier excel mais plutôt l'inverse.

    Alimenter un fichier excel à partir d'un datagridview.

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Il n'y a pas de secret.
    Je n'ai pas pu trouver l'implémentation de GetClipboardContent mais j'imagine qu'il doit également boucler pour remplir le presse-papier.
    Sauf qu'il le fait de manière plus efficace.

    L'une des méthode les plus efficaces pour réduire le temps que l'utilisateur passe à attendre est de faire paralléliser ce qui peut l'être.
    Donc tu peux utiliser plusieurs thread et leur répartir le parcourir de ta grille.

    De la même manière avec OpenXML tu peux (en théorie car je ne l'ai jamais testé) paralléliser l'insertion dans Excel

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Sans aucun doute, la parallélisation est efficace, mais dans mon cas, je ne vois pas quoi paralléliser. c'est juste le bouton exporter qui ouvre et copie excel...

    Ou alors je peux peut-être essayer d'envoyer directement le résultat de la requête dans excel sans passer par le gridview.... avec par exemple un reader... ca peut etre une solution de contournement mais du coup qui fait faire deux fois le travail de connexion à la bdd ( pour l'affichage dans le gridview et l'autre pour l'export).

  11. #11
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Certes, tu ne cliques qu'une seule fois sur le bouton.

    Mais tu as 10000 lignes à lire dans une grille.
    Tu ne vois toujours pas ce que tu peux paralléliser ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    J'avoue avoir un peu de mal.
    Si la lecture de chaque ligne envoie dans excel on ne peut pas le paralelliser.

    Je veux bien que tu m'explique.

    :-)

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Le principe est le même qu'avec un copier coller.

    Que fait un copier-coller ?
    Il copie dans le presse papier (donc en mémoire) pour ensuite coller dans Excel.
    Sauf que la mémoire du presse-papier est limitée.

    Mais une dizaine de Thread peuvent chacun lire 1000 lignes et les stocker dans un collection avec accès concurrent (recherche sur google).
    Tu ne seras limité que par les ressources de la machine.
    Attention toutefois au nombre de Thread que tu créée (si pas assez : ça ne va pas être assez efficace, si trop : ton OS va galérer et tu vas perdre le bénéfice de la parallélisation).

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Ok merci pour les précisions...

    je vais creuser dans ce sens.

Discussions similaires

  1. [XL-2010] Copier coller de dates de Word vers Excel (pro 2010)
    Par berjus dans le forum Excel
    Réponses: 2
    Dernier message: 11/02/2019, 08h31
  2. [XL-2013] Copier/coller d'un doc Word vers Excel
    Par Naaby dans le forum Excel
    Réponses: 4
    Dernier message: 02/05/2015, 09h07
  3. [PR-2010] VBA Copier / coller depuis Excel
    Par jouclar dans le forum VBA Project
    Réponses: 1
    Dernier message: 17/04/2013, 16h05
  4. Copier/coller depuis un StyledText vers Word
    Par p1xl_01 dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 08/01/2013, 18h06
  5. Réponses: 1
    Dernier message: 15/06/2009, 18h46

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