C#调用Excel Interop出现ResolveComReference报错及DTSLib缺失如何解决
问题解决方案
第一步:清除无效DTSLib引用
你看到的4条DTSLib相关警告,是因为项目中误添加了不需要的SQL Server DTS服务依赖,操作Excel完全不需要这个库,直接删除即可:
- 右键你的项目→选择「管理NuGet程序包」/或者直接展开「引用」节点
- 在引用列表中找到
DTSLib,右键删除 - 重新生成项目,这4条警告会直接消失
第二步:修复ResolveComReference报错
这个报错是Excel COM组件引用解析失败导致的,按以下顺序排查:
- 确认Interop引用正确
要么直接通过NuGet安装官方的Microsoft.Office.Interop.Excel包,要么引用本地安装的Office对应的COM组件,不要引用其他机器拷贝的非对应版本dll。 - 匹配平台位数
确认你本地安装的Excel位数:打开Excel→文件→账户→关于Excel,查看是32位还是64位
然后右键项目→属性→生成→将「目标平台」修改为和Excel一致的位数(32位选x86,64位选x64),不要使用Any CPU。 - 重新注册COM组件(可选)
如果以上操作后还是报错,打开管理员权限的命令提示符:- 32位Office执行:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /codebase "你的Excel Interop dll完整路径" - 64位Office执行:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /codebase "你的Excel Interop dll完整路径"
- 32位Office执行:
第三步:优化业务代码
你现有代码存在路径错误、资源泄漏的问题,修改后可直接实现读取工作表名加载到组合框的需求,参考代码如下:
using System; using System.Runtime.InteropServices; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace OpenDataSheet { public partial class FrmOpenDataSheet : Form { public FrmOpenDataSheet() { InitializeComponent(); LoadSheetNamesToCombo(); } private void LoadSheetNamesToCombo() { Excel.Application app = null; Excel.Workbook foodPantryWorkbook = null; try { app = new Excel.Application(); // 建议替换为文件的绝对路径,避免相对路径找不到文件 string excelPath = @"C:\完整路径\Food Pantry Registry.xlsm"; foodPantryWorkbook = app.Workbooks.Open(excelPath, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); // 遍历所有工作表,把名称添加到组合框,你的组合框假设名字是cbSheetNames cbSheetNames.Items.Clear(); foreach (Excel.Worksheet sheet in foodPantryWorkbook.Sheets) { cbSheetNames.Items.Add(sheet.Name); Marshal.ReleaseComObject(sheet); } // 默认选中第一个 if (cbSheetNames.Items.Count > 0) cbSheetNames.SelectedIndex = 0; } catch (Exception ex) { MessageBox.Show("读取Excel失败:" + ex.Message); } finally { // 释放COM资源,避免Excel进程残留 if (foodPantryWorkbook != null) { foodPantryWorkbook.Close(false); Marshal.ReleaseComObject(foodPantryWorkbook); } if (app != null) { app.Quit(); Marshal.ReleaseComObject(app); } } } private void CmdCancel_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("Food Pantry.exe"); Application.Exit(); } private void CmdSelectSheet_Click(object sender, EventArgs e) { // 选中工作表后的逻辑在这里写 if (cbSheetNames.SelectedItem != null) { string selectedSheet = cbSheetNames.SelectedItem.ToString(); // 后续处理逻辑 } } } }
内容的提问来源于stack exchange,提问作者PaulaJoann
相关产品推荐
相关产品推荐

