read - Lecture de fichiers Excel à partir de C#




microsoft.office.interop.excel.dll download (20)

Existe-t-il une bibliothèque libre ou open source pour lire des fichiers Excel (.xls) directement à partir d'un programme C #?

Il n'a pas besoin d'être trop sophistiqué, juste pour sélectionner une feuille de calcul et 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 l'analyse du fichier résultant (délimité par des tabulations), mais je voudrais éliminer l'étape manuelle.



C'est 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);
    }
}

ExcelMapper est un outil open source ( http://code.google.com/p/excelmapper/ ) pouvant ê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.


J'ai fait beaucoup de lecture de fichiers Excel en C # il y a quelques 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 pilote ODBC qui permet d'utiliser Excel comme une base de données.

La dernière approche était beaucoup plus rapide: lire une grande table avec 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 tout ce dont vous avez besoin est les données.

À votre santé,

Carl


Je sais que les gens ont fait une "extension" Excel à cet effet.
Vous faites plus ou moins un bouton dans Excel qui dit "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 endroit pour commencer.

Bonne chance


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


Juste fait un projet de démonstration rapide qui a nécessité la gestion de certains fichiers Excel. Le composant .NET du logiciel GemBox était adapté à mes besoins. Il a une version gratuite avec quelques limitations.

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


L'approche ADO.NET est rapide et facile, mais elle comporte quelques bizarreries dont vous devez être conscient, en particulier en ce qui concerne le traitement des DataTypes.

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



Nous utilisons ClosedXML dans des systèmes plutôt importants.

  • Gratuit
  • Facile à installer
  • Codage direct
  • Un support très réactif
  • L'équipe de développeurs est extrêmement ouverte à de nouvelles suggestions. Souvent, de nouvelles fonctionnalités et corrections de bugs sont implémentées dans la même semaine

Pas gratuit, mais avec le dernier Office il y a une très belle API .Net. (Il y a longtemps eu une API mais il était méchant COM) Vous pouvez faire tout ce que vous voulez / besoin de code tout pendant que l'application Office reste un processus d'arrière-plan caché.


Que diriez-vous d'Excel Data Reader?

http://exceldatareader.codeplex.com/

J'ai utilisé dans sa colère, dans un environnement de production, pour tirer de grandes quantités de données à partir d'une variété de fichiers Excel dans SQL Server Compact. Ça marche très bien et c'est plutôt robuste.



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


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


Excel Package 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 à contourner (si vous avez besoin d'étendre les 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 il était chargé de hacks méchants - par exemple si la deuxième ligne contient un nombre, elle retournera ints pour tous les champs dans la colonne ci-dessous et dépose tranquillement toutes les données ça ne rentre pas.


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


SpreadsheetGear for .NET est un composant tableur compatible Excel pour .NET. Vous pouvez voir ce que nos clients disent de la performance sur le côté droit de notre page produit . Vous pouvez l'essayer vous-même avec l' evaluation gratuite et entièrement fonctionnelle.


Take.io Spreadsheet fera ce travail pour vous, et sans frais. Jetez un coup d'oeil à this .







ms-office