如何在C# Selenium中无需本地Excel及Interop读取Excel文件
解决OLEDB读取Excel「数据格式不正确」的方案
一、修正OLEDB连接字符串
你当前使用的Microsoft.Jet.OLEDB.4.0驱动仅支持32位系统和旧版.xls格式,若系统是64位或Excel为.xlsx新版格式,必然触发格式错误。建议替换为兼容更广的Microsoft.ACE.OLEDB.12.0驱动:
适配不同Excel格式的连接字符串:
- 针对
.xls格式:
string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";
- 针对
.xlsx格式:
string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;\"";
注:HDR=YES指定首行为表头,IMEX=1强制混合数据列按文本读取,避免类型识别错误引发的格式问题。
二、解决系统位数兼容性问题
项目编译位数与ACE驱动位数不匹配会导致连接失败:
- 打开Visual Studio,右键项目→属性→生成,将目标平台设置为
x86(对应32位ACE驱动)或x64(对应64位ACE驱动),保持与驱动位数一致。 - 若未安装ACE驱动,需下载对应位数的「Microsoft Access Database Engine 2010 Redistributable」进行安装。
三、优化代码逻辑
- 过滤无效工作表名称:OLEDB返回的表名可能包含非工作表对象(如命名区域),需增加校验:
sheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString().Trim(); // 仅处理带$后缀的工作表 if (!sheetName.EndsWith("$") && !sheetName.EndsWith("$'")) { continue; }
- 增加异常捕获:添加try-catch块定位具体错误:
try { con.Open(); // 原有读取逻辑 } catch (Exception ex) { Console.WriteLine($"读取错误:{ex.Message}"); throw; } finally { if (con.State == ConnectionState.Open) con.Close(); }
四、替代方案:使用ClosedXML(推荐)
ClosedXML无需依赖额外驱动,不要求本地安装Excel,兼容性更强,代码更简洁:
读取所有工作表到DataSet的示例代码:
using ClosedXML.Excel; using System.Data; private DataSet GetExcelDataSet(string path) { DataSet ds = new DataSet(); using (XLWorkbook workbook = new XLWorkbook(path)) { foreach (IXLWorksheet worksheet in workbook.Worksheets) { DataTable dt = new DataTable(worksheet.Name); // 读取表头 foreach (IXLColumn col in worksheet.ColumnsUsed()) { dt.Columns.Add(col.Cell(1).Value.ToString()); } // 读取数据行(跳过表头) foreach (IXLRow row in worksheet.RowsUsed().Skip(1)) { DataRow dr = dt.NewRow(); for (int i = 0; i < row.CellsUsed().Count(); i++) { dr[i] = row.Cell(i + 1).Value.ToString(); } dt.Rows.Add(dr); } ds.Tables.Add(dt); } } return ds; }
注:需通过NuGet安装ClosedXML包即可使用。
内容的提问来源于stack exchange,提问作者sheeba elizha
相关产品推荐
相关产品推荐

