excel - Excel to DataSet 使用 OLEDB 在 .NET Core 和 .NET Framework 之间工作方式不同
问题描述
我有一个引用 .NET Framework 类库的辅助服务。类库包含将 Excel 转换为数据集的方法。在 Visual Studio 上调试时,一切都按预期工作,但发布后我收到错误消息:
'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。
为了调试,我使用完全相同的代码构建了以下两个控制台应用程序——一个在 .NET Core 中,另一个在 .NET Framework 中。然后我在两台计算机上运行这些项目。
- 计算机 A:安装了 Microsoft Office 工具,但没有AccessDatabaseEngine.exe
- 计算机 B:未安装 Microsoft Office 工具、AccessDatabaseEngine
using System;
using System.Data;
using System.Data.OleDb;
using System.Text;
namespace ToDataSheetCore
{
class Program
{
static void Main(string[] args)
{
DataSet dt2 = ExcelToDataSetCommon("C:\\pathToExcel\\excelFile - AUGUST 04 2021.xlsx");
StringBuilder sb2 = new StringBuilder();
foreach (DataTable table in dt2.Tables)
{
foreach (DataRow row in table.Rows)
{
sb2.Append(string.Join(" ", row.ItemArray));
sb2.AppendLine();
}
}
Console.WriteLine(sb2);
Console.ReadLine();
}
public static DataSet ExcelToDataSetCommon(string SourceFilename)
{
DataSet ds = new DataSet();
try
{
string connStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES;\"", SourceFilename);
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
DataTable schemaDT = conn.GetSchema("Tables", new string[] { null, null, null, "TABLE" });
conn.Close();
string tableName = schemaDT.Rows[0]["TABLE_NAME"].ToString();
OleDbCommand cmd = new OleDbCommand(string.Format("SELECT * FROM [{0}]", tableName), conn);
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
adapter.Fill(ds);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
return ds;
}
}
}
结果
电脑A
.NET 核心
- 调试模式
将excel内容打印到控制台 - 发布模式-自包含(win64, anypc)
'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。
- 调试模式
.NET 框架
- 调试模式
'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。
- 发布模式——自包含
'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。
- 调试模式
电脑B
.NET 核心
- 调试模式
'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。
- 发布模式-自包含(win64, anypc)
'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。
- 调试模式
.NET 框架
- 调试模式
将excel内容打印到控制台(卸载AccessDatabaseEngine失败) - 发布模式 - 自包含
将 excel 内容打印到控制台(卸载 AccessDatabaseEngine 失败)
- 调试模式
我了解安装 AccessDatabaseEngine 提供程序会产生效果,但我不了解 .NET Framework 和 .NET Core 的不同结果。虽然我已经求助于使用ExcelDataReader,因为我想避免外部依赖。
我对 .NET Core 和 .NET Framework 之间使用 OleDB API 的结果差异感到困惑。有没有办法可以将 AccessDatabaseEngine 提供程序与 .NET 项目一起发布?
解决方案
推荐阅读
- docker-compose - 在 docker-compose 中定义 docker 注册表以在具有堆栈部署的 swarm 中使用
- python - 如何在熊猫中重置连胜
- python - Python。从 .txt 文件中删除单词
- opencv - 通过旋转组合求解PNP vs recoverPose:为什么翻译不一样?
- r - 如何将变量名称的数据框和另一个与回归数据匹配?
- python - 如何捕捉 2 个连续变量减少?
- mysql - 我正在寻找将删除重复项的 SQL 代码,其中重复项被定义为两个特定字段的相等性
- sql-server - 如果不为空,则 SQL 计数
- machine-learning - 多元线性回归中的虚拟变量
- excel - 使用 VBA 的用户表单输入