无法将 '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.
- 右键单击“开始”菜单
- 单击应用程序和功能
- 搜索 Microsoft 365
- 单击 Microsoft 365
- 点击修改
我选择了快修
再次尝试我的程序,一切正常!
使用完全相同的代码,我在笔记本电脑上遇到了同样的问题,而在另一台笔记本电脑上一切正常。我尝试了在互联网上随处可见的各种解决方案,但最终奏效的是使用非 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 配置并重新编译解决了问题。
这是我第一次尝试从一个 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.
- 右键单击“开始”菜单
- 单击应用程序和功能
- 搜索 Microsoft 365
- 单击 Microsoft 365
- 点击修改
我选择了快修
再次尝试我的程序,一切正常!
使用完全相同的代码,我在笔记本电脑上遇到了同样的问题,而在另一台笔记本电脑上一切正常。我尝试了在互联网上随处可见的各种解决方案,但最终奏效的是使用非 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 配置并重新编译解决了问题。