无法将类型为“microsoft.Office.Interop.Excel.ApplicationClass”的COM对象转换为“microsoft.Office.Interop.Excel.Application”

47

我正在尝试在C#控制台应用程序中从Excel中捕获一些数据。

我遇到了以下错误:

无法将类型为“microsoft.Office.Interop.Excel.ApplicationClass”的COM对象强制转换为类型“microsoft.Office.Interop.Excel.Application”

该代码使用了“Microsoft Excel 12.0 Object Library”,并且我已经引用了“Microsoft.Office.Interop.Excel”。

我在这个网站上找到了一些信息:Interop type cannot be embedded,但我无法理解如何实现所建议的解决方案。

我的 .NET 版本是 4.5。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;

using Excel = Microsoft.Office.Interop.Excel;

namespace deneme
{
class Program
{
    static void Main(string[] args)
    {

        Excel.Application xlApp = new Excel.Application();
        xlApp.Visible = true; // <-- excel application
        xlApp.DisplayAlerts = false;

        // Open the workbook.
        Excel.Workbook wBook = xlApp.Workbooks.Open("C:\\FNN\\XLA\\fnnComTemplate.xlsx",
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);

        // get the sheet
        Excel.Worksheet wSheet = wBook.Sheets[0];
        // foreach (Excel.Worksheet sheet in wBook.Sheets) { if (sheet.Name == "templateSheet") { wSheet = sheet; } }

        Excel.Range rng = wSheet.get_Range("A1");

        aux = wSheet.Range["F6"].Value;

        Console.WriteLine("interop result:" + aux);
        Console.ReadLine();

    }

}
}

http://www.codeproject.com/Tips/801032/Csharp-How-To-Read-xlsx-Excel-File-With-Lines-of - Amit
请点击此处阅读有关如何解决“无法将类型为Microsoft.Office.Interop.Excel.ApplicationClass的COM对象强制转换为类型Microsoft.Office.Interop.Excel.Application接口”的指导。 - Patrick Hofman
9个回答

77

针对Windows 10的Microsoft Office 365

我在运行Windows 10的Microsoft Office 365时,尝试了提到的解决方案以删除注册表键, 但没有成功。

我前往设置-> 应用程序 ,试图修复Office 365套件:

Windows 10+设置菜单中“应用程序和功能”下Microsoft Office 365条目的屏幕截图,鼠标指向/点击“修改”按钮

您可以按照以下步骤进行:

  1. 打开“开始”菜单
  2. 选择“设置”
  3. 选择“应用程序”
  4. 在默认页面“应用程序和功能”中搜索Microsoft 365
  5. 选择“Microsoft 365”
  6. 选择“修改”

我选择了“快速修复”选项:

具有选择“快速修复”选项的Office Modify向导的屏幕截图

这为我解决了问题。


2
快速修复帮了我(但至少需要5分钟)。确保在“添加或删除程序”中查找“Microsoft 365应用程序”,而不是“Office”,否则您将修复错误的办公室。最初我安装了office365,同时保留了旧版office。某个时候,Windows开始使用旧版office,我重新设置为使用新版,但随后出现了这个错误。 - Istvan Heckl
我一直在修复一个名为“Microsoft 365(Office)”的应用程序,但它什么也没做。最后我放慢了速度再次查看,发现还有一个名为“Microsoft Office 365 -en-us”的应用程序。在这里进行修复需要几分钟,但问题得到了解决。 - greg

45

如果这不是一个与代码相关的错误,请删除下面列出的注册表键。该问题是由于该键从更高版本的Office中保留而导致的。

步骤:

  1. 转到“开始”菜单
  2. 选择“运行”
  3. 输入regedit并按Enter
  4. 导航至HKEY_CLASSES_ROOT -> TypeLib -> {00020813-0000-0000-C000-000000000046} -> 1.9/1.8/1.7
  5. 删除注册表键

8
请说明你从 OP 的问题中发现了什么问题,删除这个注册表键会产生什么影响,为什么你认为这样做能够解决 OP 的问题,以及你在哪里找到这个解决方案。 - CodeCaster
如果您使用的是Office2016,但无法使交互操作正常工作,则需要安装Off2013。然后,您需要删除此注册表键才能使Office交互操作正常工作。 如果您没有Office交互操作,请安装NuGet包https://www.nuget.org/packages/Microsoft.Office.Interop.Excel/。 - OSP
3
老问题,我知道但是:太棒了!你刚刚为我们节省了很多时间!另外需要补充的是,当你从64位转换到32位时,这也可能会发生。这个方法有效是因为显然office interop尝试使用最高版本和/或64位(如果可用)。如果在此键中存在不存在的路径,则会出现此错误。因此,如果卸载了office版本但该键仍然存在,则在查找路径时会失败! - rperz86
谢谢你,rperz86。这就是我要说的了。我从64位切换到32位,因为有一个应用程序要在一些旧电脑上使用,我认为32位是一个安全的选择。所以是的,给旧帖子添加评论确实有帮助。谢谢。 - undefined

11

我只需要简单地修复一下Microsoft Office,问题就得到了解决。


我已经完成了这个,它可以工作! - Florence

2
一台机器已经升级到Office 2016 64位,但从32位应用程序调用COM接口时会抛出异常。它没有像Jayesh的答案中那样的旧TypeLib条目。
将ProcessMonitor跟踪与安装了Office 2016的工作机器进行比较,发现在HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{00024..下有死亡注册表键。
工作的计算机将检查不存在的注册表键并返回“NAME NOT FOUND”。
失败的计算机有注册表键,但随后不久就会抛出异常。
重复删除注册表键,重新运行跟踪,删除下一个失败的键后,COM接口功能得以恢复。

2
使用完全相同的代码,我在一台笔记本电脑上遇到了同样的问题,而在另一台电脑上一切正常。我尝试了在互联网上找到的各种解决方案,但最终起作用的是明确定义使用非32位版本的库。为此,在Visual Studio中,我必须在项目配置的构建部分中选中然后取消选中“优先选择32位”框,这将在.csproj文件中添加<Prefer32Bit>false</Prefer32Bit>

1
我的设置:Visual Studio:2019,Office:2019 x64,目标框架:net5.0-windows 无法帮助我解决错误:
无法将类型为'System.__ComObject'的COM对象强制转换为接口类型'Microsoft.Office.Interop.Excel.Application'。因为在IID'{000208D5-0000-0000-C000-000000000046}'与COM组件上的QueryInterface调用失败,原因是以下错误:错误加载类型库/DLL。(0x80029C4A(TYPE_E_CANTLOADLIBRARY))。
因此,我通过Sysinternals Process Monitor找到了Win32注册表中Excel.exe的缺失文件路径,并将其更改为现有的x64版本:
[HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}\1.9\0\win32]
@="C:\\Program Files\\Microsoft Office\\Root\\Office16\\EXCEL.EXE"

1

我在PowerShell中遇到了这个问题。除了上述的问题,$xlApp.Workbooks对我返回了null。在32位模式下运行PowerShell脚本解决了我的问题。


1

开始 -> 运行 -> 注册表 找到以下路径 HKEY_CLASSES_ROOT\TypeLib{00020813-0000-0000-C000-000000000046} 并删除它 然后修复您的Office程序包


0
在我的情况下,我删除了以下注册表项:HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046},同时删除了版本1.9,enter image description here,问题解决了。

1
这似乎重复了Jayesh Goyani在2015年的被接受答案。 - TylerH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接