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
相关产品推荐
相关产品推荐

