我在C#.net中开发了一个控制台应用程序,它创建了一个新的excel&在其中执行一些操作[Interop]。
我在项目中添加了Interop.Microsoft.Office.Interop.Excel.dll作为参考
该代码在XP&在Vista中也是如此。但是,如果我将我的exe保存在其中一个文件夹中,那么它会给我一个感觉
检索具有CLSID {00024500-0000-0000-C0的组件的COM类工厂 00-000000000046}由于以下错误而失败:80090006。
未处理的异常:System.Exception:执行期间未处理的异常---> System.NullReferenceException:未将对象引用设置为对象的实例。
任何人都知道这是否可行,因为可能已在任何文件夹上设置了更严格的政策。我问这个是因为,如果我将这个exe文件复制到另一个文件夹,exe就可以完美运行。
抛出execption的代码片段是
/* Create spreadsheet update data */
InteropExcel.Workbook oWorkbook = null;
InteropExcel.Worksheet oWorkSheet = null;
InteropExcel.ApplicationClass appExcel = null;
try
{
// Probable at this line
appExcel = new InteropExcel.ApplicationClass();
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
oWorkSheet = (InteropExcel.Worksheet)oWorkbook.ActiveSheet;
// ...
即使我在try-catch块中编写了这段代码,我也无法处理它。
有人可以建议任何解决方案吗?
谢谢,
阿米特
答案 0 :(得分:0)
很难确定导致这种情况的原因。所以,首先是几个问题,您可以通过编辑上面的原始问题来回复或澄清。
(1)当您说您引用了“Interop.Microsoft.Office.Interop.Excel.dll”时,我认为您的意思是Microsoft.Office.Interop.Excel.dll
?
此外,如果您检查此参考的属性是否表明它的位置在GAC中?您可以通过进入解决方案资源管理器,展开项目,展开引用,右键单击Microsoft.Office.Interop.Excel
引用,然后检查Path
属性来检查这一点。如果它在GAC中,则Path
属性应以“C:\ Windows \ Assembly \ GAC ...”开头。
(2)似乎你有一个在某处定义InteropExcel
的using语句?像这样:
using InteropExcel = Microsoft.Office.Interop.Excel;
这是正确的,还是InteropExcel
是一个单独的参考?
(3)当你说你正在移动你的exe时,你是仅移动exe,还是移动exe和相关文件的整个文件夹? .NET程序集不是自包含的,它需要引用,配置文件和/或其他文件与exe在同一文件夹中,或者有时在包含exe的同一文件夹的子文件夹中。确保将所有内容组合在一起。
(4)您应该在Visual Studio IDE中托管的调试模式下运行代码,这样您就可以准确地知道哪一行引发了异常。我的猜测是你的第一行正在返回null
:
appExcel = new InteropExcel.ApplicationClass();
然后我认为您的下一行是抛出NullReferenceException
,因为您的'appExcel'引用为空:
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
(嗯......实际上,我对此的想法越多,这就越有意义。未经测试,但我不希望拨打appExcel = new InteropExcel.ApplicationClass()
会悄悄地返回null
。我会期望它正确返回一个应用程序对象或抛出异常,但不能通过返回null
而悄然失败。但也许。如果没有,那么我认为您的异常可能发生在某些代码之外您显示的代码的em>。所以您确实需要在Visual Studio IDE中运行它,以便您可以知道哪条线路出现故障。)
(5)此外,您对Workbooks.Add
方法的调用不正确。 Template
参数用于确定哪个工作簿(如果有)将作为新工作簿的模板。通常,传入的参数应为Type.Missing
以省略此参数;这将允许基于默认的空白工作簿创建新工作簿。如果您确实传入了一个参数,它可以是一个字符串,其中包含您希望充当新工作簿模板的工作簿的完整路径,或者Excel.XlWBATemplate
常量,例如Excel.XlWBATemplate.xlWBATChart
或{ {1}}确定要创建的工作簿的类型。同样,通常,传入Excel.XlWBATemplate.xlWBATWorksheet
时应省略此参数。 (有关详细信息,请参阅Workbooks.Add Method上的帮助。)
因此,我建议你改变你的行:
Type.Missing
到
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
(6)一般来说,你应该使用oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(Type.Missing);
而不是Application
。我知道这看起来很奇怪,因为ApplicationClass
是一个接口,创建一个Excel.Application
接口似乎很矛盾,但这就是自动化MS Office程序时应该怎么做。 (有关详情,请参阅Don't use ApplicationClass (unless you have to)和Excel interop: _Worksheet or Worksheet?。)
因此,你的行:
new
应改为:
InteropExcel.ApplicationClass appExcel = null;
appExcel = new InteropExcel.ApplicationClass();
我不知道哪些问题导致了您的问题,可能其中一些问题在这里发挥作用,但所有问题都应该进行检查和/或纠正。希望其中一个可以纠正你的问题。
如果这些都没有解决,你应该回复一些我已经突出显示的所有这些项目的更多信息,和/或包括你可能已经想到的其他任何事情。
我的手指交叉了你......
麦克
答案 1 :(得分:0)
SpreadsheetGear for .NET从.NET应用程序(包括控制台应用程序)更容易使用和部署,并且通过COM Interop比Excel快得多。
您可以下载免费试用here。
免责声明:我拥有SpreadsheetGear LLC