从C#中读取Excel文件

时间:2008-08-19 07:23:47

标签: c# .net excel ms-office

是否有免费或开源库直接从C#程序读取Excel文件(.xls)?

它不需要太花哨,只需选择工作表并将数据读取为字符串即可。到目前为止,我一直在使用Excel的Export to Unicode文本功能,并解析生成的(制表符分隔的)文件,但我想取消手动步骤。

32 个答案:

答案 0 :(得分:153)

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从字段中搜索和构建结构。

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

答案 1 :(得分:83)

如果只是Excel文件中包含的简单数据,您可以通过ADO.NET读取数据。请参阅此处列出的连接字符串:

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

-Ryan

更新:然后您可以通过类似select * from [Sheet1$]

的内容阅读工作表

答案 2 :(得分:27)

ADO.NET方法既快速又简单,但它有一些你应该注意的怪癖,特别是关于DataTypes的处理方式。

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

答案 3 :(得分:22)

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

答案 4 :(得分:21)

Excel Data Reader怎么样?

http://exceldatareader.codeplex.com/

我在生产环境中使用它来将大量数据从各种Excel文件中提取到SQL Server Compact中。它运作良好,而且非常强大。

答案 5 :(得分:16)

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

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

答案 6 :(得分:15)

Koogra是一个用C#编写的开源组件,用于读取和写入Excel文件。

答案 7 :(得分:12)

虽然你特意要求.xls,暗示较旧的文件格式,对于OpenXML格式(例如xlsx),我强烈推荐OpenXML SDK(http://msdn.microsoft.com/en-us/library/bb448854.aspx

答案 8 :(得分:8)

我之前在C#中用Excel文件做了很多阅读,我们使用了两种方法:

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

后一种方法更快:读取一个包含20列和200行的大表,通过COM需要30秒,通过ODBC需要半秒。如果您需要的只是数据,我建议使用数据库方法。

干杯,

卡尔

答案 9 :(得分:6)

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

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

代码来自文章:http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/。您可以从中获得更多详细信息。

答案 10 :(得分:6)

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

答案 11 :(得分:4)

不是免费的,但是对于最新的Office,有一个非常漂亮的自动化.Net API。 (已经存在了很长一段时间的API,但是令人讨厌的COM)在Office应用程序仍然是隐藏的后台进程时,您可以在代码中执行所有您想要/需要的操作。

答案 12 :(得分:3)

最近,部分是为了在LINQ上做得更好....我一直在使用Excel的自动化API将文件保存为XML Spreadsheet,然后使用LINQ to XML获取该文件的进程。

答案 13 :(得分:3)

SpreadsheetGear for .NET是适用于.NET的Excel兼容电子表格组件。您可以在product page的右侧看到客户对性能的评价。您可以使用免费的,功能齐全的evaluation自己尝试。

答案 14 :(得分:3)

如果我在这里偏离基础,请原谅我,但这不是Office PIA's的用途吗?

答案 15 :(得分:3)

.NET组件Excel Reader .NET可满足您的要求。它足以读取XLSX和XLS文件。所以试试吧:

http://www.devtriogroup.com/ExcelReader

答案 16 :(得分:3)

SmartXLS是另一个excel电子表格组件,它支持excel图表,公式引擎的大多数功能,并且可以读取/写入excel2007 openxml格式。

答案 17 :(得分:2)

我们使用的解决方案需要:

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

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

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

答案 18 :(得分:2)

如果只是表格数据。我建议Marcos Melli提供文件数据助手,可以下载here

答案 19 :(得分:2)

晚会,但我是LinqToExcel

的粉丝

答案 20 :(得分:2)

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

答案 21 :(得分:2)

您可以尝试使用这种开源解决方案,使得处理Excel更加清洁。

http://excelwrapperdotnet.codeplex.com/

答案 22 :(得分:2)

我推荐使用FileHelpers Library,它是一个免费且易于使用的.NET库,用于从EXCEL导入/导出数据,固定长度或文件,字符串或流中的分隔记录+更多。

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

答案 23 :(得分:1)

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

源代码似乎组织良好且易于解决(如果您需要扩展功能或解决我遇到的小问题)。

首先,我尝试了ADO.Net(Excel连接字符串)方法,但它充满了讨厌的黑客 - 例如,如果第二个行包含一个数字,它将返回所有的整数下面一列中的字段,然后悄悄地删除任何不适合的数据。

答案 24 :(得分:1)

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

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

答案 25 :(得分:1)

Take.io电子表格将为您完成这项工作,并且不收取任何费用。只需看看this

答案 26 :(得分:1)

我知道为此目的,人们一直在制作Excel“扩展” 您或多或少在Excel中创建一个“导出到程序X”的按钮,然后以程序可以读取的格式导出和发送数据。

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

祝你好运

答案 27 :(得分:1)

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

  • 易于安装
  • 直接编码
  • 非常响应支持
  • 开发团队极端对新建议持开放态度。通常在同一周内实施新功能和错误修复

答案 28 :(得分:1)

您可以编写一个excel电子表格来加载给定的Excel电子表格并将其保存为csv(而不是手动执行)。

然后你可以从c#中自动化。

一旦它在csv中,c#程序就可以理解它。

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

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

答案 29 :(得分:0)

Excel Data Reader是您的最佳选择!

它是开源的,http://exceldatareader.codeplex.com/并且积极开发。

我们一直用它来阅读Tabular(有时候不是那么表格)工作表几年(在财务应用程序中)。

像魅力一样从人类可读的纸张中读取单元测试数据。

只是避免尝试返回DateTime的功能,因为对于Excel,DateTime只是两个数字。

答案 30 :(得分:0)

我刚用ExcelLibrary将.xls电子表格加载到DataSet中。为我工作很棒。

答案 31 :(得分:0)

如果同一工作表中有多个表,则可以为每个表提供一个对象名,并使用OleDb方法读取表,如下所示:http://vbktech.wordpress.com/2011/05/10/c-net-reading-and-writing-to-multiple-tables-in-the-same-microsoft-excel-worksheet/