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.
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"),
});
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$]
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
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);
}
}
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.
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;
}
}
}
Koogra est un composant open-source écrit en C# qui lit et écrit des fichiers Excel.
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 )
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
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.
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.
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é.
Pardonnez-moi si Je ne suis pas ici, mais n'est-ce pas à ça que servent les de bureau PIA ?
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.
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 .
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:
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
vous pouvez essayer d'utiliser cette solution open source qui rend traiter avec Excel beaucoup plus propre.
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!
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
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)
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
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.
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.
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
je viens d'utiliser ExcelLibrary pour charger un .XLS tableur dans un ensemble de données. A très bien fonctionné pour moi.