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

cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 - 6 mars 2013 à 09:54
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 - 14 mars 2013 à 08:04
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

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
6 mars 2013 à 10:48
Salut,

sans regarder le code, si ton problème vient d'un traitement trop long qui bloque l'appli, tu peux utiliser les threads.
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
6 mars 2013 à 11:54
Je ne crois pas que ce soit un problème de traitement long, mais plutôt un problème de boucles imbriquées. Merci
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
6 mars 2013 à 12:03
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.
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
6 mars 2013 à 13:54
Alors comment procéder pour le rendre beaucoup plus rapide donc. Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
6 mars 2013 à 21:21
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...
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
7 mars 2013 à 11:39
As tu essayé la méthode de ce post?

Whismeril
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
7 mars 2013 à 11:57
Whismeril
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
14 mars 2013 à 08:04
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
0
Rejoignez-nous