Windows11+VS2019下Microsoft.ACE.OLEDB.16.0未注册问题求助
解决ACE OLEDB驱动未注册错误及替代方案
一、修复Microsoft.ACE.OLEDB.16.0' provider is not registered错误
1. 调整Visual Studio项目平台目标
系统和Office均为64位,但VS默认的Any CPU模式可能强制以32位进程运行,导致无法加载64位ACE驱动:
- 右键项目 → 属性 → 生成 → 平台目标,选择x64
- 取消勾选“首选32位”(若该选项存在)
- 重新编译运行
2. 确保ACE驱动正确安装
- 卸载所有已安装的32位ACE驱动(如有)
- 重新下载并安装64位版本的Microsoft Access Database Engine 2016 Redistributable,安装过程保留默认路径
- 安装完成后重启VS及电脑
3. 修正OLEDB连接字符串
你的连接字符串存在空格和引号拼接问题,使用以下标准格式(以C#为例):
// 针对.xlsx文件 string connectionString = $"Provider=Microsoft.ACE.OLEDB.16.0;Data Source=\"{Path}\";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";";
- 移除
Provider、Data Source等关键字与等号之间的空格 - 用转义引号包裹含空格的路径和扩展属性
HDR=YES表示第一行作为表头,IMEX=1强制混合数据类型以文本读取,避免数据丢失
二、无需ACE驱动的替代方案(除IronXL外)
1. EPPlus
- 特点:旧版本(4.x)为MIT开源协议,仅支持.xlsx/.xlsb文件,API简洁,无Office或ACE驱动依赖;新版本需商业授权
- 示例代码:
using OfficeOpenXml; // EPPlus 5+需设置许可 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage(new FileInfo(Path))) { var worksheet = package.Workbook.Worksheets.First(); int rowCount = worksheet.Dimension.Rows; int colCount = worksheet.Dimension.Columns; for (int row = 1; row <= rowCount; row++) { for (int col = 1; col <= colCount; col++) { Console.WriteLine(worksheet.Cells[row, col].Text); } } }
2. NPOI
- 特点:Apache开源协议,支持.xls和.xlsx格式,跨平台,无外部依赖
- 示例代码:
using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // 处理.xlsx文件,.xls文件用HSSFWorkbook using (var stream = new FileStream(Path, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = new XSSFWorkbook(stream); ISheet sheet = workbook.GetSheetAt(0); for (int row = 0; row <= sheet.LastRowNum; row++) { IRow currentRow = sheet.GetRow(row); if (currentRow != null) { for (int col = 0; col < currentRow.LastCellNum; col++) { ICell cell = currentRow.GetCell(col); Console.WriteLine(cell?.ToString() ?? string.Empty); } } } }
3. ClosedXML
- 特点:MIT开源协议,专注于.xlsx文件,API直观易用,适合快速开发
- 示例代码:
using ClosedXML.Excel; using (var workbook = new XLWorkbook(Path)) { var worksheet = workbook.Worksheet(1); var range = worksheet.RangeUsed(); foreach (var row in range.Rows()) { foreach (var cell in row.Cells()) { Console.WriteLine(cell.Value.ToString()); } } }
内容的提问来源于stack exchange,提问作者გიორგი თაყნიაშვ</think_never_used_51bce0c785ca2f68081bfa7d91973934>
相关产品推荐
相关产品推荐

