Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIRE UN FICHIER EXCEL PAR OLEDB EN .NET


Information sur la source

Catégorie :Astuces Source .NET ( DotNet ) Classé sous : excel, web, oledb Niveau : Initié Date de création : 05/07/2007 Date de mise à jour : 05/07/2007 12:07:38 Vu : 12 453

Note :
9,25 / 10 - par 4 personnes
9,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (29)
Ajouter un commentaire et/ou une note

Description

Suite à une contrainte lors de mes développements, j'ai développé cette méthode.

En effet, je devais lire un fichier excel sur un serveur (appliWeb) mais je ne pouvais pas installer les assembly "office".

Après des recherches sur le Web, j'ai trouvé pas mal d'exemple me montrant comment faire. Donc j'en profite pour vous le montrer à tous
 

Source

  • /// <summary>
  • /// Permet de charger le contenue d'une feuille excel dans une DataTable à partir du chemin et le nom de la feuille désirée
  • /// </summary>
  • /// <param name="strcheminFichier">Chemin du fichier Excel</param>
  • /// <param name="strNomFeuilleExcel">Nom de la feuille excel</param>
  • /// <returns>DataTable contenant l'ensemble des celulles et lignes du fichier Excel. Si la feuille est vide le retour est égal à "Null"</returns>
  • /// <remarks>Aucune gestion d'exception n'est faite à l'intérieur de cette méthode</remarks>
  • public DataTable GetfichierFeuilleFichierExcel(string strCheminFichier, string strNomFeuilleExcel)
  • {
  • // Chaine de connexion
  • string strCnx = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strCheminFichier + ";Extended Properties=" + (char)34 + "Excel 8.0;HDR=Yes;" + (char)34 + ";";
  • System.Data.DataTable dtRetour = null;
  • System.Data.OleDb.OleDbConnection oCnx = new System.Data.OleDb.OleDbConnection(strCnx);
  • System.Data.OleDb.OleDbCommand objCmdSelect = null;
  • System.Data.OleDb.OleDbDataAdapter objAdapter = null;
  • System.Data.DataSet oDs = new DataSet();
  • // vérification globale des données entrantes
  • if(strCheminFichier != string.Empty && strNomFeuilleExcel != string.Empty)
  • {
  • if(System.IO.File.Exists(strCheminFichier))
  • {
  • // ouvertur de la connexion
  • oCnx.Open();
  • // création de la commande
  • objCmdSelect =new System.Data.OleDb.OleDbCommand("SELECT * FROM ["+ strNomFeuilleExcel +"$]", oCnx);
  • objAdapter = new System.Data.OleDb.OleDbDataAdapter();
  • // on informe de l'instruction SELECT
  • objAdapter.SelectCommand = objCmdSelect;
  • // on execute la requete en spécifiant le protocole et on remplit le DataSet
  • objAdapter.Fill(oDs, "XLData");
  • // Vérification du dataset
  • if(oDs != null && oDs.Tables != null && oDs.Tables.Count > 0)
  • {
  • dtRetour = oDs.Tables[0];
  • }
  • else
  • {
  • dtRetour = null;
  • }
  • // Libération
  • oCnx.Close();
  • objCmdSelect.Dispose();
  • objAdapter.Dispose();
  • }
  • }
  • return dtRetour;
  • }
/// <summary>
		/// Permet de charger le contenue d'une feuille excel dans une DataTable à partir du chemin et le nom de la feuille désirée
		/// </summary>
		/// <param name="strcheminFichier">Chemin du fichier Excel</param>
		/// <param name="strNomFeuilleExcel">Nom de la feuille excel</param>
		/// <returns>DataTable contenant l'ensemble des celulles et lignes du fichier Excel. Si la feuille est vide le retour est égal à "Null"</returns>
		/// <remarks>Aucune gestion d'exception n'est faite à l'intérieur de cette méthode</remarks>
		public DataTable GetfichierFeuilleFichierExcel(string strCheminFichier, string strNomFeuilleExcel)
		{
			// Chaine de connexion
			string strCnx = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strCheminFichier + ";Extended Properties=" + (char)34 + "Excel 8.0;HDR=Yes;" + (char)34 + ";";
			System.Data.DataTable dtRetour = null;
			System.Data.OleDb.OleDbConnection oCnx = new System.Data.OleDb.OleDbConnection(strCnx);
			System.Data.OleDb.OleDbCommand objCmdSelect = null;
			System.Data.OleDb.OleDbDataAdapter objAdapter = null;
			System.Data.DataSet oDs = new DataSet();

			// vérification globale des données entrantes
			if(strCheminFichier != string.Empty && strNomFeuilleExcel != string.Empty)
			{
				if(System.IO.File.Exists(strCheminFichier))
				{
					// ouvertur de la connexion
					oCnx.Open();
					// création de la commande
					objCmdSelect =new System.Data.OleDb.OleDbCommand("SELECT * FROM ["+ strNomFeuilleExcel +"$]", oCnx);
					objAdapter = new System.Data.OleDb.OleDbDataAdapter();
					// on informe de l'instruction SELECT
					objAdapter.SelectCommand = objCmdSelect;
					// on execute la requete en spécifiant le protocole et on remplit le DataSet
					objAdapter.Fill(oDs, "XLData");
					// Vérification du dataset
					if(oDs != null && oDs.Tables != null && oDs.Tables.Count > 0)
					{
						dtRetour = oDs.Tables[0];
					}
					else
					{
						dtRetour = null;
					}


					// Libération
					oCnx.Close();
					objCmdSelect.Dispose();
					objAdapter.Dispose();
				}
			}
			return dtRetour;
		}

Conclusion

