LIRE UN FICHIER EXCEL PAR OLEDB EN .NET

cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016 - 30 août 2007 à 13:22
yakuzayang59 Messages postés 1 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 12 juillet 2011 - 12 juil. 2011 à 16:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43348-lire-un-fichier-excel-par-oledb-en-net

yakuzayang59 Messages postés 1 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 12 juillet 2011
12 juil. 2011 à 16:31
Bonjour, je déterre ce code pour une petite question. Est-il possible de faire une requête sur plusieurs feuilles?
cs_MoKaLux Messages postés 39 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 27 mars 2009 1
16 janv. 2009 à 02:11
Bonjour,
Avec le code que g posté juste au dessus, il m'est impossible de modifier les cellules de mon datagridview (manuel ou prog).
Quand je fais :
foreach (var ang in toutExcel.Where(a => a.myticker.EndsWith("LN")))
{
ang.mycourspyc /= 100;
}

Il me dit cannot modify because it is readonly.

Qq'un peut-il m'aider svp
wisdoom Messages postés 1 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 30 décembre 2008
30 déc. 2008 à 09:35
Excellent, juste ce que je cherchais !
cs_MoKaLux Messages postés 39 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 27 mars 2009 1
11 déc. 2008 à 20:53
voilà la solution :

var fonds = from fond in dt01.AsEnumerable()
where fond.IsNull("Ponds")==false &&
fond.Field<double>("Fonds") == 3
select new
{
myfond = fond.Field<double>("Fonds"),
myticker = fond.Field<string>("Tickers"),
myweight = fond.Field<double>("Ponds"),
myisin = fond.Field<string>("Id Isin"),
myname = fond.Field<string>("Name"),
};
dataGridView1.DataSource = fonds.ToList();


Magnifique merci beaucoup pour le début sans quoi rien n'aurait été possible...
Salutations à vous tous ...
cs_MoKaLux Messages postés 39 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 27 mars 2009 1
8 déc. 2008 à 22:14
Bonjour, j'ai avancé dans mes recherches et suis arrivé avec un code pour faire des recherche dans le datagridview avec linq :

private void button1_Click(object sender, EventArgs e)
{
DataTable dt =
GetFeuilleFichierExcel(jeudi.xls, "xxx");

if (dt != null && dt.Rows.Count > 0)
{
dataGridView1.DataSource = dt; // ok
}
// LINQ
var query = from ticker in dt.AsEnumerable()
where ticker.Field<string>("Tickers") == "MTP FP"
select new
{
//myfond = ticker.Field(dt.Columns[0]),
myticker = ticker.Field<string>("Tickers"),
myisin = ticker.Field<string>("Id Isin"),
myname = ticker.Field<string>("Name")
};

dataGridView2.DataSource = query.ToList();
}

Donc je query la datagridview1 et avec linq je retourne les resultats dans la datagridview2. SUPER...
Mais maintenant mon pb est comment puis-je faire des querry sur des int ? en effet mes query ne marchent qu'avec des strings ! par ex dans la colonne 3 j'ai des chiffres et je voudrais pouvoir selectioner seulement les chiffres qui dépassent 5%. Merci pour votre aide.
cs_MoKaLux Messages postés 39 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 27 mars 2009 1
7 déc. 2008 à 18:29
Bonsoir, c bon g appris un peu plus grâce à vous tous et je vous en remercie.

private void button1_Click(object sender, EventArgs e)
{
DataTable dt =
GetfichierFeuilleFichierExcel
(@"E:\Coursjeudi.xls", "Bloomberg");

if (dt != null && dt.Rows.Count > 0)
{
// WOUAWWW !!! merci
dataGridView1.DataSource = dt; // ok
}
}

Maintenant je voudrais poser une ou deux questions svp.
Comment faire une recherche (une query) dans le datagridview ? Peut-on utiliser linq ?
Je voudrais par exemple savoir les cellules de la colonne 3 dont la valeur est superieur à 5% et les afficher dans un labelbox.

Merci de votre aide...
cs_MoKaLux Messages postés 39 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 27 mars 2009 1
25 nov. 2008 à 23:33
Bonsoir,
je suis désolé, ton code m'interesse mais je débute avec les bases de données.
Comment puis-je "populer" une textbox ou autre chose ?
Je ne sais pas comment faire
J'ai fait :
richTextBox1.Text = dt.ToString();

mais le texte de la richtextbox me renvoie : "XLData"

Help please...
rocaro Messages postés 4 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 28 mai 2008
28 mai 2008 à 18:18
Bonjour,

J'ai utilis? ce code aussi dans un de mes programmes et en effet, Excel 8.0 correspond ? un fichier enregistr? sous Excel 97-2003 sinon, ca marche pas...

Je serais aussi int?ress'e pour pouvoir traiter des fichiers provenant de n'importe quelle version.
De plus, j'aimerais pouvoir passer en param?tre l'indice de la feuille et non son nom car c'est jamais le m?me dans tous les fichiers que je traite. Quelqu'un a une id'e ?

Merci d'avance
Utilisateur anonyme
6 mai 2008 à 15:30
Bonjour,

