在使用C#创建Excel工作簿时出现未注册类错误

38

使用以下代码尝试访问Excel电子表格时,我在使用C#从安装了Office 2007(版本12)的Visual Studio 2012中定义工作簿对象wrkbuk时遇到“库未注册”错误。

Microsoft.Office.Interop.Excel.Application excapp = new Microsoft.Office.Interop.Excel.Application();
        string bookname = @"C:\Users\Public\Documents\RECRUITMENT & SELECTION\MOVEMENTS\MOVEMENTS\Miscellaneous Documents\VacanciesREAL.xls";
        Workbook wrkbuk = excapp.Workbooks.Open(bookname); 
        Worksheet wrksht = new Worksheet();

错误详情:

System.InvalidCastException未处理,HResult=-2147467262
Message=无法将类型为'Microsoft.Office.Interop.Excel.ApplicationClass'的COM对象强制转换为接口类型'Microsoft.Office.Interop.Excel._Application'。这个操作失败是因为对于IID'{000208D5-0000-0000-C000-000000000046}'的COM组件进行了QueryInterface调用,并由于以下错误而失败:库未注册。(HRESULT异常:0x8002801D(TYPE_E_LIBNOTREGISTERED)) Source=mscorlib

我已经在附带VS 2012的Office 14主要互操作程序集和Office 12版本的dll中创建了对Microsoft.Office.Interop.Excel.dll的引用,但都没有解决问题。我尝试使用regasm注册dlls,但这也没有帮助。

我可以使用Office 14和Office 12的dll在下面的行上创建工作表wrksht,因此问题似乎仅影响工作簿定义。

2013年12月17日

尝试重新安装Office 2007,但无济于事,但找到了这个解决方案,它有效。它位于

http://social.msdn.microsoft.com/Forums/vstudio/en-US/d3f92da7-96d3-404b-89d0-d236800ceae5/vs-2012-rc-and-visual-studio-tools-for-office?forum=vsto

问题是来自多个版本的Office的代码-我有来自Office 14的代码,可能来自VS 2012安装

我怀疑VS 2012 RC已安装了Office 2013类型库,并且现在注册了重复版本。我收到了特定错误消息

('unable to cast _Application'....'TYPE_E_LIBNOTREGISTERED')

在混乱的卸载后,然后重新安装较旧版本的Office。我通过遵循另一个无法找到的论坛线程的建议来解决它,在错误消息中搜索了CLSID,因此为{00020970-0000-0000-C000-000000000046}。它的注册表键包含两个键之一称为'TypeLib',其中又包含了类型库的另一个CLSID。然后我从头开始再次搜索注册表,以寻找第二个CLSID,这使我找到了相关的interop类型库。它有两个条目....8.3和8.4,更大的数字对应较新的Office版本....我删掉了它们...并立即能够运行我的程序。


该计算机上的注册表已损坏并且缺少一个键。重新安装 Office 以解决此问题。 - Hans Passant
或者您可以使用Open XML SDK(或类似ClosedXML的包装器)。这样,您就可以在机器上不需要安装Office的情况下创建Excel文档。 - Andreas Adler
修改了帖子以提供解决方案。 - SimonKravis
1
在安装Project 2013并保留Office 2010作为其他Office应用程序的情况下,我遇到了这个问题。我有一个为Outlook 2010开发的插件,在安装Project之前一直正常工作。但是安装Project后,这个插件就无法使用了。Stuzor的注册表编辑解决方案修复了这个问题。 - ivanatpr
@SimonKravis 请在回答中提供您的解决方案,然后使用绿色勾号将该答案标记为正确答案。这将关闭QA并帮助其他人找到答案。自己回答自己的问题也是可以的。 - HackSlash
显示剩余3条评论
8个回答

40

我曾遇到完全相同的问题,以下是我的解决方法:

前往

HKEY_CLASSES_ROOT\TypeLib\并搜索Office.Interop.Excel

我找到了HKEY_CLASSES_ROOT\TypeLib\(guid)\1.8,但其子节点为空!因为该计算机上未安装Office 15,所以我将其删除,然后咔哒一下——它起作用了。

我们的VSTO项目安装程序或我们自己的自定义安装程序必须已将1.8文件夹放置在那里。

我在这里找到了解决方案:

访问COM组件时出错


1
如果您已删除了Office 2016,想要保留2013版本,并且HKEY_CLASSES_ROOT\TypeLib(guid)\1.9键没有子项,则可以删除1.9文件夹。 - Alejandro Lopez-Lago - MSFT
2
谢谢。这些数字与 Office 的版本有关吗?例如,1.6 = 2007,1.7 = 2010,1.8 = 2013 等等? - Himanshu
1
@hims056,是的,文件夹编号与办公室版本号有关。 - stuzor

8
我曾经遇到了完全相同的问题。如果你安装了新版本的Office,但由于某些原因需要同时安装旧版本而不删除新版本(在我的情况下,我只需要安装Office XP Photo Editor),这可能会导致问题。
经过三个小时的尝试,最好的方法是修复新版本的Office,一切都恢复正常了。
希望这些信息能够帮助你,如果你遇到了相同或类似的情况。

