You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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」进行安装。

三、优化代码逻辑

  1. 过滤无效工作表名称:OLEDB返回的表名可能包含非工作表对象(如命名区域),需增加校验:
sheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString().Trim();
// 仅处理带$后缀的工作表
if (!sheetName.EndsWith("$") && !sheetName.EndsWith("$'"))
{
    continue;
}
  1. 增加异常捕获:添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:15:31