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

Posted

技术标签:

【中文标题】无法将“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'" 【发布时间】:2015-03-19 22:37:55 【问题描述】:

这是我第一次尝试在一个 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();

    



【问题讨论】:

codeproject.com/Tips/801032/… 见here。 【参考方案1】:

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

步骤:

开始-->运行--> 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,则此问题是由遗留的注册表项引起的。

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

【讨论】:

请解释您从 OP 的问题中发现了什么问题,删除此注册表项有什么作用,您认为这将解决 OP 问题的原因以及您在哪里找到了此解决方案。 @CodeCaster 有道理。如果您详细说明答案下方的逻辑,那么其他一些用户将非常有用。而且,再次感谢! 如果您有 Office2016 并且无法使互操作正常工作,您需要安装 Off2013。您需要删除此注册。让办公室互操作工作的关键。如果您没有办公室互操作安装 nuget 包nuget.org/packages/Microsoft.Office.Interop.Excel 老问题,我知道但是:酷!您刚刚为我们节省了很多时间!补充一点,当您从 64 位迁移到 32 位时,也可能会发生这种情况。这是可行的,因为显然办公室互操作正在尝试使用最高版本和/或 64 位(如果可用)。如果此键中有不存在的路径,则会报此错误。所以如果office版卸载了但是key还在的话,查找路径就失败了!【参考方案2】:

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

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

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

HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\00024..

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

找不到名字

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

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

【讨论】:

在尝试了我能想到的一切之后,我读到了这篇文章并意识到我将编译器设置为更喜欢 32 位。取消选中该框是拼图的最后一块。【参考方案3】:

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

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

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

【讨论】:

祝福你,自从过去 45 分钟以来我一直卡住【参考方案4】:

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

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

【讨论】:

【参考方案5】:

微软 Office 365

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

我去了控制面板,试图修复 Office 365 套件。

    右键单击开始菜单 点击应用和功能 搜索 Microsoft 365 单击 Microsoft 365 点击修改

我选择了快速修复

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

【讨论】:

这是我的问题,升级后我的com对象不起作用,我必须在office 360​​安装完成后修复......真是痛苦。 这个解决方案对我有用。我什至没有在接受的答案中列出 reg 条目。 我在接受的答案中的注册表中有“1.9”版本。我不想删除它,因为它说删除“1.8”或“1.7”。无论如何,我尝试了这种快速修复,并且一切正常!无论在修复中更改注册表/清理,显然都是在此修复过程中完成的。谢谢亚历克斯! 在“安装在”Office 时,还要检查“程序和功能”下的选项。我正在拔头发,因为我刚刚更新了部分导出代码,程序开始崩溃,即使在全部回滚后仍然崩溃,但是开发机器。结果是最后一个 Microsoft Office 补丁破坏了一些东西,因为 Office 是今天“安装在”,即使我在 3 年前安装了它。快速修复解决了。 解决了我的问题!不错的收获!并且不需要 regedit hack... :)【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

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

在问题消失后,从Repair Office from the Control Panel 进行了“快速修复”。

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

【讨论】:

【参考方案8】:

就我而言 我删除注册表:

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

删除 1.9

问题解决了。

【讨论】:

【参考方案9】:

维修办公室不适合我。我进行了全面修复,但问题仍然存在。

这对我有用:

开始-->运行--> 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 的自动修复,解决了我的问题。

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

不知什么原因,我的脚本有一天停止工作了。

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

【讨论】:

【参考方案12】:

没有什么对我有用,所以我删除了 Office 32 位并安装了 64 位版本;错误消失了。

【讨论】:

以上是关于无法将“microsoft.Office.Interop.Excel.ApplicationClass”类型的 COM 对象转换为“microsoft.Office.Interop.Excel.App的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

无法将 ReactiveUI 添加到 NUnit 测试项目