Lecture de fichiers Excel à partir de C#

est-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 fantaisiste, juste pour sélectionner une feuille de travail et de lire les données en chaînes. Jusqu'à présent, J'ai utilisé la fonction Exporter vers le texte Unicode D'Excel, et l'analyse du fichier résultant (tab-delimited), mais je voudrais éliminer l'étape manuelle.

233
demandé sur Chris 2008-08-19 11:23:46

30 réponses

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 parce que je colle habituellement un AsEnumerable() à l'édition des tables:

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

comme cela me permet D'utiliser LINQ pour rechercher et construire 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"),
                    });
153
répondu Robin Robinson 2008-08-19 12:18:20

S'il s'agit simplement de données simples contenues dans le fichier Excel, vous pouvez lire les données via ADO.NET. Voir les chaînes de connexion listées ici:

http://www.connectionstrings.com/?carrier=excel2007 ou http://www.connectionstrings.com/?carrier=excel

- Ryan

mise à jour: alors vous pouvez juste lire la feuille de travail via quelque chose comme select * from [Sheet1$]

83
répondu Ryan Farley 2008-08-19 07:46:51

le ADO.NET l'approche est rapide et facile, mais il a quelques bizarreries que vous devriez être au courant, en particulier en ce qui concerne la façon dont les types de données sont traitées.

cet excellent article vous aidera à éviter certains écueils communs: http://blog.lab49.com/archives/196

27
répondu Ian Nelson 2008-08-20 13:19:17

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);
    }
}
22
répondu Dmitry Shechtman 2008-09-04 11:39:19

Que Diriez-vous D'Excel Data Reader?

http://exceldatareader.codeplex.com /

j'ai utilisé dans la 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. Il fonctionne très bien et est assez robuste.

21
répondu Michał Pawłowski 2010-09-08 08:45:52

voici un code que j'ai écrit dans C# en utilisant .NET 1.1 il y a quelques années. Pas sûr que ce soit 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;
        }
    }
}
16
répondu hitec 2008-08-19 10:50:55

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

15
répondu Rune Grimstad 2009-02-02 22:07:29

