如何使用c#从excel文件中读取数据

Tut*_*rge 59 .net c# excel ms-office

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

如何在未安装ms office的系统中访问我的应用程序中的excel文件?

Ste*_*eve 92

可以选择使用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);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例使用Microsoft.Jet.OleDb.4.0提供程序打开并读取Excel文件.但是,如果文件的类型为xlsx(来自Excel 2007及更高版本),则需要下载Microsoft Access数据库引擎组件并将其安装在目标计算机上.

提供者被调用Microsoft.ACE.OLEDB.12.0;.注意这个组件有两个版本,一个用于32位,一个用于64位.根据应用程序的位数和安装的Office版本(如果有)选择合适的一个.让驱动程序正确地为您的应用程序工作有很多怪癖.例如,请参阅此问题.

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

虽然这种方法有一些优点,但我认为你应该特别注意你的问题中的注释所标记的链接从C#中读取excel文件.关于数据类型的正确解释以及单个excel单元格中存在的数据长度超过255个字符时存在一些问题

  • 请发一个新问题,这样你会得到更多关注你的具体问题,而不是在这里问一个3岁的问题/答案.并记住255个字符限制.... (4认同)
  • 它是excel文件中工作表的名称.每张工作表都被视为一个不同的表格,其中包含工作表的名称和$后缀.当然,如果更改工作表名称,则需要更改上面使用的表名(sheet1 $) (3认同)
  • 我得到了代码的异常.什么是Sheet1 $? (2认同)
  • 我的Excel文件包含具有多行文本的合并单元格。这种方法仅读取文本的一部分,即直到第7行的中间。请你帮助我好吗? (2认同)

Oba*_*ama 19

CSharpJExcel用于读取Excel 97-2003文件(xls):http://sourceforge.net/projects/jexcelapi/

和ExcelPackage用于读取Excel 2007/2010文件(Office Open XML格式,xlsx):http://excelpackage.codeplex.com/

和ExcelDataReader,似乎有能力处理这两种格式:https://github.com/ExcelDataReader/ExcelDataReader

祝好运!

  • ExcelDataReader似乎是最近维护的.它也可以通过NuGet获得.我有幸运气. (4认同)
  • 对于任何未来的用户,请尝试ExcelDataReader.这是一个非常好的选择,特别是如果您使用Platform Target'AnyCpu'构建应用程序.否则,在客户端计算机上安装x86或x64的痛苦是一个巨大的痛苦. (4认同)

Mar*_*ram 9

我没有可用于测试此功能的机器,但它应该可以工作.首先,您可能需要安装2007 Office System驱动程序:数据连接组件Microsoft Access数据库引擎2010可再发行组件.然后尝试以下代码,请注意您需要在下面的Select语句中更改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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我没有一个环境来测试这个(一个安装了Office)所以我不能说它是否适用于你的环境但是我不明白它为什么不能工作.

  • 以下是我以前没有听说过的内容:https://code.google.com/p/linqtoexcel/ (3认同)

Rob*_*vey 6

将Excel文件保存为CSV,并使用CSV读取器库(如FileHelpers)使用C#读取生成的文件.


pet*_*ski 5

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