begin process at 2010 02 10 06:49:20
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > LIRE UN FICHIER EXCEL PAR OLEDB EN .NET

LIRE UN FICHIER EXCEL PAR OLEDB EN .NET


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :14 237

Auteur : rodcobalt22

Ecrire un message privé
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é

 Sources de la même categorie

Source avec une capture Source .NET (Dotnet) AJOUTER DES BYTES À UN EXECUTABLE par t0fx
Source .NET (Dotnet) COPIER/ COLLER DATAGRID (COPY/PASTE) par jamesbidon
Source avec Zip Source .NET (Dotnet) MECANISME DE SYNCHRONISATION DE THREAD - MONITOR, MUTEX, SEM... par jesusonline
Source .NET (Dotnet) EVENTHANDLERS GÉNÉRIQUES par ricklekebekoi
Source avec Zip Source .NET (Dotnet) TRAITER UN FOREACH EN PARALLÈLE par maitredede

 Sources en rapport avec celle ci

Source avec Zip PILOTER EXCEL VIA MICROSOFT.OFFICE.INTEROP.EXCEL par whismeril
Source avec Zip Source avec une capture Source .NET (Dotnet) EXEMPLE SIMPLE DE BALLE EN MOUVEMENT par lgauthier
Source avec Zip Source .NET (Dotnet) CRÉER UN ADDIN AUTOMATION POUR EXCEL par ShareVB
Source .NET (Dotnet) IMPORTER UNE FEUILLE EXCEL DANS UNE DATATABLE par MatthewsNET
Source .NET (Dotnet) CREATION DYNAMIQUE D'UN MS REPORT par djamelbarache

Commentaires et avis

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.

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.

Commentaire de JuLsupinfo le 26/09/2007 10:05:42

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

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.

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

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.

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

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.

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

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

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.

Commentaire de rodcobalt22 le 23/11/2007 09:37:12

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

Commentaire de ethan_decoster le 23/11/2007 11:41:29

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

Commentaire de veridik le 20/02/2008 09:08:35 10/10

Code bien ficelé !! très pratique

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

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

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

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

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

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!

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

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

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

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

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

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.

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

Commentaire de wisdoom le 30/12/2008 09:35:38 10/10

Excellent, juste ce que je cherchais !

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

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales