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 !

IMPORTER UNE FEUILLE EXCEL DANS UNE DATATABLE


Information sur la source

Catégorie :.NET Source .NET ( DotNet ) Classé sous : excel, datatable, datareader Niveau : Initié Date de création : 11/07/2007 Date de mise à jour : 11/07/2007 23:36:13 Vu : 9 730

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Cette classe statique (excelIO) possède pour le moment une seule méthode (excelToTable) qui reçoit en paramètre le chemin d'un fichier xls ainsi que le nom de la feuille à traiter et retourne une dataTable.

Il existe plusieurs solutions pour faire ce type de traitement, mais j'ai choisi ici d'utiliser ADO.NET.

excelToTable possède une méthode que l'on pourrait extraire afin d'en créer une nouvelle que nous nommerions dataReaderToDataTable(DataReader dr, DataTable dt)

J'espère que cela pourra vous aider.

Mathieu Francesch
http://www.sharplog-sdi.com



 

Source

  • public static class excelIO
  • {
  • private static OleDbConnection connectionXLS = new OleDbConnection();
  • private static OleDbCommand commandXLS = new OleDbCommand();
  • private static OleDbDataReader readerRequete;
  • /// <summary>
  • /// Fonction qui lit un tableau dans un fichier xls et retourne une Datatable
  • /// </summary>
  • /// <param name="xlsFile">Chemin du fichier XLS</param>
  • /// <param name="xlsSheet">Nom de la feuille</param>
  • /// <returns>Retourne une DataTable</returns>
  • public static DataTable excelToTable(String xlsFile, String xlsSheet)
  • {
  • DataTable tableXls = new DataTable();
  • DataRow lineXls = null;
  • connectionXLS.ConnectionString = "Data Source=" + xlsFile + "; Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;";
  • commandXLS.Connection = connectionXLS;
  • commandXLS.CommandType = System.Data.CommandType.Text;
  • commandXLS.CommandText = "select * from [" + xlsSheet + "$];";
  • connectionXLS.Open();
  • readerRequete = commandXLS.ExecuteReader();
  • //On récupére le schema du datareader
  • DataTable schemaXls = readerRequete.GetSchemaTable();
  • //Création des colonnes de la datatable de retour via le schema du Datareader
  • for (int i = 0; i < schemaXls.Rows.Count; i++)
  • {
  • DataRow line = schemaXls.Rows[i];
  • String columnName = line["ColumnName"].ToString();
  • DataColumn column = new DataColumn(columnName);
  • tableXls.Columns.Add(column);
  • }
  • //On parcourt les lignes du datareader qu'on ajoute à la datatable
  • while (readerRequete.Read())
  • {
  • lineXls = tableXls.NewRow();
  • for (int i = 0; i < readerRequete.FieldCount; i++)
  • {
  • lineXls[i] = readerRequete[i];
  • }
  • tableXls.Rows.Add(lineXls);
  • }
  • readerRequete.Close();
  • connectionXLS.Close();
  • return tableXls;
  • }
  • }
public static class  excelIO
    {
        private static OleDbConnection connectionXLS = new OleDbConnection();
        private static OleDbCommand commandXLS = new OleDbCommand();
        private static OleDbDataReader readerRequete;

        /// <summary>
        /// Fonction qui lit un tableau dans un fichier xls et retourne une Datatable
        /// </summary>
        /// <param name="xlsFile">Chemin du fichier XLS</param>
        /// <param name="xlsSheet">Nom de la feuille</param>
        /// <returns>Retourne une DataTable</returns>
        public static DataTable excelToTable(String xlsFile, String xlsSheet)
        {
            DataTable tableXls = new DataTable();
            DataRow lineXls = null; 

            connectionXLS.ConnectionString = "Data Source=" + xlsFile + "; Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;";
            commandXLS.Connection = connectionXLS;
            commandXLS.CommandType = System.Data.CommandType.Text;
            commandXLS.CommandText = "select * from [" + xlsSheet + "$];";

            connectionXLS.Open();
            readerRequete = commandXLS.ExecuteReader();

            //On récupére le schema du datareader
            DataTable schemaXls = readerRequete.GetSchemaTable();

            //Création des colonnes de la datatable de retour via le schema du Datareader
            for (int i = 0; i < schemaXls.Rows.Count; i++)
			{
			    DataRow line = schemaXls.Rows[i];
                String columnName = line["ColumnName"].ToString();

                DataColumn column = new DataColumn(columnName);
                tableXls.Columns.Add(column);
			}

            //On parcourt les lignes du datareader qu'on ajoute à la datatable 
            while (readerRequete.Read())
            {
                lineXls = tableXls.NewRow();
                for (int i = 0; i < readerRequete.FieldCount; i++)
			    {
                    lineXls[i] = readerRequete[i];     		 
			    }
               
                tableXls.Rows.Add(lineXls);
            }

            readerRequete.Close();
            connectionXLS.Close();
            return tableXls;
        }        
    }

Conclusion

