65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 中的 OLEDB 读写 Excel 文件( 无需互操作)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (16投票s)

2016年3月30日

CPOL

3分钟阅读

viewsIcon

112286

downloadIcon

3387

在 C# 中使用 OLEDB 读写 Excel 文件, 无需互操作

引言

您是否正在寻找一种无需 Interop COM 即可读写 Excel 文件的方法?想同时读取 XLS 和 XLSX 格式吗?那么请阅读这篇文章 - 它将真正帮助您使用 OLEDB 读写 Excel 文件。

背景

早些时候,当我还是一名新手程序员时,我曾经使用 Interop 对象读写 Excel 文件,但它是一个非托管且庞大的实体,而且由于其 "糟糕" 的性能,我迫切需要一些比 Interop 更好的替代方案。我研究了 OLEDB,它在读写 Excel 文件方面表现非常好。

Using the Code

在开始从 Excel 文件中读/写之前,我们需要使用连接字符串连接到 OLEDB,在这里 OLEDB 将充当您的程序和 EXCEL 之间的桥梁。

Excel 表格的行和列可以直接使用 OLEDB 导入到数据集,无需使用 INTROP EXCEL 对象打开 Excel 文件。

让我们从代码开始。

// Connect EXCEL sheet with OLEDB using connection string
// if the File extension is .XLS using below connection string
//In following sample 'szFilePath' is the variable for filePath
 szConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;
                       "Data Source='" + szFilePath + 
                       "';Extended Properties=\"Excel 8.0;HDR=YES;\"";
 
 // if the File extension is .XLSX using below connection string
 szConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;
                      "Data Source='" + szFilePath + 
                      "';Extended Properties=\"Excel 12.0;HDR=YES;\"";

在上述连接字符串中

  • Provider 是 Excel 文件的 OLEDB 提供程序,例如,Jet.OLEDB.4.0 用于 XLS 文件,ACE.OLEDB.12.0 用于 XLSX 文件
  • Data Source 是要读取的 Excel 文件的文件路径
  • 连接字符串还包含“Extended Properties”,例如 Excel 驱动程序版本,HDR Yes/No(如果源 Excel 文件的第一行是标题)

连接到 EXCEL 文件后,我们需要执行查询以从 sheet1检索记录。

访问 Excel 表格

有几种引用 Excel 表格的方法

  1. 使用工作表名称:借助工作表名称,您可以引用 Excel 数据,您需要在工作表名称中使用 '$',例如 Select * from [Sheet1$]
  2. 使用范围:我们可以使用范围来读取 Excel 表格。它应该有特定的地址来读取,例如 Select * from [Sheet1$B1:D10]

** 这里 $ 表示 EXCEL 表格/工作表已存在于工作簿中,如果您想创建一个新的工作簿/工作表,则不要使用 $,请看下面的示例

// Connect EXCEL sheet with OLEDB using connection string
 using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        conn.Open();
        OleDbDataAdapter objDA = new System.Data.OleDb.OleDbDataAdapter
        ("select * from [Sheet1$]", conn);
        DataSet excelDataSet = new DataSet();
        objDA.Fill(excelDataSet);
        dataGridView1.DataSource = excelDataSet.Tables[0];
    }
			
	//In above code '[Sheet1$]' is the first sheet name with '$' as default selector,
        // with the help of data adaptor we can load records in dataset		
	
	//write data in EXCEL sheet (Insert data)
 using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        try
        {
            conn.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;
            cmd.CommandText = @"Insert into [Sheet1$] (month,mango,apple,orange) 
            VALUES ('DEC','40','60','80');";
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            //exception here
        }
        finally
        {
             conn.Close();
             conn.Dispose();
        }
    }
			
//update data in EXCEL sheet (update data)
using (OleDbConnection conn = new OleDbConnection(connectionString))
	{
        try
        {
            conn.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;
            cmd.CommandText = "UPDATE [Sheet1$] SET month = 'DEC' WHERE apple = 74;";
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            //exception here
        }
        finally
        {
            conn.Close();
            conn.Dispose();
        }
    }

** OLEDB 不支持 DELETE 查询。

可能遇到的异常

  1. Microsoft.Jet.OLEDB.4.0” 提供程序未在本地计算机上注册。

    原因:当我们在 64 位机器上运行代码时,会发生此异常。

    如何解决:如果您的应用程序是基于桌面的,请使用 x86 CPU 编译您的 EXE。如果您的应用程序是基于 Web 的,请在应用程序池中启用“32 位应用程序”。

  2. 此 ISAM 不支持删除链接表中的数据。

    原因:正如我们已经讨论过的,OLEDB 不支持 DELETE 操作。如果尝试从 EXCEL 工作表中删除行,它会给您这样的异常。

与 INTEROP/COM 对象的优势

我们知道 EXCEL Interop 应用程序也可以用于完成此任务,但是相对于 INTEROP/COM 对象,它有几个优点,请参阅以下几点

  1. Interop 对象是庞大且非托管的对象
  2. 如果您在 IIS 中将此代码作为 Web 应用程序运行,则需要特殊权限才能启动组件服务
  3. 当我们使用 OLEDB 读/写 Excel 时,不需要安装 Excel。4. OLEDB 在性能方面比 Interop 对象更快,因为没有创建 EXCEL 对象。

最后

事物总是有两面性。使用 OLEDB,您无法格式化在 EXCEL 工作表中插入/更新的数据,但 Interop 可以有效地做到这一点。您无法使用 OLEDB 执行任何数学运算或处理图表,但这确实是在没有安装 Excel 应用程序的情况下插入/更新 EXCEL 数据的很好方法。

欢迎提出意见和建议

谢谢!

© . All rights reserved.