从C#读取Excel文件

有没有一个免费或开放源代码库直接从C#程序读取Excel文件(.xls)?

它不需要太花哨,只需要select一个工作表并以stringforms读取数据。 到目前为止,我一直使用导出到Excel的Unicode文本函数,并parsing生成(制表符分隔)的文件,但我想消除手动步骤。

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"]; 

这是我通常使用的。 这有点不同,因为我通常在表格的编辑处粘贴一个AsEnumerable():

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

因为这让我可以使用LINQ从领域search和构build结构。

 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"), }); 

如果只是简单的数据包含在Excel文件中,则可以通过ADO.NET读取数据。 查看这里列出的连接string:

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

-Ryan

更新:那么你可以通过像select * from [Sheet1$]这样的东西阅读工作表

ADO.NET的方法是快速和容易的,但它有一些你应该知道的怪癖,特别是如何处理数据types。

这篇优秀的文章将帮助您避免一些常见的陷阱: http : //blog.lab49.com/archives/196

这是我用于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); } } 

Excel数据读取器如何?

http://exceldatareader.codeplex.com/

我曾经在生产环境中使用愤怒,将大量的数据从各种Excel文件中提取到SQL Server Compact中。 它工作得很好,而且非常健壮。

以下是几年前我在C#中使用.NET 1.1编写的一些代码。 不知道这是否正是你所需要的(可能不是我最好的代码:))。

 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是一个用C#编写的开源组件,可以读取和写入Excel文件。

虽然您特别要求.xls,暗示较旧的文件格式,对于OpenXML格式(例如xlsx),我强烈build议使用OpenXML SDK( http://msdn.microsoft.com/zh-cn/library/bb448854.aspx

前段时间,我在C#中使用Excel文件进​​行了大量的阅读,我们使用了两种方法:

  • COM API,您可以直接访问Excel对象,并通过方法和属性来操作它们
  • 允许像使用数据库一样使用Excel的ODBC驱动程序。

后一种方法快得多:用20列和200行读大表需要30秒,而通过ODBC需要半秒。 所以我会build议数据库的方法,如果你所需要的是数据。

干杯,

卡尔

ExcelMapper是一个开源工具( http://code.google.com/p/excelmapper/ ),可用于将Excel工作表读作强types对象。 它支持xls和xlsx格式。

我想展示一个简单的方法来读取.NET的xls / xlsx文件。 我希望以下对你有所帮助。

 私人DataTable ReadExcelToTable(stringpath)    
  {

      //连接string

      string connstring =“Provider = Microsoft.ACE.OLEDB.12.0; Data Source =”+ path +“; Extended Properties ='Excel 8.0; HDR = NO; IMEX = 1';”;  
      //同名 
      // string connstring = Provider = Microsoft.JET.OLEDB.4.0; Data Source =“+ path + //”; Extended Properties ='Excel 8.0; HDR = NO; IMEX = 1';“; 

     使用(OleDbConnection conn =新的OleDbConnection(connstring))
      {
         conn.Open();
         //获取所有图纸名称
         DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object [] {null,null,null,“Table”});  

         //获取第一张纸的名字
        stringfirstSheetName = sheetsName.Rows [0] [2] .ToString(); 

         //查询string 
         string sql = string.Format(“SELECT * FROM [{0}]”,firstSheetName); 
         OleDbDataAdapter ada = new OleDbDataAdapter(sql,connstring);
         DataSet set = new DataSet();
         ada.Fill(组);
        返回set.Tables [0];   
    }
  } 

代码来自文章: http : //www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/ 。 你可以从它得到更多的细节。

不是免费的,但最新的Office有一个非常好的自动化.Net API。 (有一个API很长一段时间,但是很讨厌的COM)你可以做所有你想要/所需的代码,而Office应用程序仍然是一个隐藏的后台进程。

请原谅我,如果我在这里的基地,但这不是办公室PIA的 ?

最近,部分为了更好地在LINQ ….我一直在使用Excel的自动化API将文件保存为XML Spreadsheet,然后使用LINQ to XML来处理该文件。

用于.NET的SpreadsheetGear是一个与Excel兼容的电子表格组件。 您可以在我们的产品页面的右侧看到我们的客户对于性能的评价。 您可以使用免费的function齐全的评估来尝试。

SmartXLS是另一个Excel电子表格组件,它支持Excel图表,公式引擎的大部分function,并且可以读取/写入excel2007 openxml格式。

.NET组件Excel Reader .NET可能会满足您的要求。 阅读XLSX和XLS文件已经足够了。 所以试试吧:

http://www.devtriogroup.com/ExcelReader

我推荐FileHelpers Library,它是一个免费且易于使用的.NET库,用于从EXCEL导入/导出数据,文件,string或stream中的固定长度或分隔logging。

Excel数据链接文档部分 http://filehelpers.sourceforge.net/example_exceldatalink.html

你可以尝试使用这个开放源码的解决scheme,使得处理Excel更加清洁。

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear真棒。 是的,这是一笔费用,但与其他解决scheme相比,这是值得的。 它是快速,可靠,非常全面的,我不得不说,在我的全职软件工作中使用这个产品一年半之后,他们的客户支持是太棒了!

我们使用的解决scheme需要:

  • 允许读取/写入 Excel生成的文件
  • 快速的性能(不像使用COM)
  • 独立于MS Office(需要安装MS Office的客户才能使用)
  • 免费开源 (但积极开发)

有几种select,但是我们发现NPoi (Java已有的Poi开源项目的.NET端口)是最好的: http : //npoi.codeplex.com/

它也允许使用.doc和.ppt文件格式

如果它只是表格数据。 我会推荐Marcos Melli的文件数据助手,可以在这里下载。

晚会,但我是LinqToExcel的粉丝

你可以写一个Excel电子表格,加载一个给定的Excel电子表格,并将其保存为CSV(而不是手动)。

那么你可以从c#自动化。

一旦它在csv,c#程序可以groh。

(另外,如果有人要求你用excel编程,最好假装你不知道如何)

(编辑:啊是的,rob和ryan都是对的)

我知道人们一直在为此做一个Excel“扩展”。
您或多或less地在Excel中创build一个button,指出“导出到程序X”,然后以程序可以读取的格式导出和发送数据。

http://msdn.microsoft.com/en-us/library/ms186213.aspx应该是一个很好的开始。;

祝你好运

刚做了一个需要pipe理一些excel文件的快速演示项目。 GemBox软件的.NET组件足以满足我的需求。 它有一个免费版本,有一些限制。

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

Excel包是用于读取/写入Excel 2007文件的开源(GPL)组件。 我在一个小项目上使用它,而且API很简单。 仅适用于XLSX(Excel 200&),不适用于XLS。

源代码看起来也很好组织和易于解决(如果您需要扩展function或像我一样修复小问题)。

起初,我尝试了ADO.Net(Excel连接string)的方法,但它充满了令人厌恶的黑客 – 例如,如果第二行包含一个数字,它将返回整数在下面的列中的所有字段,并安静地丢弃任何数据那不适合。

我们在相当大的系统中使用ClosedXML 。

  • 自由
  • 易于安装
  • 直截了当的编码
  • 非常敏感的支持
  • 开发团队非常乐意接受新的build议。 新function和错误修复通常在同一周内实施

Take.io电子表格将为您完成这项工作,并免费。 只要看看这个 。

我只是使用ExcelLibrary将一个.xls电子表格加载到一个DataSet中。 为我工作很好。