Méthode plus rapide de transfert de données d'un DataGridView vers Excel

Signaler
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
-
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
-
Bonjour à tous,
j'ai un gros soucis avec mon code de transfert de données vers Excel.En effet,on utilise ce code
            #region FICHE PROFESSEUR PRINCIPAL

            else if (this.btnImprimer.BackColor == Color.Green)
            {
                try
                {
                    //Start Excel and get Application object.
                    oXL = new Microsoft.Office.Interop.Excel.Application();
                    //oXL.Visible = true;

                    //Get a new workbook.
                    //oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(System.Reflection.Missing.Value));
                    oWB = oXL.Workbooks.Open(Application.StartupPath + @"/Impressions/Fiche_pp.xlsx", M, M, M, M, M, M, M, M, M, M, M, M, M, M);
                    oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;
                    oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.Sheets[1];
                    oSheet.Name = "Feuil1";
                    oSheet.Activate();
                    foreach (DataGridViewColumn col in dgvNotes.Columns)
                    {
                        if (oSheet.Cells[4, 1] != null)
                        {
                            oRng = oSheet.get_Range(Convert.ToChar(65 + i).ToString() + "1", M);
                            //oSheet.Cells[3, i + 1] = col.Name.Trim();
                            oRng.Interior.ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;
                            oRng.Font.Bold = true;
                            //oRng.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
                            //oRng.EntireColumn.AutoFit();
                            i++;
                        }
                    }
                    oSheet.Cells[1, 9] = "Ministère de l'Education Nationale";
                    oSheet.Cells[2, 9] = "Direction Régionnale de l'Education Nationale";
                    oSheet.Cells[3, 9] = "Collège Racine Divo";
                    oSheet.Cells[4, 9] = "Bp 103 Tel/Fax : 32.76.05.26";
                    oSheet.Cells[5, 9] = "E-mail : cracinedivo@yahoo.com";
                    oSheet.Cells[6, 9] = "D I V O";
                    oSheet.Cells[7, 9] = "République de Côte d'Ivoire";
                    oSheet.Cells[8, 9] = "Union - Discipline - Travail";
                    oSheet.Cells[9, 9] = "EFFECTIF : ";
                    oSheet.Cells[10, 9] = string.Concat("CLASSE : ", this.txtClasse.Text);
                    j = 1;

                    foreach (DataGridViewRow uneLigne in dgvNotes.Rows)
                    {
                        i = 2;
                        int h = 0;

                        if (oSheet.Cells[1, 1] != null)
                        {
                            oRng = oSheet.get_Range(Convert.ToChar(65 + h).ToString() + j.ToString(), M);
                            for (k = 0; k < dgvNotes.Rows.Count - 1; k++)
                            {
                                oSheet.Cells[k + 1, 1] = k + 1; //col.Name.Trim();
                                oRng.Interior.ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;
                                oRng.Font.Bold = false;
                                //oRng.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
                                //oRng.EntireColumn.AutoFit();
                                //k++;
                            }
                        }

                        foreach (DataGridViewColumn uneColonne in dgvNotes.Columns)
                        {
                            if (oSheet.Cells[j, i] != null)
                            {
                                oRng = oSheet.get_Range(Convert.ToChar(65 + i - 1).ToString() + j.ToString(), M);
                                if (uneLigne.Cells[uneColonne.Name].Value != null) oSheet.Cells[j, i] = "'" + uneLigne.Cells[uneColonne.Name].Value.ToString().Trim();
                                oRng.Font.Bold = false;
                                //oRng.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
                                //oRng.EntireColumn.AutoFit();
                                i++;
                            }
                        }
                        oSheet.Columns.AutoFit();
                        j++;
                    }
                    oXL.Visible = true;
                    //_MaFeuille = (_Worksheet)_MonClasseur.Sheets[NumeroFeuille];
                    oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.Sheets[2];
                    oSheet.Name = "FICHE";
                    oSheet.Activate();
                    //_MaFeuille.Name = NouveauNom;
                    //_MaFeuille.Activate();
                }
                catch
                {
                }
            }

            #endregion

pour transférer le contenu d'un DataGridView vers Excel. Quand tu as 232 ligne tu mets environs 6min ce qui à pour conséquence de bloquer l'application. Quelqu'un a-t-il une solution? Merci d'avance. Bonne journée

8 réponses

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Salut,

sans regarder le code, si ton problème vient d'un traitement trop long qui bloque l'appli, tu peux utiliser les threads.
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
Je ne crois pas que ce soit un problème de traitement long, mais plutôt un problème de boucles imbriquées. Merci
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Les boucles font parti du traitement ... et dans le code que tu nous présentes y'a même pas une profondeur de 3. Bon, peu importe.
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
Alors comment procéder pour le rendre beaucoup plus rapide donc. Merci
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
19
Salut,

as tu essayé sans les multiples appels aux oSheet.get_Range()
et aux styles des cellules comme Bold, ColorIndex ect...
Puisque tu fais cela cellule par cellule, c'est très long.
On peut appliquer des styles à toutes une ligne ou à toutes une région.

A part ça,
il y a une autre solution,
c'est de créer un fichier HTML contenant la grille que tu veux importer (<table>) avec style et couleurs.
Puis de lancer excel via un new Process().Start()
avec excel.exe pour filename et le fichier HTML comme param.
Excel le chargera très rapidement.

D'ailleurs tu peux essayer avec n'importe quel fichier HTML contenant une <TABLE> en faisant click droit dessus, puis "ouvrir avec" excel.

bye...
Messages postés
14771
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 septembre 2020
433
As tu essayé la méthode de ce post?

Whismeril
Messages postés
14771
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 septembre 2020
433
Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
Bonjour Yann_lo_san,
Je suis un grand débutant, aussi je n'arrive pas à faire un pas dans la méthode que tu m'as expliqué, aussi voudrais-tu m'aider sincèrement avec une ébauche de code? Merci pour ta sollicitude.
Bonjour à toi Whismeril, à ton lien indiqué, je n'ai trouvé qu'une vague explication pour mon modeste niveau en C#, aussi, voudrais-tu peut-être me l'expliquer, si tu en as le temps, Merci pour tout.
Bonne journée à vous