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

unable to cast COM object of type 'microsoft.Office.Interop.Excel.ApplicationClass' to 'microsoft.Office.Interop.Excel.Application'"

这是我第一次尝试从一个 C# 控制台应用程序中 excel 捕获一些数据。

我收到错误 "unable to cast COM object of type 'microsoft.Office.Interop.Excel.ApplicationClass' to '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();

    }

}
}

如果这不是与代码相关的错误,请从注册表中删除以下给定的键。

步骤:

开始--> 运行 --> regedit --> HKEY_CLASSES_ROOT-->TypeLib-->{00020813-0000-0000-C000-000000000046} --> 1.8/1.7(删除这个)

解决方法: 可以通过删除较高版本 Office 遗留下来的无效注册表项来解决此问题。按照上述步骤。

原因: 如果您已将 Microsoft Office 版本从 Office 2010 降级到 Office 2007,或将 Office 2013 降级到 Office 2010 或 2007,则此问题是由遗留的注册表项引起的。

如果此解决方案对您没有帮助,请告诉我

一台机器已更新到 Office 2016 64 位,当从 32 位应用程序调用时,COM 接口抛出异常。它没有像 Jayesh 的回答中那样的旧 TypeLib 条目。

将 ProcessMonitor 跟踪与装有 Office 2016 的工作机器进行比较,导致

中看起来像死胡同的注册表项

HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{00024..

工作机器将检查不存在的注册表项和 return

NAME NOT FOUND

发生故障的机器有注册表项,但很快就会抛出异常。

在反复删除注册表项、重新运行跟踪、删除下一个失败的项后,COM 接口功能得以恢复。

我确信这个问题(和类似问题)的答案建议编辑注册表并删除对机器上不再存在的 Office 版本的旧引用是正确的

我添加这个答案只是因为我现在正在踢自己。花了两个小时在注册表中搜索密钥,但一无所获。最后一次掷骰子是尝试对 Microsoft Office 进行简单的 修复,然后我的错误突然消失了。

...在我看来,在深入手动编辑注册表之前尝试修复是值得的。

注册表中有 1.7 和 1.8。 通过删除解决:

HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}.8

微软 Office 365

我是 运行 Microsoft Office 365 和 Windows 10,并尝试了上述解决方案来删除注册表项,但没有成功。

I went to the control panel in an attempt to repair the Office 365 suite.

  1. 右键单击“开始”菜单
  2. 单击应用程序和功能
  3. 搜索 Microsoft 365
  4. 单击 Microsoft 365
  5. 点击修改

我选择了快修

再次尝试我的程序,一切正常!

使用完全相同的代码,我在笔记本电脑上遇到了同样的问题,而在另一台笔记本电脑上一切正常。我尝试了在互联网上随处可见的各种解决方案,但最终奏效的是使用非 32 位版本库的明确定义。为了在 visual studio 中这样做,我必须在项目配置的构建部分勾选然后取消勾选方框 "Prefer 32-bit",这会在 .csproj 文件中添加 <Prefer32Bit>false</Prefer32Bit>

Windows 7 x64 / Office 365 (16.0.x) 32 位 / 对比 2019

已检查注册表 ->HKEY_CLASSES_ROOT->TypeLib,查找 {00020813-0000-0000-C000-000000000046} 仅存在一条记录“1.9”,无否则。

通过 Process Monitor 检查问题,检测从 vbe6ext.olb 中查找和读取可能存在的问题(很多结果 "NAME NOT FOUND")。

Repair Office from the Control Panel 制作 "Quick Repair",问题解决后。

P.S> 由 Process Monitor 检查 "after treatment" - 现在文件 VBE6EXT.OLB 正由第一个探测器从 C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\ 获取。

以我为例 我删除注册表:

HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}

删除 1.9

问题解决了。

Repair Office 对我不起作用。我做了全面修复,但问题仍然存在。

这对我有用:

开始--> 运行 --> regedit --> HKEY_CLASSES_ROOT-->TypeLib-->{00020813-0000-0000-C000-000000000046} --> 1.8/1.7(删除整个节点)

当您从 Visual Studio Interop 应用程序调用时,Office 将自动修复。

我的情况是我安装了Office 2016但只是试用版。 我删除它并切换回 Office 2013。

之后就出现了这个问题。 删除密钥提示 Office 2013 的自动修复解决了我的问题。

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

不知为何,有一天我的脚本停止工作了。

运行 像 here 这样的 32 位模式的 Powershell 绕过了我的问题。

没有任何效果,所以我删除了 Office 32 位并安装了 64 位版本;错误消失了。

我的设置:Visual Studio:2019,Office:2019 x64,目标框架:net5.0-windows

没有任何帮助我避免错误:Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.Application'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208D5-0000-0000-C000-000000000046}' failed due to the following error: Error loading type library/DLL. (0x80029C4A (TYPE_E_CANTLOADLIBRARY)).

所以我通过 Sysinternals Process Monitor 发现在 Win32 注册表中缺少 Excel.exe 的文件路径,并将其更改为现有的 x64 版本:

[HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}.9[=10=]\win32]
@="C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"

修复我的 Office 2016 不起作用,我的注册表看起来很好(仅限 1.9)但我注意到这里提到的几个解决方案提到了 64 位和 32 位版本的 office,这让我想知道我是如何编译我的 ( VB净)程序。我的 Office 是 32 位的,但我的 Windows 是 64 位的,我在 Visual Studio (2019) 中使用“Any CPU”配置。将其更改为 x86 配置并重新编译解决了问题。