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

ASP.NET MVC使用OleDB导入带警告的.xls文件失败求助

解决ASP.NET MVC中OleDB读取带警告的.xls文件问题

你遇到的这类Excel警告,本质是文件实际格式与扩展名不匹配(比如文件是.xlsx格式却被重命名为.xls,或是CSV文件改了.xls后缀),OleDB默认按扩展名选择驱动,格式不匹配时就会读取失败,和手动打开时需要确认的弹窗是同一原因。以下是针对性解决方案:

方案1:调整连接字符串,强制兼容格式

针对.xls文件,改用ACE驱动并添加参数强制统一读取规则,能解决大部分格式不匹配的问题。

第一步:修改配置文件的连接字符串

在web.config中新增或修改对应连接字符串:

<connectionStrings>
    <add name="ExcelXlsConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;ImportMixedTypes=Text';" />
    <add name="Excel07ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1;'" />
</connectionStrings>

参数说明:

  • IMEX=1:强制将混合数据类型的列按文本读取,避免因单元格类型不一致导致的读取中断
  • ImportMixedTypes=Text:统一处理同一列内的不同数据类型,全部转为文本导入
  • Microsoft.ACE.OLEDB.12.0:比旧版Jet驱动兼容性更强,支持跨版本格式读取

第二步:修改代码中的连接字符串分支

private bool ImportToDB(string filepath)
{
    try
    {
        var fileExtension = Path.GetExtension(filepath).ToLower();
        string conStr = "";

        switch (fileExtension)
        {
            case ".xls":
                conStr = ConfigurationManager.ConnectionStrings["ExcelXlsConString"].ConnectionString;
                break;
            case ".xlsx":
                conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
                break;
            default:
                return false;
        }

        conStr = string.Format(conStr, filepath);
        // 使用using自动释放资源,避免手动Close的疏漏
        using (OleDbConnection connExcel = new OleDbConnection(conStr))
        {
            connExcel.Open();
            DataTable dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            if (dtExcelSchema == null || dtExcelSchema.Rows.Count == 0)
                return false;
                
            string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

            using (OleDbCommand cmdExcel = new OleDbCommand($"SELECT * From [{SheetName}]", connExcel))
            {
                using (OleDbDataAdapter oda = new OleDbDataAdapter(cmdExcel))
                {
                    DataTable dt = new DataTable();
                    oda.Fill(dt);
                    
                    Debug.WriteLine(fileExtension);
                    Debug.WriteLine(dt.Rows.Count);
                    return true;
                }
            }
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
        return false;
    }
}

方案2:添加格式重试逻辑

如果部分文件格式匹配问题极端,可以尝试先按原扩展名读取,失败后自动切换驱动重试:

private bool ImportToDB(string filepath)
{
    try
    {
        // 准备两种格式的连接字符串模板
        var conStrTemplates = new List<string>
        {
            ConfigurationManager.ConnectionStrings["ExcelXlsConString"].ConnectionString,
            ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString
        };

        foreach (var template in conStrTemplates)
        {
            try
            {
                string conStr = string.Format(template, filepath);
                using (OleDbConnection conn = new OleDbConnection(conStr))
                {
                    conn.Open();
                    var schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    if (schemaTable?.Rows.Count == 0)
                        continue;

                    string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString();
                    using (var cmd = new OleDbCommand($"SELECT * FROM [{sheetName}]", conn))
                    using (var adapter = new OleDbDataAdapter(cmd))
                    {
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        Debug.WriteLine($"读取成功,行数:{dt.Rows.Count}");
                        return true;
                    }
                }
            }
            catch
            {
                // 当前驱动读取失败,尝试下一个
                continue;
            }
        }
        return false;
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
        return false;
    }
}

必备环境检查

  • 确保服务器已安装Microsoft Access Database Engine 2010 Redistributable(ACE驱动),64位服务器需注意:若安装32位驱动,需将应用程序池设置为"启用32位应用程序"。

内容的提问来源于stack exchange,提问作者Frank Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:43:16