繁体   English   中英

无法将“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 中捕获一些数据。

我收到错误“无法将'microsoft.Office.Interop.Excel.ApplicationClass'类型的COM对象转换为'microsoft.Office.Interop.Excel.Application'”。

这段代码使用了“Microsoft Excel 12.0 Object Library”,我参考了 Microsoft.Office.Interop.Excel。

尽管如此,我还是无法克服这个错误——我相信它有它自己的快速解决方案。

我挖掘了一点这个站点并遇到了这个解决方案: 无法嵌入互操作类型

但是,我无法理解,因此无法实施建议的解决方案。

我的 .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();

    }

}
}

微软办公室 365

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

我去控制面板试图修复 Office 365 套件。 在此处输入图像描述

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

我选择了快修在此处输入图像描述

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

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

脚步:

开始--> 运行--> 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 版本的旧引用的答案是正确的。

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

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

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

检查注册表->HKEY_CLASSES_ROOT->TypeLib,查找{00020813-0000-0000-C000-000000000046}只存在一条记录“1.9”,没有别的。

通过进程监视器检查问题,检测从vbe6ext.olb查找和读取可能存在的问题(许多结果带有“NAME NOT FOUND”)。

问题消失后, 从控制面板的维修办公室进行了“快速修复”。

PS> 由进程监视器检查“处理后” - 现在文件VBE6EXT.OLB正在从C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\通过第一次探测获取。

就我而言,我在以下位置删除 regedit:

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

删除 1.9 在此处输入图像描述

问题解决了。

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

将 ProcessMonitor 跟踪与使用 Office 2016 的工作机器进行比较会导致在

HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{00024..

工作机器将检查不存在的注册表项并返回

未找到姓名

故障机器拥有注册表项,但随后不久将引发异常。

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

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

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

维修办公室对我不起作用。 我进行了全面修复,但问题仍然存在。

这对我有用:

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

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

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

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

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

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

无论出于何种原因,我的脚本有一天刚刚停止工作。

这里这样在 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)). 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}\1.9\0\win32]
@="C:\\Program Files\\Microsoft Office\\Root\\Office16\\EXCEL.EXE"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM