无法转换类型' microsoft.Office.Interop.Excel.ApplicationClass'的COM对象to' microsoft.Office.Interop.Excel.Application'"

时间:2015-01-21 11:58:51

标签: c# excel com-interop

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

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

此代码使用了' Microsoft Excel 12.0对象库' ,我提到了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();

    }

}
}

12 个答案:

答案 0 :(得分:24)

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

步骤:

开始 - &GT;运行 - &gt;注册表 - &gt; HKEY_CLASSES_ROOT - &gt; TypeLib - &gt; {00020813-0000-0000-C000-000000000046} - &gt; 1.8 / 1.7(删除此)

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

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

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

答案 1 :(得分:13)

Microsoft Office 365

我在使用Windows 10运行Microsoft Office 365并尝试使用上述解决方案删除注册表项但未成功。

我转到控制面板试图修复Office 365套件。 enter image description here

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

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

答案 2 :(得分:6)

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

我只是添加了这个答案,因为我正在踢自己。花了两个小时在注册表中搜索密钥并且无处可去。骰子的最后一击就是尝试在Microsoft Office上进行简单的修复,突然我的错误消失了。

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

答案 3 :(得分:1)

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

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

删除1.9 enter image description here

问题解决了。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

将ProcessMonitor跟踪与使用Office 2016的工作计算机进行比较导致看起来像死胡同中的注册表项

  

HKEY_CLASSES_ROOT \ Wow6432Node \类型库\ {00024 ..

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

  

NAME NOT FOUND

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

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

答案 6 :(得分:0)

注册表中有1.7和1.8。 解决方法:删除:

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

答案 7 :(得分:0)

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”)。

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

P.S>由Process Monitor进行“处理后”检查-现在第一个探针从VBE6EXT.OLB提取文件C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\

答案 8 :(得分:0)

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

这对我有用:

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

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

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

此后,发生了此问题。 密钥的删除提示了Office 2013的自动修复,该问题解决了我的问题。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

答案 11 :(得分:-2)

使用完全相同的代码,当在另一台笔记本电脑上一切正常时,我在笔记本电脑上遇到了相同的问题。我尝试了互联网上到处都是的各种解决方案,但最终起作用的是使用非32位版本库的明确定义。为了在Visual Studio中进行此操作,我必须在项目配置的build部分中勾选然后取消选中“ Prefer 32-bit”框,该框在.csproj文件中添加了<Prefer32Bit>false</Prefer32Bit>