Question

Existe-t-il une bibliothèque gratuite ou open source pour lire des fichiers Excel (.xls) directement depuis un programme C# ?

Il n'est pas nécessaire que ce soit trop compliqué, il suffit de sélectionner une feuille de calcul et de lire les données sous forme de chaînes.Jusqu'à présent, j'ai utilisé la fonction de texte Exporter vers Unicode d'Excel et j'ai analysé le fichier résultant (délimité par des tabulations), mais j'aimerais éliminer l'étape manuelle.

Était-ce utile?

La solution

var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "anyNameHere");

DataTable data = ds.Tables["anyNameHere"];

C'est ce que j'utilise habituellement.C'est un peu différent car je colle habituellement un AsEnumerable() lors de l'édition des tables :

var data = ds.Tables["anyNameHere"].AsEnumerable();

car cela me permet d'utiliser LINQ pour rechercher et créer des structures à partir des champs.

var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x =>
                new MyContact
                    {
                        firstName= x.Field<string>("First Name"),
                        lastName = x.Field<string>("Last Name"),
                        phoneNumber =x.Field<string>("Phone Number"),
                    });

Autres conseils

S'il ne s'agit que de simples données contenues dans le fichier Excel, vous pouvez lire les données via ADO.NET.Consultez les chaînes de connexion répertoriées ici :

http://www.connectionstrings.com/?carrier=excel2007ouhttp://www.connectionstrings.com/?carrier=excel

-Ryan

Mise à jour:alors vous pouvez simplement lire la feuille de calcul via quelque chose comme select * from [Sheet1$]

L'approche ADO.NET est simple et rapide, mais elle présente quelques bizarreries dont vous devez être conscient, notamment en ce qui concerne la façon dont les types de données sont gérés.

Cet excellent article vous aidera à éviter certains pièges courants :http://blog.lab49.com/archives/196

Voici ce que j'ai utilisé pour Excel 2003 :

Dictionary<string, string> props = new Dictionary<string, string>();
props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
props["Data Source"] = repFile;
props["Extended Properties"] = "Excel 8.0";

StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> prop in props)
{
    sb.Append(prop.Key);
    sb.Append('=');
    sb.Append(prop.Value);
    sb.Append(';');
}
string properties = sb.ToString();

using (OleDbConnection conn = new OleDbConnection(properties))
{
    conn.Open();
    DataSet ds = new DataSet();
    string columns = String.Join(",", columnNames.ToArray());
    using (OleDbDataAdapter da = new OleDbDataAdapter(
        "SELECT " + columns + " FROM [" + worksheet + "$]", conn))
    {
        DataTable dt = new DataTable(tableName);
        da.Fill(dt);
        ds.Tables.Add(dt);
    }
}

Que diriez-vous du lecteur de données Excel ?

http://exceldatareader.codeplex.com/

J'ai utilisé la colère, dans un environnement de production, pour extraire de grandes quantités de données d'une variété de fichiers Excel vers SQL Server Compact.Cela fonctionne très bien et c'est plutôt robuste.

Voici du code que j'ai écrit en C# en utilisant .NET 1.1 il y a quelques années.Je ne sais pas si ce serait exactement ce dont vous avez besoin (et ce n'est peut-être pas mon meilleur code :)).

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

namespace ExportExcelToAccess
{
    /// <summary>
    /// Summary description for ExcelHelper.
    /// </summary>
    public sealed class ExcelHelper
    {
        private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

        public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
        {
            OleDbConnection objConnection = new OleDbConnection();
            objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
            DataSet dsImport = new DataSet();

            try
            {
                objConnection.Open();

                DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) )
                {
                    //raise exception if needed
                }

                if( (null != sheetName) && (0 != sheetName.Length))
                {
                    if( !CheckIfSheetNameExists(sheetName, dtSchema) )
                    {
                        //raise exception if needed
                    }
                }
                else
                {
                    //Reading the first sheet name from the Excel file.
                    sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                }

