关于c#:无法将’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对象库",我引用了Microsoft.Office.Interop.Excel。

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

我挖掘了一点这个网站,发现了这个解决方案:无法嵌入互操作类型

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

我的.NET版本是4.5。

任何帮助都非常感谢。

事先谢谢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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-0000000000 46——>1.8/1.7(删除此项)

解决方案:可以通过删除更高版本的Office中的无效注册表项来解决此问题。按照上述步骤操作。

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

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


Microsoft Office 365

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

我去了控制面板试图修复Office365套件。enter image description here

我选择了快速修复enter image description here

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


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

我添加这个答案只是因为我现在在踢自己。花了两个小时在登记处寻找钥匙却一无所获。最后一次冒险是尝试在Microsoft Office上进行简单的修复,突然我的错误消失了。

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


在登记处有1.7和1.8。通过删除解决:

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

一台计算机已更新到Office2016 64位,当从32位应用程序调用时,COM接口抛出异常。它没有像jayesh答案中那样的旧类型库条目。

将ProcessMonitor跟踪与使用Office 2016的工作计算机进行比较,结果发现

HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{00024..

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

NAME NOT FOUND

失败的机器拥有注册表项,但不久之后就会抛出异常。

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


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