首页 文章

从C#中读取Excel文件

提问于
浏览
233

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

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

30 回答

  • 1

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

    • 允许 Reading/Writing 的Excel生成的文件

    • 在性能上是 Fast (不像使用COM)

    • 是MS Office Independent (需要在没有安装MS Office的客户端的情况下使用)

    • FreeOpen Source (但积极开发)

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

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

  • 2

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

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

    http://www.devtriogroup.com/ExcelReader

  • 3

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

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

  • 1

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

  • 1

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

  • 2

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

  • 3

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

  • 22

    Koogra是一个用C#编写的开源组件,用于读写Excel文件 .

  • 1

    我想展示一个用.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/ . 您可以从中获取更多详细信息 .

  • 3

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

  • 83

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

    然后你可以从c#自动化 .

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

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

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

  • 4

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

    http://excelwrapperdotnet.codeplex.com/

  • 1

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

  • 16

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

    • 免费

    • 易于安装

    • 直接编码

    • Very 响应支持

    • 开发团队 extremly 对新建议持开放态度 . 通常新功能和错误修复在同一周内实施

  • 153

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

    The Excel Data Link Documentation Section http://filehelpers.sourceforge.net/example_exceldatalink.html

  • 27

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

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

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

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

    不是免费的,但是对于最新的Office,有一个非常好的自动化.Net API . (有一段时间的API,但是令人讨厌的COM)你可以在代码中完成所有你想要/需要的东西,而Office应用程序仍然是一个隐藏的后台进程 .

  • 15

    迟到了,但我是LinqToExcel的粉丝

  • 2

    Excel Data Reader怎么样?

    http://exceldatareader.codeplex.com/

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

  • 21

    我知道为此目的,人们一直在制作Excel "extension" .
    您或多或少在Excel中创建了一个名为"Export to Program X"的按钮,然后以程序可以读取的格式导出和发送数据 .

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

    祝好运

  • 12

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

  • 3

    这是我几年前使用.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;
            }
        }
    }
    
  • 3

    如果它只是表格数据 . 我推荐Marcos Melli的文件数据助手,可以下载here .

  • 2

    我只是使用ExcelLibrary将.xls电子表格加载到DataSet中 . 对我来说很棒 .

  • 2

    我在C#中做了大量的Excel文件阅读,我们使用了两种方法:

    • COM API,您可以直接访问Excel的对象并通过方法和属性对其进行操作

    • 允许像数据库一样使用Excel的ODBC驱动程序 .

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

    干杯,

    卡尔

  • 1

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

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

  • 6

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

  • 6

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

    http://www.connectionstrings.com/?carrier=excel2007http://www.connectionstrings.com/?carrier=excel

    -Ryan

    更新:然后您可以通过类似 select * from [Sheet1$] 的内容阅读工作表

相关问题