如何使用C#从Excel文件中读取数据

81

我的应用程序需要从Excel文件中读取数据。我使用.Net和c#进行开发。 由于无法在系统中安装MS Office,因此我的应用程序无法读取Excel文件,并在加载Excel的dll时抛出错误。

如何在未安装MS Office的系统中访问Excel文件?


2
将其保存为CSV文件(如Robert Harvey在下面建议的那样),或使用OleDB。 - Tim
对于 OleDB,我们需要在机器上安装 MS Excel,是吗? - TutuGeorge
即使没有安装 MS Excel,通过代码将 Excel 转换为 CSV 的转换是否可行? - TutuGeorge
1
不需要安装Excel即可使用OleDb。但是,如果您的Excel文件是xlsx类型的文件,则需要更近期的Microsoft Data Access组件,可免费下载。 - Steve
为什么没有人在引用以下链接中提到的任何库?https://nugetmusthaves.com/Tag/Excel - Fractal
https://dev59.com/uWcs5IYBdhLWcg3wRBxQ - Andrew
5个回答

108

有一个选项是使用 OleDB 并将 Excel 表格像数据库中的数据表一样使用...

这只是一个例子.....

string con =
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" + 
  @"Extended Properties='Excel 8.0;HDR=Yes;'";    
using(OleDbConnection connection = new OleDbConnection(con))
{
    connection.Open();
    OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); 
    using(OleDbDataReader dr = command.ExecuteReader())
    {
         while(dr.Read())
         {
             var row1Col0 = dr[0];
             Console.WriteLine(row1Col0);
         }
    }
}

这个示例使用Microsoft.Jet.OleDb.4.0提供程序来打开和读取Excel文件。但是,如果文件是xlsx类型(来自Excel 2007及更高版本),则需要下载Microsoft Access Database Engine组件并在目标计算机上安装它。

该提供程序称为Microsoft.ACE.OLEDB.12.0;请注意,此组件有两个版本,一个用于32位,一个用于64位。根据应用程序的位数和已安装的Office版本(如果有)选择适当的版本。要使驱动程序正确工作,有很多注意事项。例如,请参阅此问题

当然,在目标计算机上不需要安装Office。

虽然这种方法有一些优点,但我认为你应该特别注意你问题中注释所指示的链接Reading excel files from C#。存在一些关于数据类型正确解释的问题,以及当单个Excel单元格中的数据长度超过255个字符时的处理方式。


3
我遇到了一个异常,代码上出现了 Sheet1$,这是什么意思? - Bengi Besçeli
5
这是一个 Excel 文件中工作表的名称。每个工作表都被视为具有不同名称和 $ 后缀的不同表格。当然,如果你更改了工作表的名称,就需要更改上面使用的表格名称(如 sheet1$)。 - Steve
3
我的 Excel 文件中包含一个合并的单元格,其中有多行文本。这种方法只读取部分文本,即第七行中间位置之前的部分。请问你能帮我吗? - bjan
5
请发布一个新问题,这样您的特定问题将获得更多关注,而不是在一个三年前的问题/答案中提问。并记住 255 字符限制... - Steve
1
@Steve,使用工作表索引在查询中选择* from [0]是可能的吗? - daniele3004
显示剩余5条评论

27

CSharpJExcel可用于读取Excel 97-2003文件(XLS),ExcelPackage可用于读取Excel 2007/2010文件(Office Open XML格式,XLSX),而ExcelDataReader似乎可以处理这两种格式

祝好运!


4
ExcelDataReader似乎是最近维护的。它也可以通过NuGet获取。我使用它运气很好。 - Michael Silver
4
对于任何未来的用户,建议尝试使用ExcelDataReader。特别是如果您使用平台目标“AnyCpu”构建应用程序,则这是一个非常好的选择。否则,在客户端安装x86或x64的痛苦是一个大问题。 - Manvinder
抱歉打断这个帖子...如何在我的项目中导入这个excelreader文件夹?我是c#的新手..请帮忙。 - nick
1
JExcelApi似乎已经被放弃了,我找不到C#版本的(只找到了Java版本)。此外,Chrome正在显示ExcelPackage链接的安全警告。无论如何,这里有一个快速高效的Excel读取器,我最终使用了它,你可以在NuGet上找到它。 - Hazel Patton
对于2020年的解决方案,我可以毫不羞耻地推广ExcelToEnumerable。我们已经对其进行了基准测试,并且如果您只需要支持.xlsx文件,则它是最快的解决方案。免责声明:我是ExcelToEnumerable的作者。 - Chris HG

10
我没有可用的机器来测试,但它应该可以工作。首先,您可能需要安装2007 Office System Driver: Data Connectivity ComponentsMicrosoft Access Database Engine 2010 Redistributable。然后尝试以下代码,注意您需要更改选择语句中的Sheet名称以匹配Excel文件中的sheetname:
using System.Data;
using System.Data.OleDb;

namespace Data_Migration_Process_Creator
{
    class Class1
    {
        private DataTable GetDataTable(string sql, string connectionString)
        {
            DataTable dt = null;

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand(sql, conn))
                {
                    using (OleDbDataReader rdr = cmd.ExecuteReader())
                    {
                        dt.Load(rdr);
                        return dt;
                    }
                }
            }
        }

        private void GetExcel()
        {
            string fullPathToExcel = "<Path to Excel file>"; //ie C:\Temp\YourExcel.xls
            string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=yes'", fullPathToExcel);
            DataTable dt = GetDataTable("SELECT * from [SheetName$]", connString);

            foreach (DataRow dr in dt.Rows)
            {
                //Do what you need to do with your data here
            }
        }
    }
}

注意:我没有一个安装了Office的环境来测试这个(代码),所以我不能确定它是否在你的环境中能够运行,但我认为它应该可以。

4
我以前没有听过这个:https://code.google.com/p/linqtoexcel/。 - Mark Kram
Linq to Excel 很有帮助。谢谢。 - Pavan
Function_Library.DatabaseFunctions 这行代码出现了以下错误:对象不包含名为 'DatabaseFunctions' 的定义。 - wearybands
@wearybands 我刚刚修复了我的示例,抱歉让你等这么久才回复。 - Mark Kram

9

将Excel文件保存为CSV格式,使用CSV读取库(如FileHelpers)在C#中读取生成的文件。


1
Microsoft.VisualBasic.FileIO程序集中的TextFieldParser类(http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx)是.NET自带的,对于CSV文件处理非常好,我个人认为。 - Tim
1
保存为CSV将导致文件具有格式化的值,而不是基础值(例如,当完整精度为6时,四舍五入到两个小数位)。这可能会根据您的数据需求而成为问题。 - atheaos

5
将Excel文件转换为 .csv 文件(逗号分隔值文件),现在您可以轻松地阅读它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接