.NET 8 WinForms项目中System.Data.OleDb.OleDbConnection读取Excel失败
解决建议
1. 匹配ACE驱动与项目平台位数
.NET 8项目默认以Any CPU编译,但Microsoft ACE OLEDB驱动分32位和64位版本,二者必须严格匹配:
- 若已安装64位ACE驱动,右键项目→属性→生成→平台目标选择x64;
- 若安装的是32位ACE驱动,平台目标选x86;
- 未安装驱动的话,下载对应位数的
Microsoft Access Database Engine 2010 Redistributable(注意:需与已安装的Office位数一致,否则会出现冲突)。
2. 修正连接字符串
.NET 环境下ACE连接字符串需更严谨,调整为:
MyConnection = New System.Data.OleDb.OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";")
- 添加
Xml后缀适配新版Excel格式; HDR=YES指定第一行为表头,IMEX=1强制混合数据类型按文本读取,避免数据丢失或类型报错;- 注意用双引号包裹
Extended Properties的内容,确保语法正确。
3. 添加OleDb依赖
.NET 8中System.Data.OleDb并非默认引用,需手动添加:
右键项目→管理NuGet程序包→搜索System.Data.OleDb并安装最新稳定版。
4. 替代方案:使用EPPlus库(推荐)
若ACE驱动兼容性问题难以解决,推荐使用更适配.NET Core/.NET 5+的EPPlus库读取Excel:
- 安装NuGet包:
Install-Package EPPlus - 示例VB代码:
Using package = New OfficeOpenXml.ExcelPackage(New FileInfo(path)) Dim worksheet = package.Workbook.Worksheets(selectedNOD) ' 读取A1到I49的单元格范围 Dim range = worksheet.Cells("A1:I49") ' 转换为DataTable(True表示第一行是表头) Dim dt = range.ToTable(True) ' 后续业务逻辑处理DataTable End Using
EPPlus无需依赖ACE驱动,跨平台兼容性更强,API也更直观。
5. 捕获详细异常排查
在代码中添加异常捕获,获取具体错误信息:
Try MyConnection.Open() ' 执行数据读取逻辑 Catch ex As Exception MessageBox.Show(ex.ToString()) ' 查看完整错误栈,定位具体问题 Finally MyConnection?.Close() End Try
常见问题包括:文件路径错误、工作表名称拼写错误、文件被其他程序占用、权限不足等。
内容的提问来源于stack exchange,提问作者MJK
相关产品推荐
相关产品推荐

