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

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环境
    1. 在解决方案资源管理器中右键项目节点,选择「引用」,找到现有Microsoft.Office.Interop.Excel、office相关引用,全部移除
    2. 右键「引用」选择「添加引用」,切换到COM标签页,在类型库列表中找到Microsoft Excel 16.0 Object Library(对应Excel 365版本),勾选后确认添加
    3. 选中刚添加的Excel互操作引用,在属性面板中将「嵌入互操作类型」设置为True,「特定版本」设置为False,避免后续小版本更新再次出现版本匹配报错
    4. 修正单元格取值逻辑,将xlRange.Cells[xlRow, n].ToString()替换为xlRange.Cells[xlRow, n].Value2?.ToString(),同时补充COM对象释放逻辑,避免后台残留Excel进程
  • 方案2:移除Office互操作依赖(生产环境推荐)
    基于Office互操作的实现要求运行设备必须安装对应版本的Office,且稳定性差、内存泄漏问题频发,完全可以替换为无Office依赖的实现方案:
    1. 使用NPOI、EPPlus等开源Excel处理库直接读取xls/xlsx文件内容,不需要启动Excel进程,也不要求设备安装Office
    2. 读取到结构化的表格数据后,使用SqlBulkCopy批量写入SQL Server,导入效率远高于互操作方案,也不会出现版本兼容问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:09:14