C#调用Microsoft.Office.Interop.Excel报15.0.0.0版本程序集加载失败错误
问题背景
实现WinForm按钮点击事件,完成Excel工作表数据导入SQL Server的功能,运行环境为安装了Microsoft Excel 365的工作设备,点击按钮时触发程序报错,初步怀疑是Excel 365兼容问题、互操作文件缺失,查阅公开资料未找到适配当前场景的解决方案。
具体报错信息
System.IO.FileNotFoundException: Could not load file or assembly 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'. The system cannot find the file specified.
File name: 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'
现有实现代码
using Microsoft.Office.Interop.Excel; namespace FormSqlInsertCsv { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnImport_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Excel.Application xlApp; Microsoft.Office.Interop.Excel.Workbook xlWorkbook; Microsoft.Office.Interop.Excel.Worksheet xlWorksheet; Microsoft.Office.Interop.Excel.Range xlRange; int xlRow; string strFileName; openFD.Filter = "Excel Office |*.xls; *xlsx"; openFD.ShowDialog(); strFileName = openFD.FileName; if(strFileName != "") { xlApp = new Microsoft.Office.Interop.Excel.Application(); xlWorkbook = xlApp.Workbooks.Open(strFileName); xlWorksheet = (Worksheet)xlWorkbook.Worksheets["Sheet1"]; //xlRange = xlWorksheet.UsedRange; xlRange = (Microsoft.Office.Interop.Excel.Range)xlWorksheet.UsedRange; int i = 0; for(xlRow = 2; xlRow <= xlRange.Rows.Count; xlRow++) { i++; dgvEmployees.Rows.Add(i, xlRange.Cells[xlRow, 1].ToString(), xlRange.Cells[xlRow, 2].ToString(), xlRange.Cells[xlRow, 3].ToString(), xlRange.Cells[xlRow, 4].ToString(), xlRange.Cells[xlRow, 5].ToString(), xlRange.Cells[xlRow, 6].ToString()); } xlWorkbook.Close(); xlApp.Quit(); } } } }
故障原因
这个报错确实是互操作程序集版本不匹配导致的。报错中提示找不到的office, Version=15.0.0.0是Office 2013对应的主互操作程序集(PIA),而Excel 365对应的互操作程序集版本为16.0.0.0,项目中引用的是旧版本Office的互操作组件,当前设备安装的Excel 365没有注册对应旧版本的程序集,因此加载失败。
另外现有代码还存在两个隐性问题:
- 直接对
xlRange.Cells[xlRow, n]调用ToString()无法获取单元格实际值,该对象本身是COM封装的Range类型,直接转字符串只会得到System.__ComObject,需要取Value2属性才能拿到单元格存储的内容 - 代码仅做了工作簿关闭和应用退出操作,没有手动释放COM对象,运行后会在后台残留大量EXCEL.exe进程,长期运行会耗尽系统资源
解决方案
- 方案1:修正互操作引用适配当前Excel 365环境
- 在解决方案资源管理器中右键项目节点,选择「引用」,找到现有
Microsoft.Office.Interop.Excel、office相关引用,全部移除 - 右键「引用」选择「添加引用」,切换到COM标签页,在类型库列表中找到Microsoft Excel 16.0 Object Library(对应Excel 365版本),勾选后确认添加
- 选中刚添加的Excel互操作引用,在属性面板中将「嵌入互操作类型」设置为
True,「特定版本」设置为False,避免后续小版本更新再次出现版本匹配报错 - 修正单元格取值逻辑,将
xlRange.Cells[xlRow, n].ToString()替换为xlRange.Cells[xlRow, n].Value2?.ToString(),同时补充COM对象释放逻辑,避免后台残留Excel进程
- 在解决方案资源管理器中右键项目节点,选择「引用」,找到现有
- 方案2:移除Office互操作依赖(生产环境推荐)
基于Office互操作的实现要求运行设备必须安装对应版本的Office,且稳定性差、内存泄漏问题频发,完全可以替换为无Office依赖的实现方案:- 使用NPOI、EPPlus等开源Excel处理库直接读取xls/xlsx文件内容,不需要启动Excel进程,也不要求设备安装Office
- 读取到结构化的表格数据后,使用
SqlBulkCopy批量写入SQL Server,导入效率远高于互操作方案,也不会出现版本兼容问题
内容的提问来源于stack exchange,提问作者CGarden
相关产品推荐
相关产品推荐

