Transférer les données d'un DataGridView dans un fichier Excel

Résolu
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 - 25 juin 2012 à 09:12
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 - 13 août 2012 à 09:32
Bonjour à tous,
j'ai un gros soucis, et je sollicite votre aide en cela. J'ai un DataGridView et je souhaiterais en transférer les données dans un fichier Excel pour impression: par votre aide, j'ai fait ceci.
[using System.Reflection;
using ExcelApplication = Microsoft.Office.Interop.Excel.Application;
]
[ #region DECLARATION
private string UnFichier = "Bulletin.xls";
private string NomEntete = "Notation";
#endregion
]
[#region ExporterGridVersExcel Surchargé Type #1
///<summary>
///Permet d'exporter un DataGrid vers excel
///</summary>
/// Data Grid Source des données à Exporter vers Excel


///Fichier Excel de destination des données


///Libellé de l'en-tête du fichier à générer


public void ExporterGridVersExcel(DataGridView dgView, String unFichier, string strEnteteDeFichier)
{
int i = 0;
int j = 0;
ExcelApplication excel = new ExcelApplication();
Microsoft.Office.Interop.Excel.Workbook exbook = (Microsoft.Office.Interop.Excel.Workbook)excel.Workbooks.Add(Missing.Value);
Microsoft.Office.Interop.Excel.Worksheet exsheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveSheet;

try
{
//Mise en forme de l'en-tête de la feuille Excel
exsheet.Cells[1, 1] = strEnteteDeFichier;
Microsoft.Office.Interop.Excel.Range r = exsheet.get_Range(Convert.ToChar(65 + i).ToString() + "1", Missing.Value);
r.Interior.ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;
r.Font.Bold = true;
r.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
r.EntireColumn.AutoFit();//Fin de la mise en forme de l'en-tête.

foreach (DataGridViewColumn ch in dgView.Columns)
{
if (exsheet.Cells[j, i] != null)
{
r = exsheet.get_Range(Convert.ToChar(65 + i).ToString() + "1", Missing.Value);
exsheet.Cells[2, i + 1] = ch.Name.Trim();
r.Interior.ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;
r.Font.Bold = true;
r.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
r.EntireColumn.AutoFit();
i++;
}
}
j = 3;

foreach (DataGridViewRow uneLigne in dgView.Rows)
{
i = 1;
foreach (DataGridViewColumn uneColonne in dgView.Columns)
{
if (exsheet.Cells[j, i] != null)
{
r = exsheet.get_Range(Convert.ToChar(65 + i - 1).ToString() + j.ToString(), Missing.Value);
exsheet.Cells[j, i] = "'" + uneLigne.Cells[uneColonne.Name].Value.ToString().Trim();
r.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
r.EntireColumn.AutoFit();
i++;
}
}
exsheet.Columns.AutoFit();
j++;
}
exsheet.SaveAs(unFichier, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
excel.Quit();
}
catch (Exception ex)
{
throw (ex);
}
finally
{
excel.Quit();
}
}

#endregion]

[ private void btnExcel_Click(object sender, EventArgs e)
{
ExporterGridVersExcel(dgvMoyenne,UnFichier,NomEntete);
}
]

Mais j'obtiens l'erreur suivante:

[Impossible d'effectuer un cast d'un objet COM de type 'Microsoft.Office.Interop.Excel.ApplicationClass' en type d'interface 'Microsoft.Office.Interop.Excel._Application'. Cette opération a échoué, car l'appel QueryInterface sur le composant COM pour l'interface avec l'IID '{000208D5-0000-0000-C000-000000000046}' a échoué en raison de l'erreur suivante : n’a pas pu être trouvé. (Exception de HRESULT : 0x80030002 (STG_E_FILENOTFOUND)).]/quote

Quelqu'un peut-il me dire d'où me provient cette erreur?
Merci beaucoup à tous.

25 réponses

Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
25 juin 2012 à 12:12
Bonjour

je cite NHenry

[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list



Regarde particulièrement le point 2.
Du coup, je n'ai pas regardé ton code, voici une sourcepour faire un peu de tout avec excel, tu y trouveras peut-être ton bonheur

Whismeril
0
cs_BinKentsu Messages postés 65 Date d'inscription jeudi 1 septembre 2011 Statut Membre Dernière intervention 22 juillet 2014 8
26 juin 2012 à 14:48
Bonjour,

Indique nous à quel niveau ton erreur s'est produite s'il te plait, là on cherche une aiguille dans une botte de foin...

PS : Il suffit de double cliquer sur l'erreur pour te ramener à la source de ton erreur, et indique là nous.

BinKentsu
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
27 juin 2012 à 09:10
Merci pour à tous pour vos conseils éclairés, aussi je voudrais savoir, lorsque je choisis les quotes [ ] [], dois-je glisser mon code entre [] ou alors entre le groupe [] []. Merci.
En ce qui me concerne, j'ai inséré mon code entre [].
Pour l'erreur, elle se produit lorsque je click sur le bouton de transfert de données vers excel "bntExcel". Merci encore.
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
27 juin 2012 à 10:51
Bonjour,

dois-je glisser mon code entre [] ou alors entre le groupe [] []

voir :
Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )


Il me semble que ton problème n'est pas résolu,
Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés.



Whismeril
0

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

Posez votre question
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
27 juin 2012 à 11:07
Un première remarque

            catch (Exception ex)
            {
                throw (ex);
            }


la clause catch sert à récupérer une erreur pour la traiter.
Ton traitemet consiste à regéner cette erreur.
Ca ne sert à rien.

Whismeril
0
cs_BinKentsu Messages postés 65 Date d'inscription jeudi 1 septembre 2011 Statut Membre Dernière intervention 22 juillet 2014 8
27 juin 2012 à 11:10
Non mais tu nous as pas répondu :s
Surligne nous la ligne qui envoie l'erreur, ne nous dit pas simplement à quel moment l'erreur arrive, mais montre nous la ligne de code qui pose problème.

BinKentsu
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
27 juin 2012 à 11:31
J'ai ajouté
            excel.Visible = true;

pour voir ce qui se passe.

A mon premier passage ici
foreach (DataGridViewColumn ch in dgView.Columns) 
{ 
if (exsheet.Cells[j, i] != null) 


i et j vallent 0, la cells[0,0] n'existe pas ça beug.
J'ai mis 2 et 2 pour aller voir plus loin.

Tu devrais mettre tes autofit() une seule fois à la fin, là ça le fait à chaque itération, tu perds du temps d'exécution.



Et enfin à cette ligne

exsheet.Cells[j, i] = "'" + uneLigne.Cells[uneColonne.Name].Value.ToString().Trim(); 


si la cellule du datagridview est vide ça plante,
à remplacer par ça par exemple
if (.Cells[uneColonne.Name].Value != null) exsheet.Cells[j, i] = "'" + uneLigne.Cells[uneColonne.Name].Value.ToString().Trim(); 


C'est tout ce que j'ai trouvé.
Je n'ai pas eu le même texte d'erreur que toi, je suis sous VS2008 Express

Whismeril
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
27 juin 2012 à 11:35
Une dernière chose,
les clauses
try
{

}
catch
{

}
finally
{

}

Peuvent être handicapante pour débeuguer, en effet en cas d'erreur tu arrives systématiquement dans la clause catch, sans forcément savoir d'ou ça vient.
Dans ces cas là, le temps de trouver l'erreur j'enlève les clause (je les commente).
Du coup quand ça plante l'environnement te positionne direct sur la ligne qui beug, tu peux survoller les variables et voir ce qui ne va pas.

Whismeril
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
4 juil. 2012 à 08:46
Merci à vous tous pour vos précieux conseils, je vais m'y mettre pour rechercher mes erreurs. Merci encore
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
4 juil. 2012 à 13:52
Bonjour,
tu n'auras pas à chercher beaucoup je les ai listées plus....


Whismeril
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
6 juil. 2012 à 09:08
Est-il possible que le fait d'avoir deux versions de VS2010 et VS2008 puisse créer ce genre de problème, car j'ai 2 versions installées, VS2008 Pro et VS2010 Ultimate. Voici que j'ai télécharger des codes sources du même type, et lorsque j'essaie de le lancer, j'ai le même message d'erreur.
D'autre part, j'ai suivi vos conseils, j'ai par exemple éliminé clause []try-catch/quote et alors la même erreur s'est affichée au niveau
excel.Visible=true;

Raison pour moi d'être inquiet. Merci d'avance de bien vouloir m'aider.
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
6 juil. 2012 à 19:52
Bonsoir je ne peux pas te dire pour les deux versions.

Pour le excel.visible = true;
Je suppose que tu l'as bien mis après avoir déclaré la variable. Quelle version d'excel as tu sur ton Pc?


Whismeril
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
9 juil. 2012 à 08:49
Oui bien sur que dans mes référence, j'ai ajouté la version 2003. Mais je pense que mon problème doit être plus profond; compte tenu du fait que des codes sources sur le sujet, que j'ai téléchargé pour essai ne fonctionnent pas sur mon pc. En avez-vous une idée?
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
10 juil. 2012 à 12:16
Bonjour,

malheureusement non.

A par les petites erreurs que je t'ai signalées ça marche chez moi.
XP, VS2008 Express et Office 2003 (je ne l'ai pas réessayé au boulot).

Si tu as un deuxième PC sous la main, essaye avec un seul environnement Visual Studio


Whismeril
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
10 juil. 2012 à 12:20
Pour ton référencement à Excell, est-ce Interop.Microsoft.Office.Core.dll
et Microsoft.Office.Interop.Excel.dll?
De mémoire c'est comme ça chez moi.

Whismeril
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
11 juil. 2012 à 08:39
Non je n'ai pour mon référencement que Microsoft.Office.Interop.Excel.dll; alors je vais donc ajouter la première référence. Mais je pense qu'il me l'aurais signalé autrement, n'est-ce-pas? Merci pour tout, je vais m'y mettre. Bonne journée
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
11 juil. 2012 à 08:46
Mais je viens de me rendre compte que je ne trouve pas la référence Interop.Microsoft.Office.dll dans mes sources d'ajout de référence, comment faites-vous pour cela?
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
11 juil. 2012 à 09:10
Je viens d'ajouter la référence en question à partir d'un code source, à l'exécution, j'ai toujours le même message. J'utilise VS2008 Pro Access 2003, mais j'ai également SV2010 Ultimat installé sur la même machine. Davrais-je le désinstaller?
Peut-on générer un setup avec VS2008 Express? Que non à ma connaissance. Vous comprenez mon inquiétude. Merci pour tout.
0
Whismeril Messages postés 17814 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2022 618
11 juil. 2012 à 10:00
Bonjour,

pour le setup avec VS express, je n'ai pas essayé, mes dev sont prévue pour des pc ayant la framework donc je copie colle le fichier bin. Et la version Express je l'ai à la maison.

Quand au fait que deux versions de VS pourraient causer des conflits je n'en ai pas la moindre idée.

Quelle est la ligne ou l'erreur se produit, et sous quel environnement fait tu tourner ce code?


Whismeril
0
cs_warzet Messages postés 99 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 25 juillet 2013 1
11 juil. 2012 à 10:13
L'erreur produite est
Impossible d'effectuer un cast d'un objet COM de type 'Microsoft.Office.Interop.Excel.ApplicationClass' en type d'interface 'Microsoft.Office.Interop.Excel._Application'. Cette opération a échoué, car l'appel QueryInterface sur le composant COM pour l'interface avec l'IID '{000208D5-0000-0000-C000-000000000046}' a échoué en raison de l'erreur suivante : n’a pas pu être trouvé. (Exception de HRESULT : 0x80030002
et celle ci se produit au niveau
excel.Visible = true;
et la platform est .NET framework 3.5. Merci
0