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






4.96/5 (16投票s)
在 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 表格的方法
- 使用工作表名称:借助工作表名称,您可以引用 Excel 数据,您需要在工作表名称中使用 '
$
',例如Select * from [Sheet1$]
- 使用范围:我们可以使用范围来读取 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 查询。
可能遇到的异常
- “
Microsoft.Jet.OLEDB.4.0
” 提供程序未在本地计算机上注册。原因:当我们在 64 位机器上运行代码时,会发生此异常。
如何解决:如果您的应用程序是基于桌面的,请使用 x86 CPU 编译您的 EXE。如果您的应用程序是基于 Web 的,请在应用程序池中启用“32 位应用程序”。
- 此 ISAM 不支持删除链接表中的数据。
原因:正如我们已经讨论过的,OLEDB 不支持
DELETE
操作。如果尝试从 EXCEL 工作表中删除行,它会给您这样的异常。
与 INTEROP/COM 对象的优势
我们知道 EXCEL Interop 应用程序也可以用于完成此任务,但是相对于 INTEROP/COM 对象,它有几个优点,请参阅以下几点
- Interop 对象是庞大且非托管的对象
- 如果您在 IIS 中将此代码作为 Web 应用程序运行,则需要特殊权限才能启动组件服务
- 当我们使用 OLEDB 读/写 Excel 时,不需要安装 Excel。4. OLEDB 在性能方面比 Interop 对象更快,因为没有创建 EXCEL 对象。
最后
事物总是有两面性。使用 OLEDB,您无法格式化在 EXCEL 工作表中插入/更新的数据,但 Interop 可以有效地做到这一点。您无法使用 OLEDB 执行任何数学运算或处理图表,但这确实是在没有安装 Excel 应用程序的情况下插入/更新 EXCEL 数据的很好方法。
欢迎提出意见和建议
谢谢!