                new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport);
            }
            catch (Exception)
            {
                //raise exception if needed
            }
            finally
            {
                // Clean up.
                if(objConnection != null)
                {
                    objConnection.Close();
                    objConnection.Dispose();
                }
            }


            return dsImport.Tables[0];
            #region Commented code for importing data from CSV file.
            //              string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\"";
            //
            //              System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString);
            //              new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport);
            //              return dsImport.Tables[0];

            #endregion
        }

        /// <summary>
        /// This method checks if the user entered sheetName exists in the Schema Table
        /// </summary>
        /// <param name="sheetName">Sheet name to be verified</param>
        /// <param name="dtSchema">schema table </param>
        private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema)
        {
            foreach(DataRow dataRow in dtSchema.Rows)
            {
                if( sheetName == dataRow["TABLE_NAME"].ToString() )
                {
                    return true;
                }   
            }
            return false;
        }
    }
}

Koogra est un composant open source écrit en C# qui lit et écrit des fichiers Excel.

Bien que vous ayez spécifiquement demandé .xls, ce qui implique les anciens formats de fichiers, pour les formats OpenXML (par ex.xlsx) Je recommande fortement le SDK OpenXML (http://msdn.microsoft.com/en-us/library/bb448854.aspx)

J'ai beaucoup lu à partir de fichiers Excel en C# il y a quelque temps, et nous avons utilisé deux approches :

  • L'API COM, où vous accédez directement aux objets d'Excel et les manipulez via des méthodes et des propriétés
  • Le driver ODBC qui permet d'utiliser Excel comme une base de données.

Cette dernière approche était beaucoup plus rapide:la lecture d'un grand tableau de 20 colonnes et 200 lignes prendrait 30 secondes via COM et une demi-seconde via ODBC.Je recommanderais donc l’approche de base de données si vous n’avez besoin que des données.

Acclamations,

Carl

ExcelMapper est un outil open source (http://code.google.com/p/excelmapper/) qui peut être utilisé pour lire des feuilles de calcul Excel en tant qu'objets fortement typés.Il prend en charge les formats xls et xlsx.

Je souhaite montrer une méthode simple pour lire le fichier xls/xlsx avec .NET.J'espère que ce qui suit vous sera utile.

 private DataTable ReadExcelToTable(string path)    
 {

     //Connection String

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //the same name 
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     using(OleDbConnection conn = new OleDbConnection(connstring))
     {
        conn.Open();
        //Get All Sheets Name
        DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //Get the First Sheet Name
        string firstSheetName = sheetsName.Rows[0][2].ToString(); 

        //Query String 
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); 
        OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
        DataSet set = new DataSet();
        ada.Fill(set);
        return set.Tables[0];   
   }
 }

Le code provient de l'article : http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/.Vous pouvez en obtenir plus de détails.

Ce n'est pas gratuit, mais avec la dernière version d'Office, il existe un très belle API .Net d'automatisation.(il existe une API depuis longtemps mais elle était méchante COM) Vous pouvez faire tout ce que vous voulez / avez besoin dans le code pendant que l'application Office reste un processus d'arrière-plan caché.

Pardonnez-moi si je ne suis pas à la hauteur ici, mais n'est-ce pas ce que PIA de bureau sont pour?

Dernièrement, en partie pour m'améliorer chez LINQ....J'utilise l'API d'automatisation d'Excel pour enregistrer le fichier en tant que feuille de calcul XML, puis traiter ce fichier à l'aide de LINQ to XML.

SpreadsheetGear pour .NET est un composant de feuille de calcul compatible Excel pour .NET.Vous pouvez voir ce que disent nos clients sur les performances sur le côté droit de notre fiche produit.Vous pouvez l'essayer vous-même avec le logiciel gratuit et entièrement fonctionnel évaluation.

SmartXLS est un autre composant de feuille de calcul Excel qui prend en charge la plupart des fonctionnalités des graphiques Excel, des moteurs de formules et peut lire/écrire le format openxml Excel2007.

Le composant .NET Excel Reader .NET peut satisfaire vos besoins.C'est suffisant pour lire les fichiers XLSX et XLS.Alors essayez-le depuis :

http://www.devtriogroup.com/ExcelReader

Je recommande la bibliothèque FileHelpers qui est une bibliothèque .NET gratuite et facile à utiliser pour importer/exporter des données depuis EXCEL, des enregistrements de longueur fixe ou délimités dans des fichiers, des chaînes ou des flux + Plus.

La section de documentation sur les liaisons de données Excel http://filehelpers.sourceforge.net/example_exceldatalink.html

Vous pouvez essayer d'utiliser cette solution open source qui rend la gestion d'Excel beaucoup plus propre.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear est génial.Oui, c'est une dépense, mais comparé à ces autres solutions, cela en vaut le coût.Il est rapide, fiable, très complet, et je dois dire qu'après avoir utilisé ce produit dans mon travail logiciel à temps plein pendant plus d'un an et demi, leur support client est fantastique !

La solution que nous avons utilisée devait :

  • Permettre Lecture écriture de fichiers Excel produits
  • Être Rapide en performances (pas comme utiliser les COM)
  • Être MS Office Indépendant (doit être utilisable sans que MS Office soit installé sur les clients)
  • Être Gratuit ou Open source (mais activement développé)

Il existe plusieurs choix, mais nous avons trouvé NPoi (port .NET du logiciel Java existant depuis longtemps Poi projet open source) pour être le meilleur :http://npoi.codeplex.com/

Il permet également de travailler avec les formats de fichiers .doc et .ppt

Si ce ne sont que des données tabulaires.Je recommanderais les fichiers d'aide aux données de Marcos Melli qui peuvent être téléchargés ici.

En retard à la fête, mais je suis fan de LinqVersExcel

vous pouvez écrire une feuille de calcul Excel qui charge une feuille de calcul Excel donnée et l'enregistre au format CSV (plutôt que de le faire manuellement).

alors vous pouvez automatiser cela à partir de c#.

et une fois qu'il est en CSV, le programme C# peut le comprendre.

(aussi, si quelqu'un vous demande de programmer sous Excel, il vaut mieux faire semblant de ne pas savoir comment)

(modifier:ah oui, Rob et Ryan ont tous les deux raison)

Je sais que des gens ont créé une "extension" Excel à cet effet.
Vous créez plus ou moins un bouton dans Excel indiquant "Exporter vers le programme X", puis exportez et envoyez les données dans un format que le programme peut lire.

http://msdn.microsoft.com/en-us/library/ms186213.aspx devrait être un bon point de départ.

Bonne chance

Je viens de réaliser un projet de démonstration rapide qui nécessitait la gestion de fichiers Excel.Le composant .NET du logiciel GemBox était adapté à mes besoins.Il existe une version gratuite avec quelques limitations.

http://www.gemboxsoftware.com/GBSpreadsheet.htm

Forfait Excel est un composant open source (GPL) pour lire/écrire des fichiers Excel 2007.Je l'ai utilisé sur un petit projet et l'API est simple.Fonctionne uniquement avec XLSX (Excel 200&), pas avec XLS.

Le code source semble également bien organisé et facile à parcourir (si vous avez besoin d'étendre des fonctionnalités ou de résoudre des problèmes mineurs comme je l'ai fait).

Au début, j'ai essayé l'approche ADO.Net (chaîne de connexion Excel), mais elle était semée d'embûches malveillantes - par exemple si deuxième La ligne contient un nombre, elle renverra des entiers pour tous les champs de la colonne ci-dessous et supprimera discrètement toutes les données qui ne correspondent pas.

Nous utilisons FerméXML dans des systèmes assez grands.

  • Gratuit
  • Facile à installer
  • Codage simple
  • Très support réactif
  • L'équipe de développeurs est extrêmement ouvert à de nouvelles suggestions.Souvent, de nouvelles fonctionnalités et des corrections de bugs sont implémentées au cours de la même semaine.

Take.io Spreadsheet fera ce travail pour vous et gratuitement.Jetez simplement un oeil à ce.

je viens d'utiliser Bibliothèque Excel pour charger une feuille de calcul .xls dans un DataSet.Cela a très bien fonctionné pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top