2
使用Office 365(或其他版本),尝试修复选项,它将重新生成密钥。这解决了我的问题。 - Rob
1
我尝试了注册表的解决方案,但它没有起作用。我使用了Office修复工具,现在可以正常工作了。 - Raphael

8

这里还没有提到的一些内容可能也很有用,即1.XX的子键也可能会出现问题。例如: 在计算机\HKEY_CLASSES_ROOT\TypeLib{00020813-0000-0000-C000-000000000046}下,我有一个名为1.9的子键。该子键又有一个名为0(或应该有)。现在,在此之下,有两个子键 - Win32Win64。结果,Visual Studio无法解析Microsoft.Office.Interop.Excel.dll的位置 - 它正在读取其中两个子键,而实际上只能读取一个。 删除Win32子键完全解决了我的问题。 请注意,这是在完全重新安装VS 2017和Office 365 Pro Plus之后完成的。希望这对某人有所帮助。


谢谢,这让我疯狂了一个小时!我想这是因为我有Office 2013,但我们公司最近推出了最新版本的Skype for Business,我认为它是Office 2016的一部分。 - Kris Wragg

6

我会确认@stuzor的答案,因为我遇到了两台机器。

背景:

Windows7 64 bit
Office 2010 (32bit) 
Lync 2013 

在HKEY_CLASSES_ROOT\TypeLib\中搜索"Office.Interop.Excel",找到了几乎不存在的"1.8"文件夹。删除后,一个旧的VB.net应用程序中的功能立即开始工作。


3
如果无法修改或删除注册表记录,这是一个解决方案。我遇到了同样的问题,在我工作的公司中,有大约30台配备Office 2010的机器,我无法删除或打开注册表中的记录。因为客户端机器所在的域不允许我这么做。尽管我拥有管理员权限,但不能删除注册表中的记录。我试图找寻一个解决方案已经一个月了,但一直没有找到。所以我不得不停止使用interop,转而使用OpenXml编辑Excel模板和ClosedXml创建新的Excel。这个方法拯救了我的生命,因为我的老板已经开始催促我了。

在Visual Studio中打开项目/解决方案,并使用"工具">"NuGet包管理器">"程序包管理器控制台"命令打开控制台。 然后安装2个程序包

  1. Install-Package DocumentFormat.OpenXml -Version 2.5.0
  2. Install-Package SpreadsheetLight

附:OpenXml 2.8与SpreadsheetLight不兼容,建议使用2.5.0版本

将此代码添加到文件开头

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using SpreadsheetLight;

在您的按钮或类中复制并修改。
    SaveFileDialog fichero = new SaveFileDialog();
    fichero.Filter = "Excel (*.xlsx)|*.xlsx";
    if (fichero.ShowDialog() == DialogResult.OK)
    {
        SLDocument sl = new SLDocument("c:\\bin\\est1.xlsx", "Sheet1");

        sl.SetCellValue("E9", "Let's party!!!!111!!!1");

        sl.SelectWorksheet("Sheet2");
        sl.SetCellValue("C7", "Before anyone calls the popo!");

        sl.AddWorksheet("ERTRT");
        sl.SetCellValue("B4", "Who let the dogs out?");
        sl.SetCellValue("B5", "Woof!");

        sl.SaveAs(fichero.FileName);    

        MessageBox.Show("Report " + fichero.FileName + "!");
    }

非常不同的解决问题方法,但最终解决了它。 - CLS

1
上述注册表修改对我也解决了同样的问题。唯一的区别是我有一个1.9和一个1.7条目。我删除了1.9键,我的问题就解决了。
其他信息:
操作系统:Windows 10
Visual Studio Professional 2015
C# Windows Form Application
这是在我的工作笔记本电脑上。我们在每个工作站上安装了Office 2010。
我尝试过的其他一些无法解决问题的方法包括:
修复MS OFFICE
重新安装MS OFFICE
从Microsoft下载Microsoft Office 2010:Primary Interop Assemblies。
我的笔记本电脑上还有几个版本的Microsoft.Office.Interop.Excel.dll。删除以前的版本无法解决问题。
很高兴我去了STACKOVERFLOW.COM,因为这个地方太棒了!

0

我们遇到了同样的问题。

我们的设置如下:
Office 2010:Word 和 Excel 但是 Office 2013:Outlook

我们运行了 Office 2010 的安装程序并选择了修复选项。 之后,所有 Word 和 Excel 注册表中的错误键都被删除,问题得到解决。


0

遇到了同样的问题...之前运行正常的代码,在创建新的应用程序实例时开始抛出相同的异常。为了解决这个问题:

  1. 程序和功能,按安装日期排序,可以看到有一些来自代码停止工作的同一天的Microsoft Office 365更新。
  2. 对于Microsoft Office 365 -en-usMicrosoft Office 365 Pro Plus -en-us,右键单击更改并选择快速修复

尝试运行我的解决方案,它又可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接