Je cherche un moyen de lire un fichier excel sans utiliser Office, donc je pense que votre code est une solution pour moi. Mais j'ai une question, au debut on a la ligne suivante :

string strCnx = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strCheminFichier + ";Extended Properties=" + (char)34 + "Excel 8.0;HDR=Yes;" + (char)34 + ";

A quoi correspond le "Excel 8.0" ?
Est-ce qu'on doit connaître la version d'Excel avec laquelle le fichier a été ecrit pour pouvoir le lire?
en fait, je voudrais rendre mon code complètement indépendant d'Excel.

Merci
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
10 avril 2008 à 09:11
Salut,
j'ai fait les teste dans mon coin mais je ne recontre pas de soucis particulier avec le typage des colonnes.
Mon test avec le shémas suivant me renvoie bien toutes mes occurences (nombre,texte,texte,date)
J'ai directement typé dans Excel et RAS que ce soit en Win ou en Web.
Comment récupère tu les données. Que fais tu avec cette datatable ? Moi je lie directement dans le datasource ... et ça marche.
A la limmite envoie moi une partie de ton code en MP pour voir
cs_tintin972 Messages postés 36 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 16 mai 2008
9 avril 2008 à 14:22
Salut j'ai un autre petit problème,

En fait cela revient au problème de type de donné que julsupinfo à rencontré.
Lorsqu'on importe le fichier excel VS interprète la colonne étant typé comme la première valeur. C'est a dire que si dans votre colonne votre première valeur (case) est un chiffre il s'attend dans la suite de la colonne à trouver des chiffres, et si il rencontre autre chose (du texte) il ne l'affiche pas...
Julsupinfo a résolu son pb en rajoutant de manière à n'avoir que du string dans son fichier excel...Moi je n'ai pas la chance de pourvoir modifier les données de mon excel, et devinez quoi dans une des colonne j'ai du string ET du num...
Quelqu'un aurait t il une idée pour que VS affiche tout??? Même si il transforme tout en string ca me dérange vraiment pas! Mais faut absolument que j'arrive a afficher toutes les donnés et sans modifier l'excel!
cs_tintin972 Messages postés 36 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 16 mai 2008
4 avril 2008 à 15:09
J'ai résolue mon problème, oubliez les postes que j'ai pu écrire ici...Ce code est parfait et fonctionne sur .net2.0 .
Mon erreur était plus que bête (tout comme moi)j'ai pas percuté que le nom de la feuille est vraiment le NOM DE LA FEUILLE!!!!! Pas le nom du fichier, dans mon cas l'appel de fonction était donc :
GetfichierFeuilleFichierExcel(@"C:\test.xls", "feuil1");

Bon ben n'empêche je vous remercie pour votre aide et j'espère que ma bétise en aidera d'autre...
cs_tintin972 Messages postés 36 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 16 mai 2008
4 avril 2008 à 13:56
Comprend po,
C'est bon de savoir que ca marche sur .net 2.0!

Je copie la fonction tel quel (sans modifier la commande ou quoi que ce soit).
Je crée un bouton.
Sur l'évenement de click du bouton je fait appel a la fonction comme suit :
GetfichierFeuilleFichierExcel(@"C:\test.xls", "test");

A priori il se connecte mais arrivé à ce fill, il me retourne une OLeDbExeption : 'test$' n'est pas un nom valide.Vérifiez qu'il n'y ai pas un caractere invalide...blablabla..

J'ai testé avec une version pro en me disant que c'était une restriction de la version express...Marche po non plus...

C'est surement un truc tout bête que je fais mal...mon appel de la fonction n'est pas bon??
En tous cas merci d'essayer de m'aider...
ethan_decoster Messages postés 38 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
4 avril 2008 à 12:51
Bonjour,

Pour moi c'est plus une erreur dans la commande plutot qu'une erreur de fmw (je l'ai fait touner sous du 2.0 et pas de soucis).
strNomFeuilleExcel est présent dans le fichier excel.
Pour l'erreur de fichier, je suis d'accord avec rodcobalt22

J'espère que j'ai su t'aider !!!
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
4 avril 2008 à 08:51
Le code présenté est du Fwk 1.1
Serait il possible qu'il y es une modification à cet endroit ?

De plus, la méthode "fill" de l'adapter remplit une DataSource. Donc à mon avis rien à voir avec le fichier. Pour une erreur du fichier, ça devrait levé une exception au niveau du "oCnx.Open();"

A mon avis, et si j'ai bien compris ton erreur est ailleur.

Test le sur le Fwk 1.1 pour voir si l'erreur se répette.
Eventuellement, vérifie le chemin du fichier ... et la requête select si tu la modifié.
J'espère que cela peut t'aider
bon courage ;)
cs_tintin972 Messages postés 36 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 16 mai 2008
3 avril 2008 à 15:48
Bonjour
Ca à l'air super bien faitcomme code mais j'ai un probleme a la ligne 32. Je programme avec C# sous VS2005express. Et il me renvoi une erreur ici : objAdapter.Fill(oDs, "XLData");
Il aime pas le nom de fichier que je lui donne...
Pourtant je lui passe un chemin @"C:\sample.xls" et un nom "sample.xls"
Je comprend pas pourquoi ca marche po...Si qq a une idée ca m'aiderais bien!
Merci d'avance
cs_veridik Messages postés 13 Date d'inscription mercredi 11 mai 2005 Statut Membre Dernière intervention 24 juillet 2013
20 févr. 2008 à 09:08
Code bien ficelé !! très pratique
ethan_decoster Messages postés 38 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
23 nov. 2007 à 11:41
Tu n'avais pas l'air sûr, j'ai juste confirmer !!! mdr
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
23 nov. 2007 à 09:37
Heu ... c'est pas ce que je viens d'écrire en haut ??
lol ;)
ethan_decoster Messages postés 38 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
22 nov. 2007 à 20:14
Oui c'est bien ca !!! Merci.

