Transférer les données d'un DataGridView dans un fichier Excel [Résolu]

Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
- - Dernière réponse : cs_warzet
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
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.
Afficher la suite 

Votre réponse

20/25 réponses

Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
66
Date d'inscription
jeudi 1 septembre 2011
Dernière intervention
22 juillet 2014
0
Merci
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
Commenter la réponse de cs_BinKentsu
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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.
Commenter la réponse de cs_warzet
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
66
Date d'inscription
jeudi 1 septembre 2011
Dernière intervention
22 juillet 2014
0
Merci
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
Commenter la réponse de cs_BinKentsu
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
Merci à vous tous pour vos précieux conseils, je vais m'y mettre pour rechercher mes erreurs. Merci encore
Commenter la réponse de cs_warzet
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
Bonjour,
tu n'auras pas à chercher beaucoup je les ai listées plus....


Whismeril
Commenter la réponse de Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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.
Commenter la réponse de cs_warzet
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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?
Commenter la réponse de cs_warzet
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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
Commenter la réponse de cs_warzet
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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?
Commenter la réponse de cs_warzet
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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.
Commenter la réponse de cs_warzet
Messages postés
12361
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Dernière intervention
25 juillet 2013
0
Merci
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
Commenter la réponse de cs_warzet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.