Lire un fichier excel par oledb en .net

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 842 fois - Téléchargée 17 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

yakuzayang59
Messages postés
1
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
12 juillet 2011

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

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

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.