【问题标题】:VB: Error loading type library/DLL. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)VB:加载类型库/DLL 时出错。 (来自 HRESULT 的异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY)
【发布时间】:2018-10-17 00:35:04
【问题描述】:

我正在开发一个需要从 Excel 导入数据的应用程序。

我的解决方案是使用Microsoft.office.Interop.Excel.

但我在调试时收到此错误:

Message=无法转换 COM 类型的对象 'Microsoft.Office.Interop.Excel.ApplicationClass' 到接口类型 'Microsoft.Office.Interop.Excel._Application'。此操作失败 因为接口的 COM 组件上的 QueryInterface 调用 使用 IID '{000208D5-0000-0000-C000-000000000046}' 失败,因为 以下错误:加载类型库/DLL 时出错。 (例外来自 HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))

下面是我的代码:

Imports Excel = Microsoft.office.Interop.Excel

Private Sub BExcel1_Click(sender As Object, e As EventArgs) Handles BExcel1.Click
    OpenFileDialog1.Filter = "Excel Files|*.xlsx; *.xls; *.xlsm"
    If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
        ExcelPath1.Text = OpenFileDialog1.FileName
    End If

    Dim XlApp As New Excel.Application
    Dim XlWorkBook As Excel.Workbook
    Dim XlWorkSheet As Excel.Worksheet
    XlWorkBook = XlApp.Workbooks.Open(ExcelPath1.Text)

 End Sub

我用谷歌搜索了一些解决方案(如下),但没有成功:

  1. Office我已经修好了
  2. 我已经修复了 Visual Studio
  3. 我用注册表编辑器查看了Computer\HKEY_CLASSES_ROOT\TypeLib\,但是在00020813-0000-0000-C000-000000000046下,我只有一个1.9版本,好像不是两个版本之间的冲突?

有什么办法可以解决这个问题吗?

VS version:2017 community

Excel version:2016

Microsoft.Office.Interop.Excel version:15.0.0.0

【问题讨论】:

  • 修复office不行,重新安装。在执行此操作之前运行 chkdsk.exe 以验证磁盘驱动器是否仍处于正常状态。
  • Excel 2016 应该显示版本 16.#,而不是 15,即 Office 2013。您在哪里看到这些冲突的版本号?
  • @Cindy Microsoft.Office.Interop.Excel 的版本来自 Visual Studio 属性管理器的参考属性。它显示 15.0.0.0。而Computer\HKEY_CLASSES_ROOT\TypeLib\下的key 00020813-0000-0000-C000-000000000046,只有子key 1.9 (Computer\HKEY_CLASSES_ROOT\WOW6432Node\TypeLib\{00020813-0000-0000-C000-000000000000) ,在默认标记下:数据:Microsoft Excel 16.0 对象库)。我没有看到任何冲突的版本号,所以我很困惑。
  • 您的机器上安装了哪个版本的 Excel?
  • @Cindy Office 2016 标准。

标签: excel vb.net office-interop


【解决方案1】:

首先,尝试使用/ResetUserData 命令行参数运行Visual Studio。在Error "Unable to cast COM object..." when exporting to Microsoft Excel from Team Explorer 2008 文章中阅读更多相关信息。

显然您正在尝试连接到错误的 Excel 版本。卸载旧版本的 Office 后,您似乎还有一些额外的 Windows 注册表项,反之亦然。不管怎样,看看How to solve “Unable to cast COM object of type Microsoft.Office.Interop.Excel.ApplicationClass’ to interface type ‘Microsoft.Office.Interop.Excel._Application’” 博客文章,它描述了完全相同的问题。基本上你需要在windows注册表中找到错误的条目,然后将其删除。

顺便说一句,当您向项目添加新的 COM 引用时,会自动生成丢失的 PIA(如果它不再存在)。所以,这是一种可能的方式。您也可以尝试将互操作类型嵌入到您自己的程序集中,如下面的屏幕截图所示:

【讨论】:

  • 投反对票的人最好描述或发表评论为什么他们认为帖子没有回答发布的问题或解决问题。
  • 我想反对票是因为这几乎是“仅链接”的内容,指向外部资源。网站指南规定信息应在现场,而不是在网站外部。如果它已经在现场,则应将问题标记为重复。
  • 我投了反对票,因为信息是在一个链接中提供的,该链接现在已失效,这就是为什么仅链接响应令人沮丧的原因。
  • 在这种情况下,指向 MS 的链接是正确的,并且解决了我的问题。感谢您提供它。他们都为我打开。仅供参考,我的来自 VS2019 中编写的 WPF/C# 服务应用程序。这是一台“新机器”,在尝试安装旧版本的 Office 时出现垃圾,但被错误删除并安装了新版本。这个问题和你的解决方案帮助很大。
【解决方案2】:

如果您将Embed Interop Types 属性设置为True(从.NET Framework 4.0 开始)并将Specific Version 属性设置为False 以供Office 互操作程序集引用,那么您的代码应该适用于任何版本的Excel。

但是,您必须以与您的 Office 相同的位数编译代码。对于 32 位版本的 Office,必须将代码编译为x86,否则在 64 位机器上仍然会出现此异常!

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 2011-04-08
    • 2012-07-13
    • 2016-05-29
    • 2021-05-05
    • 2011-01-17
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多