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

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, 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

Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
8
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
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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.
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
8
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
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
Merci à vous tous pour vos précieux conseils, je vais m'y mettre pour rechercher mes erreurs. Merci encore
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
Bonjour,
tu n'auras pas à chercher beaucoup je les ai listées plus....


Whismeril
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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.
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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?
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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?
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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.
Messages postés
16023
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
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
Messages postés
99
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juillet 2013
1
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