Logiquement il n'y a rien à importer au niveau des références car cela utilise le framework de base lors d'un développement WebForm
 

Historique

05 juillet 2007 12:07:38 :
Changement du rand Débutant vers initié

Commentaires et avis

signaler à un administrateur
Commentaire de JuLsupinfo le 25/09/2007 20:58:59

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.

signaler à un administrateur
Commentaire de rodcobalt22 le 26/09/2007 09:00:55

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.

signaler à un administrateur
Commentaire de JuLsupinfo le 26/09/2007 10:05:42

Merci beaucoup pour ta réponse, c'est effectivement ce dont j'avais besoin.

signaler à un administrateur
Commentaire de JuLsupinfo le 26/09/2007 17:20:48

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.

signaler à un administrateur
Commentaire de rodcobalt22 le 28/09/2007 10:48:40

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

signaler à un administrateur
Commentaire de JuLsupinfo le 28/09/2007 14:35:02

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.

signaler à un administrateur
Commentaire de ethan_decoster le 21/11/2007 13:00:35

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

signaler à un administrateur
Commentaire de JuLsupinfo le 21/11/2007 13:20:05

Bonjour, essaye de binder ton dataTable dans un gridView pour voir ce qu'il te retourne.

signaler à un administrateur
Commentaire de ethan_decoster le 21/11/2007 13:46:26

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()); }

signaler à un administrateur
Commentaire de rodcobalt22 le 22/11/2007 09:31:41

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

signaler à un administrateur
Commentaire de ethan_decoster le 22/11/2007 20:14:43

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.

signaler à un administrateur
Commentaire de rodcobalt22 le 23/11/2007 09:37:12

Heu ... c'est pas ce que je viens d'écrire en haut ??
lol ;)

signaler à un administrateur
Commentaire de ethan_decoster le 23/11/2007 11:41:29

Tu n'avais pas l'air sûr, j'ai juste confirmer !!! mdr

signaler à un administrateur
Commentaire de veridik le 20/02/2008 09:08:35 10/10

Code bien ficelé !! très pratique

signaler à un administrateur
Commentaire de tintin972 le 03/04/2008 15:48:11

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

signaler à un administrateur
Commentaire de rodcobalt22 le 04/04/2008 08:51:19

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 ;)

signaler à un administrateur
Commentaire de ethan_decoster le 04/04/2008 12:51:28

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

signaler à un administrateur
Commentaire de tintin972 le 04/04/2008 13:56:50

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

signaler à un administrateur
Commentaire de tintin972 le 04/04/2008 15:09:13

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

signaler à un administrateur
Commentaire de tintin972 le 09/04/2008 14:22:46 8/10

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!

signaler à un administrateur
Commentaire de rodcobalt22 le 10/04/2008 09:11:05

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

signaler à un administrateur
Commentaire de Blobette le 06/05/2008 15:30:02

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

signaler à un administrateur
Commentaire de rocaro le 28/05/2008 18:18:40

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

signaler à un administrateur
Commentaire de MoKaLux le 25/11/2008 23:33:53

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

signaler à un administrateur
Commentaire de MoKaLux le 07/12/2008 18:29:37 9/10

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

signaler à un administrateur
Commentaire de MoKaLux le 08/12/2008 22:14:42

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<int>(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.

signaler à un administrateur
Commentaire de MoKaLux le 11/12/2008 20:53:07

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

signaler à un administrateur
Commentaire de wisdoom le 30/12/2008 09:35:38 10/10

Excellent, juste ce que je cherchais !

signaler à un administrateur
Commentaire de MoKaLux le 16/01/2009 02:11:30

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Problème connexion base de données ACCESS [ par adomarle ] Bonjour,Je cherche &#224; me connecter &#224; ma&nbsp;base de donn&#233;es ACCESS, de cette mani&#232;re : protected void Ses Excel OleDb Connection issue [ par Mikels ] Bonjour,Peut être quelqu'un pourra me renseigner sur une erreur que je rencontre lors d'une tentative de connection vers un fichier excel.Le but est c Ouverture d'un fichier Excel depuis une page web [ par hasen ] Bonjour, bonjour!Je viens une fois de plus vous voir pour vous demander des indices, pistes ou meme solutions pour le problème que je rencontre.Donc j automation excel et application web [ par nesrine82 ] Bonjour j'ai un probleme :je developpe une application web(intranet) sous visual studio 2005 c# (j'ai  travailler sur une app windows prsqu la meme Liaison VBA - Excel [ par jenaye83 ] Bonjour tout le monde,J'ai développe une application en C#. Dans l'une des classes, j'ai renseigne les fonctions de register/unregister qui permettent Lister toutes les feuilles d'un classeur Excel [ par achleuhi ] Bonjour tous le monde,Je cherche un moyen de lister toutes les feuilles d'un classeur Excel, je ne connais pas le noms des feuilles à l'avance je suis Access Read/Write d'un Btimap OLEDB [ par little_fof ] problème contrainte AllowDBNull/provider Oledb [ par solons ] Bonjour, Je cherche à pouvoir fabriquer un script générant une base SQL serveur identique à une base de départ qui doit pouvoir être de plusieurs form Comment ouvrir/modifier/ecrire dans un fichier EXcel c#.net WINFORM [ par vinzemuls ] Bonjour,après pas mal de recherches, j'ai réussi à trouver comment lire un fichier EXCEL. or je ne trouve pas le moyen d'écrire à la suite du fichier C# .NET 1.1 EXCEL Selection d'une cellule par son identifiant (Alias) [ par achleuhi ] Bonjour, j'essaie de récupérer le numéro de la ligne et de la colonne d'une cellule qui a un alias ou un identifiant le document Excel a différent ali


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,452 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.