alors que vous avez demandé expressément .xls, impliquant les anciens formats de fichier, pour les formats OpenXML (par exemple xlsx) je recommande fortement le SDK OpenXML ( http://msdn.microsoft.com/en-us/library/bb448854.aspx )

12
répondu Hafthor 2008-09-04 06:00:46

j'ai lu beaucoup de fichiers Excel dans C# A Il y a un moment, et nous avons utilisé deux approches:

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

cette dernière approche était beaucoup plus rapide: lire un grand tableau avec 20 colonnes et 200 lignes prendrait 30 une seconde via COM, et une demi-seconde via ODBC. Donc je recommande l'approche de base de données si tout ce que vous avez besoin est les données.

Cheers,

Carl

8
répondu Carl Seleborg 2008-08-20 13:24:35

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

6
répondu 2 revsanonymous 2009-05-14 21:41:55

je veux montrer une méthode simple pour lire le fichier xls/xlsx .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

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

6
répondu Lizzy 2012-12-23 06:43:09

pas gratuit,mais avec le dernier bureau Il ya un très belle automatisation. API. Net. (il y a eu une API pendant un long moment, mais était nasty COM) vous pouvez faire tout ce que vous voulez / besoin dans le code tout pendant que L'application Office reste un processus de fond caché.

4
répondu xanadont 2008-08-19 07:31:57

Pardonnez-moi si Je ne suis pas ici, mais n'est-ce pas à ça que servent les de bureau PIA ?

3
répondu Rob Cooper 2008-08-19 07:28:03

dernièrement, en partie pour s'améliorer à LINQ.... J'ai utilisé L'API d'automatisation D'Excel pour enregistrer le fichier en tant que tableur XML et puis obtenir le traitement de ce fichier en utilisant LINQ à XML.

3
répondu kenny 2008-09-04 11:10:40

tableur pour .NET est un composant de tableur compatible Excel pour.NET. Vous pouvez voir ce que nos clients disent sur la performance sur le côté droit de notre page produit . Vous pouvez essayer vous-même avec le libre, entièrement fonctionnel évaluation .

3
répondu Joe Erickson 2009-01-19 15:49:51

SmartXLS est un autre composant de tableur excel qui supporte la plupart des fonctionnalités des excel Charts,formules moteurs, et peut lire/écrire le format OpenXML excel2007.

3
répondu liya 2009-09-30 03:18:16

le .net component Excel Reader. net peut répondre à vos besoins. C'est assez bon pour lire des fichiers XLSX et XLS. Alors essayez-le à partir de:

http://www.devtriogroup.com/ExcelReader

3
répondu Bonnie Cornell 2011-04-12 07:30:55

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

Le Excel De Liaison De Données De La Documentation De La Section http://filehelpers.sourceforge.net/example_exceldatalink.html

2
répondu Jason Von Ruden 2008-09-04 10:24:13

vous pouvez essayer d'utiliser cette solution open source qui rend traiter avec Excel beaucoup plus propre.

http://excelwrapperdotnet.codeplex.com /

2
répondu user289261 2010-03-09 00:16:47

C'est génial. Oui, c'est une dépense, mais comparé à se tourner vers d'autres solutions, ça en vaut le coût. Il est rapide, fiable, très complet, et je dois dire après avoir utilisé ce produit dans mon travail de logiciel à temps plein pendant plus d'un an et demi, leur soutien à la clientèle est fantastique!

2
répondu John R 2010-08-26 18:01:25

la solution que nous avons utilisée, avait besoin de:

  • Autoriser Lire/Écrire de fichiers Produits En Excel
  • Être Rapide de la performance (pas comme l'utilisation de COMs)
  • MS Office Indépendant (ce qui est nécessaire pour être utilisable sans que les clients ayant de MS Office installé)
  • Être Libre ou Open Source (mais activement développé)

il y a plusieurs choix, mais nous avons trouvé NPoi (.net port of Java long existing Poi open source project) pour être le meilleur: http://npoi.codeplex.com /

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

2
répondu Thetam 2011-04-21 10:07:48

Si c'est juste des données tabulaires. Je recommande file data helpers par Marcos Melli qui peut être téléchargé ici .

2
répondu cless 2011-09-13 04:47:14

la Fin de la partie, mais je suis un fan de LinqToExcel

2
répondu DeeDee 2012-10-26 15:09:52

vous pourriez écrire un tableur excel qui charge un tableur excel donné et le sauve comme csv (plutôt que de le faire manuellement).

alors vous pourriez automatiser cela de c#.

et une fois son dans csv, le programme c# peut grok que.

(aussi, si quelqu'un vous demande de programmer dans excel, il est préférable de prétendre que vous ne savez pas comment)

(edit: ah oui, rob et ryan sont deux à droite)

1
répondu Leon Bambrick 2008-08-19 07:26:38

je sais que les gens ont fait une" extension " Excel à cette fin.

Vous faites plus ou moins un bouton dans Excel qui dit "Exporter vers le programme X", puis Exporter et envoyer 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

1
répondu Lars Mæhlum 2008-08-19 07:26:41

vient de faire un projet de démonstration rapide qui a exigé la gestion de certains fichiers excel. Le composant .NET du logiciel GemBox était adéquat pour mes besoins. Il a une version gratuite avec quelques limitations.

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

1
répondu Christian Hagelid 2008-08-19 07:48:58

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 avec Xlsx seulement (Excel 200&), pas avec XLS.

le code source semble également bien organisé et facile à contourner (Si vous avez besoin d'étendre la fonctionnalité ou de corriger des problèmes mineurs comme je l'ai fait).

au début, j'ai essayé le ADO.Net (Excel connection string) a été chargé avec des piratages méchants -- par exemple si deuxième ligne contient un nombre, il retournera les ints pour tous les champs dans la colonne ci-dessous et tranquillement laisser tomber toutes les données qui ne conviennent pas.

1
répondu dbkk 2009-10-01 03:44:08

nous utilisons ClosedXML dans des systèmes assez grands.

  • Libre
  • facile à installer
  • codage simple
  • Très support réactif
  • de l'équipe de Développeur est extrêmement ouvert à de nouvelles suggestions. Souvent, de nouvelles fonctionnalités et des corrections de bogues sont mises en œuvre au cours de la même semaine
1
répondu Doctor Rudolf 2012-08-17 08:40:28

Take.io tableur fera ce travail pour vous, et sans frais. Il suffit de jeter un oeil à ce .

1
répondu greeness 2012-11-11 23:49:45

je viens d'utiliser ExcelLibrary pour charger un .XLS tableur dans un ensemble de données. A très bien fonctionné pour moi.

0
répondu Hafthor 2009-08-24 06:21:56