我正在开发一个需要从Excel导入数据的应用程序。
我的解决方案是使用Microsoft.office.Interop.Excel.
但是我在调试时遇到了这个错误:
Message =无法转换类型的COM对象 ' Microsoft.Office.Interop.Excel.ApplicationClass'到界面类型 ' Microsoft.Office.Interop.Excel._Application&#39 ;.此操作失败 因为QueryInterface调用COM组件的接口 与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
我已经google搜索了一些解决方案(如下所示),但它们没有成功:
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
答案 0 :(得分:0)
如果为Office Interop程序集引用将Embed Interop Types
属性设置为True
(自.NET Framework 4.0起),并且将Specific Version
属性设置为False
以进行Office Interop程序集引用,则您的代码应该适用于任何版本的Excel。
但是,您必须以与Office相同的位编译代码。对于32位版本的Office,必须将代码编译为x86
,否则在64位计算机上仍然会发生此异常!
答案 1 :(得分:-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注册表中找到一个错误的条目,然后删除它。
BTW当您向项目添加新的COM引用时,会自动生成错过的PIA(如果它不再存在)。所以,这是一种可能的方式。您也可以尝试将互操作类型嵌入到您自己的程序集中,如下面的屏幕截图所示: