web-dev-qa-db-fra.com

Comment lire les données d'un fichier Excel avec c #

Mon application doit lire les données d'un fichier Excel. J'utilise .Net et c # pour le développement. Je ne peux pas installer MS Office dans le système. En raison de cela, mon application ne parvient pas à lire le fichier Excel et génère une erreur lors du chargement de la DLL pour Excel.

Comment puis-je accéder au fichier Excel dans mon application dans un système où ms office n'est pas installé?

57
TutuGeorge

Il y a la possibilité d'utiliser OleDB et d'utiliser les feuilles Excel comme des tables de données dans une base de données ...

Juste un exemple .....

string con =
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" + 
  @"Extended Properties='Excel 8.0;HDR=Yes;'";    
using(OleDbConnection connection = new OleDbConnection(con))
{
    connection.Open();
    OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); 
    using(OleDbDataReader dr = command.ExecuteReader())
    {
         while(dr.Read())
         {
             var row1Col0 = dr[0];
             Console.WriteLine(row1Col0);
         }
    }
}

Cet exemple utilise le fournisseur Microsoft.Jet.OleDb.4.0 pour ouvrir et lire le fichier Excel. Toutefois, si le fichier est de type xlsx (à partir d'Excel 2007 et ultérieur), vous devez télécharger les composants moteur de base de données Microsoft Access et l'installer sur la machine cible.

Le fournisseur s'appelle Microsoft.ACE.OLEDB.12.0;. Faites attention au fait qu'il existe deux versions de ce composant, une pour 32 bits et une pour 64 bits. Choisissez celle qui convient pour le bitness de votre application et quelle version d'Office est installée (le cas échéant). Il y a beaucoup de bizarreries à faire fonctionner correctement ce pilote pour votre application. Voir cette question par exemple .

Bien entendu, vous n'avez pas besoin d'installer Office sur la machine cible.

Bien que cette approche présente certains avantages, je pense que vous devriez accorder une attention particulière au lien signalé par un commentaire dans votre question Lecture de fichiers Excel à partir de C # . Il y a quelques problèmes concernant l'interprétation correcte des types de données et lorsque la longueur des données, présente dans une seule cellule Excel, dépasse 255 caractères.

88
Steve

CSharpJExcel pour la lecture de fichiers Excel 97-2003 (xls): http://sourceforge.net/projects/jexcelapi/

et ExcelPackage pour la lecture de fichiers Excel 2007/2010 (format Office Open XML, xlsx): http://excelpackage.codeplex.com/

et ExcelDataReader, qui semble avoir la capacité de gérer les deux formats: https://github.com/ExcelDataReader/ExcelDataReader

Bonne chance!

19
Obama

Je n'ai pas de machine disponible pour tester cela mais ça devrait marcher. Tout d'abord, vous devrez probablement installer le Pilote Office System 2007: composants de connectivité de données ou le moteur de base de données Microsoft Access 2010 redistribuable . Ensuite, essayez le code suivant. Notez que vous devrez modifier le nom de la feuille dans l'instruction Select ci-dessous pour qu'il corresponde à nom_feuille dans votre fichier Excel:

using System.Data;
using System.Data.OleDb;

namespace Data_Migration_Process_Creator
{
    class Class1
    {
        private DataTable GetDataTable(string sql, string connectionString)
        {
            DataTable dt = null;

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand(sql, conn))
                {
                    using (OleDbDataReader rdr = cmd.ExecuteReader())
                    {
                        dt.Load(rdr);
                        return dt;
                    }
                }
            }
        }

        private void GetExcel()
        {
            string fullPathToExcel = "<Path to Excel file>"; //ie C:\Temp\YourExcel.xls
            string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=yes'", fullPathToExcel);
            DataTable dt = GetDataTable("SELECT * from [SheetName$]", connString);

            foreach (DataRow dr in dt.Rows)
            {
                //Do what you need to do with your data here
            }
        }
    }
}

Remarque: je n'ai pas d'environnement pour tester cela dans (One avec Office installé), donc je ne peux pas dire si cela fonctionnera dans votre environnement ou non, mais je ne vois pas pourquoi cela ne fonctionnerait pas.

8
Mark Kram

Enregistrez le fichier Excel au format CSV et lisez le fichier obtenu en C # à l'aide d'une bibliothèque de lecteurs CSV telle que FileHelpers .

5
Robert Harvey

Convertissez le fichier Excel en fichier .csv (fichier = valeurs séparées par des virgules). Vous pouvez maintenant le lire facilement.

4
petko_stankoski