Très prochainement je rajouterai la méthode pour exporter les données vers un fichier xls (plus simple)
 

Historique

11 juillet 2007 23:36:13 :
no comment

Commentaires et avis

signaler à un administrateur
Commentaire de dim3311 le 12/07/2007 09:38:04

aucun try catch dans le code ? dangereux, une fois la connexion est ouverte, de sortir en exception et laissé tous les objets en l'état

signaler à un administrateur
Commentaire de MatthewsNET le 12/07/2007 10:19:58

Bonjour Dim,

Tu as parfaitement raison Dim mais ce code n'est pas voué à rester tel quel. Donc, effectivement rajouter des try catch ne serait pas de trop. Ceci dit, attention à l'utilisation abusive des try catch car elles réduisent significativement les performances d'une application.

signaler à un administrateur
Commentaire de dim3311 le 12/07/2007 10:25:43

merci de ta réponse

entre réduction de performances et des objets qui restent ouverts en attente que le gc veuille bien en faire qch

n'oublie pas que c'est du com derrière le ado en oldb, donc ton pool de connexions est pris, ton fichier est locké

les try catch finally dans ce genre de code de niveau "initié" n'est point un luxe mais une obligation

bonne continuation
Dimitri

signaler à un administrateur
Commentaire de devvassili le 12/07/2007 18:15:37

Merci pour ce code, il est intéressant.
En revanche est-il possible de traiter le type des éléments ? Exemple les dates, les entiers etc.

Bon coding.

signaler à un administrateur
Commentaire de MatthewsNET le 12/07/2007 18:56:17

Merci Dev,

Tu peux traiter le type de l'élément en utilisant le nom de colonne DataType comme je l'ai fais pour obtenir le nom de la colonne en utilisant ColumnName. Aprés lorsque tu créé une DataColumn, tu as une surcharge pour spécifier le type de la colonne que tu ajoutes a ta DataTable

M@th

signaler à un administrateur
Commentaire de rodcobalt22 le 30/08/2007 15:16:45

Bonjour,
Merci pour ce code ( en faite j'en ai posté un similaire et j'ai vue le tien trop tard :p).
J'aimerai savoir s'il est possible (à mon avis non) de récupérer la couleur de fond d'une cellule (ne serait ce le code hexa de la couleur ou même une série de byte)
Te remerciant d'avance de toute piste

signaler à un administrateur
Commentaire de ulysse1976 le 12/11/2007 17:05:38 9/10

salut
merci pour ce code.  
Il m'a bien servit, donc il est normal que je le note ;)

signaler à un administrateur
Commentaire de kowalska le 28/02/2008 15:39:25 6/10

Tres bien mais detruie mon fichier xls. Peut plus l'ouvrir dans office apres!!!!!

signaler à un administrateur
Commentaire de solos le 20/05/2008 10:15:07

Code interessant. Je l'ai utilisé dans mon prog.
Y a t-il un moyen de recuperer aussi les formules et non les valeurs des cellules??
Merci pour votre reponses


signaler à un administrateur
Commentaire de bloodyangel90 le 11/06/2008 16:24:32

Bonjours all,

code intéraissent , mais y a t-il moyen de faire le chemin inverse . de passer d'une datatable a une feuille excel en récupérent tous

signaler à un administrateur
Commentaire de rodcobalt22 le 12/06/2008 09:48:55

Salut BloodyAngel90,

Il est en effet possible de faire ça mais en bricolant un peu.
En effet, tu peux de la même manière exécuter des updates ou inserts dans la feuille excel.
A savoir tout de même que la structure doit être vachement proche d'une table ^^

Rod^^

signaler à un administrateur
Commentaire de ixor59 le 23/06/2008 10:23:13 8/10

Bonjour à tous.

Tout d'abord merci pour ce code, il m'a bien aidé ;-)

Je reviens à la charge concernant le chemin inverse, c'est-à-dire écrire le contenu d'une  DataTable dans une feuille d'un document Excell.
Quelqu'un aurait-il un lien où trouver comment faire ?

Merci ^^

signaler à un administrateur
Commentaire de fastspin le 15/10/2008 12:03:43

Merci pour le code, je le compile OK avec mon form.
Je suis débutant dans le traitement de data.
Je ne comprend pas comment utiliser le retour de return tableXls.
J'essai de binder les data dans un dataGridview. Le Grid prend le nombre de lignes et colonnes de mon Excel sheet mais est vide. Comment puis-je récuperer les donnée et les retrouver dans mon grid?

signaler à un administrateur
Commentaire de fastspin le 16/10/2008 13:45:05

Never mind.. J'ai trouvé la solution à ma question. C'est:
dataGridView1.DataSource = buffer;

Buffer étant déclaré dataTable et ensuite la valeur retourné par excelIO.
Attention ne pas faire un binding avec dataGridView. Laisser le biding à "none". C'était en fait mon problème de départ.
Merci à tout ceux qui offre leur service sur ce fantastique site.
Jean-Marc

signaler à un administrateur
Commentaire de koudizz le 26/11/2008 12:18:43

