74

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

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

4

5 回答 5

104

可以选择使用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 数据库引擎组件并将其安装在目标计算机上。

提供者称为Microsoft.ACE.OLEDB.12.0;. 注意这个组件有两个版本,一个是32bit的,一个是64bit的。为您的应用程序的位数和安装的 Office 版本(如果有)选择合适的版本。要使该驱动程序正确地为您的应用程序工作,有很多怪癖。例如看这个问题

当然,您不需要在目标机器上安装 Office。

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

于 2013-04-03T17:00:43.500 回答
23

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

祝你好运!

于 2013-04-03T16:56:20.617 回答
9

将 Excel 文件保存为 CSV,并使用 C# 使用FileHelpers 之类的 CSV 阅读器库读取生成的文件。

于 2013-04-03T16:55:00.477 回答
9

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

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),所以我不能说它是否可以在你的环境中工作,但我不明白为什么它不应该工作。

于 2013-04-03T17:14:32.690 回答
5

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

于 2013-04-03T16:55:35.030 回答