Ajoutez le paramètre HDR=NO si vous souhaitez également récupérer le contenu de la première ligne. Celle ci est considérée comme un entête (ou Champ), par défaut.
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
22 nov. 2007 à 09:31
J'ai tester de mon coté la première ligne est en faite retourné comme un titre de colonne. Il faut modifié les paramètres de ta chaine de connexion afin de ne prendre en compte la première ligne.
Il faut modifier la propriété suivante (si je me souviens bien ) "HDR no" à la place de "HDR yes".

N'hésite pas à me faire un retour pour me le confirmer
ethan_decoster Messages postés 38 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
21 nov. 2007 à 13:46
Si j'ai 10 valeurs dans mon fichier xls, numérottées pour test de 1 à 10, le résultat est de 2 à 10 (9 valeurs). En faisant un foreach(datarow row in tbresult) { console.writeline(row[0].ToString()); }
JuLsupinfo Messages postés 11 Date d'inscription mardi 24 février 2004 Statut Membre Dernière intervention 21 novembre 2007
21 nov. 2007 à 13:20
Bonjour, essaye de binder ton dataTable dans un gridView pour voir ce qu'il te retourne.
ethan_decoster Messages postés 38 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
21 nov. 2007 à 13:00
Bonjour,

J'ai repris le code pour une applic qui doit scrutté un fichier excel, jusque là tout va bien !! :)
Sauf que le dtResult.Rows.Count me retourne le nombre de lignes - 1 :(
En fait ca me zappe la première ligne (A*)

Quelqu'un a une solution ??
JuLsupinfo Messages postés 11 Date d'inscription mardi 24 février 2004 Statut Membre Dernière intervention 21 novembre 2007
28 sept. 2007 à 14:35
Merci de ta réponse.

J'ai trouvé le problème... il se trouve que certaines colonnes du fichier Excel sont "typés". C'est-à-dire que les colonne que je peux selectionner sont au format "texte", les autres, au format "standard" ou "decimal" sous Excel ne sont pas pris en compte. :(
J'ai rajouté un espace blanc avant chaque valeur des colonnes posant problème pour les transformé en type "texte" et cela fonctionne maintenant.

Encore merci.
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
28 sept. 2007 à 10:48
Parce qu'il interprète les valeurs en string peut importe leur nature ?
Je n'ai jamais fais gaffe, je vais vérifier mais à mon avis, il ne caste pas les retours, après tout c'est qu'un fichier Excel ^^
JuLsupinfo Messages postés 11 Date d'inscription mardi 24 février 2004 Statut Membre Dernière intervention 21 novembre 2007
26 sept. 2007 à 17:20
Bonsoir,

J'ai un autre problème ^_^
Lorsque je fais un "SELECT *" et que je bind le DataTable à un GridView, par exemple, il ne me retourne pas les valeur de type Number ou Int (seulement des champs ayant des valeur de type String).

Sauriez-vous pourquoi ?

Merci d'avance.
JuLsupinfo Messages postés 11 Date d'inscription mardi 24 février 2004 Statut Membre Dernière intervention 21 novembre 2007
26 sept. 2007 à 10:05
Merci beaucoup pour ta réponse, c'est effectivement ce dont j'avais besoin.
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
26 sept. 2007 à 09:00
Si tu connais la position exacte de la ligne et celle de la colonne, il suffit de prélever directement dans le DataTable aux coordonnées spécifié.
Cette méthode fait une sorte de photo du la feuille Excel qui en faite n'est qu'une table.

Par Exemple :

DataTable dt = GetfichierFeuilleFichierExcel(@"c:\temp\toto.xls","toto");

if(dt != null && dt.Rows.Count > 0)
{
// les coordonnées sont les chiffres entre crochet
string str = dt[1][5].ToString();
}

Bien sur pour la colonne entière il suffit de gérer ça avec un boucle for par exemple.
JuLsupinfo Messages postés 11 Date d'inscription mardi 24 février 2004 Statut Membre Dernière intervention 21 novembre 2007
25 sept. 2007 à 20:58
Bonsoir, saurait-tu comment faire pour sélectionner une colonne d'un fichier Excel, à partir d'une certaine ligne, avec cette méthode ?

Merci d'avance.
Rejoignez-nous