Bonjour,
J'ai fenfait réaliser le mème programme suite a une demande de mon chef de projet,mais il me reste un problème,mon fichier programme me charge des celluls  vide malgré q'il sont pas vide dans mon fichier Excel.
Merci de me répondre dans les brefs délais pasque j'auré a livré se travaille aujourd'hui.

signaler à un administrateur
Commentaire de MoKaLux le 18/01/2009 02:04:18

Merci pour cette autre façon de faire, cela fonctionne bien. Bon code. Pour les try catch on le fait dans l'autre partie du prog...

Petite question au passage, peut-on faire des modifs sur les colonnes avant de les mettre dans le dataset.
"//On parcourt les lignes du datareader qu'on ajoute à la datatable"
Par exemple si une cellule de la colonne X contient "TOTO" alors la cellule de la colonne Y sera multiplié par 2.

Merci en tout cas...
:-)

signaler à un administrateur
Commentaire de julienbornet le 02/02/2009 10:56:44

Bonjour,

Je sais que ton post date un peu mais quand est il tu code que tu devais ajouter sur l'export de données dans un fichier excel, parce que çà me rendrai bien service d'avoir un exemple

D'avance merci ;-)

signaler à un administrateur
Commentaire de MoKaLux le 03/02/2009 11:59:15

bonjour,
pour ta question JulienBornet d'exporter de csharp vers excel, la meilleure soluce que j'ai trouvé est de faire un copy dans le clipboard et ensuite de le coller dans excel.

signaler à un administrateur
Commentaire de damien123456789 le 05/05/2009 12:50:13

Bonjour,
J'utilisais un code maison (un peu semblable à celui-ci) pour recuperer une feuille excel dans une datatable, mais certaines cellules étaient vides dans ma datatable. J'ai essayé avec ta methode mais le resultat est le meme.
Est-ce que vous connaitriez des raisons au niveau des cellules excel qui empecheraient la recup de cellule ?
La plupart des cellulues manquantes sont des nombres, mais pas toutes. Si je les remplace par une chaine, ca fonctionne.
Merci d'avance si vous avez des suggestions.
Damien (c# VS2008, excel 2003)

signaler à un administrateur
Commentaire de damien123456789 le 05/05/2009 13:56:50

Rebonjour,
Trouvé sur internet. Il semble qu'en modifiant la chaine de connexion avec
..... Extended Properties=" + (char)34 + "Excel 8.0;HDR=Yes;IMEX=1" + (char)34 + ";"

ça marche. C'est le IMEX=1 qui importe(le HDR c'est s'il y a une ligne d'entete)

Pour plus d'infos, voir http://support.microsoft.com/kb/194124/fr
Merci
A+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Exporter DataSet ou dataReader vers Excel [ par samystyle ] Bonjour,Je suis &#224;&nbsp;la recherche d'un code ou d'une fonction c# qui me permet d'exporter le resultat d'une requete selection sur sqlserver (qu c# Importation feuille Excel vers un DataTable [ par Caro2005 ] Bonjour,Je souhaite importer des donn&#233;es situ&#233;es dans une feuille Excel vers un DataTable. Pas de pb pour l'acc&#232;s &#224; ma feuille Exc Une DataTable dans un fichier Excel existant [ par toopix ] Salut, Je voudrais copier une table Oracle dans un fichier Excel. Cette table contient plus de 30 000 lignes... et j'ai des soucis de performances selectionner une feuille excel [ par trdev ] Bonjourje fais une exportation de 3 datagrid vers excel. toutes mes données sont sur la 1° feuille excel, mais j'aimerais les envoyer sur les 3 feuill classe qui pointent sur un element d'un tableau excel [ par decoalaa ] Bonjour,J'ai un petit soucis qu'est le suivant:J'ai un tableau Excel qui contient des données: time, key et value. Pour chaque time, ya des "Key" atri Afficher le contenu d'une Hashtable dans un fichier Excel [ par decoalaa ] Bonjour, voila mon problème, j'ai stocké des données dans une hashtable et je veux afficher le contenu dans un fichier Excel, J'ai crée mon fichier et memoire qui augmente [ par cudenetf ] Bonjour,j'ai tuojurs le semem probleme d ememoir euqi augmente et fini par saturer ...J'ai un timerachaque tick je vide, puis je charge un datatable a Export excel sur serveur [ par sophie316 ] Bonjour à tous,Je dévellope une application en C# dans laquelle je fais un export Excel de saisies, ce qui marche très bien en local.Mais lorsque je l Generer un fichier Excel ou Configurer une librairie COM dans visual studio [ par hasen ] Messieurs, Mesdames bonjour!Je voudrais generer un fichier Excel depuis mon code C# et j'avais trouvé une solution grace à la librairie (dans COM) Mic Déactiver la roulette [ par amal_85 ] Bonjour J'ai un petit problème J'ai créer une listbox dans excel. A priori tous marche bien sauf quand j'utilise la roulette de ma souris. En fait si


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