如何在Windows 2008上做excel互操作?

最近部署我的Web应用程序在Windows Server2008,IIS7(与Office安装)。

在追赶(捉住)各种其他错误之后,我正面临一个我不确定从哪里开始。

在卡西尼(视觉工作室开发服务器)一切工作完美(通过Excel互操作阅读优秀)。

在w2008 IIS上抛出模糊的错误:

值不能为空。 参数名称:o

[ArgumentNullException:值不能为空。 参数名:o] System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object o)+9430474 longnamespace.ExcelReader.Dispose()in c:\ longpath \ ExcelReader.cs:23 longnamespace.ApplicationFormReader.Read(String path)in c: \ longpath \ ApplicationFormReader.cs:32

目前,我将添加空检查,看看事情是否有所好转,但我怀疑它只是在finally阻止它开始读取任何东西之前就被炸毁。

试图设置应用程序池在本地系统下运行,但没有任何改变。

有任何想法吗?


这是如何configuration方法的样子

  //http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419#159419 public void Dispose(){ GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.FinalReleaseComObject(_ws); //Worksheet, line 23 _wb.Close(); Marshal.FinalReleaseComObject(_wb); //Workbook _ap.Quit(); Marshal.FinalReleaseComObject(_ap); //Application } 

我相信这个事件是相关的

机器默认权限设置不授予CLSID {00024500-0000-0000-C000-000000000046}的COM服务器应用程序的本地激活权限给用户NT AUTHORITY \ NETWORK SERVICE SID(S-1-5-20)从地址LocalHost(使用LRPC)。 可以使用组件服务pipe理工具修改此安全权限。

如果是的话 – 谁能翻译?

Microsoft Excel Application权利添加到组件服务中的Network service以某种方式不起作用。 好的。

删除身份validation级别也没有帮助。


变成

  if (_ws != null) Marshal.FinalReleaseComObject(_ws); if (_wb != null) { _wb.Close(); Marshal.FinalReleaseComObject(_wb); } if (_ap != null) { _ap.Quit(); Marshal.FinalReleaseComObject(_ap); } 

让我们看看它是怎么回事…

exception看起来相当简单:在代码的第23行,你调用Marshal.FinalReleaseComObject,传递一个空引用。

所以_ws,_wb或_ap是空引用。 你将能够看到,如果你看第23行。

为了解决这个问题,在调用FinalReleaseComObject之前testingnull。

您的活动中引用的GUID {00024500-0000-0000-C000-000000000046}是Excel – 您可以使用RegEdit查看。

所以我怀疑发生的是,你没有发布的代码尝试实例化一个Excel应用程序对象(_ap?)由于权限不足而引发exception。 然后,因为你的Dispose方法没有检查_ap为null,所以它再次抛出。

当您要为networking服务帐户授予“本地激活”权限时,我怀疑您正处于正确的轨道上。 不知道为什么这不起作用,也许你需要重新启动或重新启动IIS?

更新 Excel Interop不build议在服务器应用程序中使用。 用其他方式操作Excel文档比较好,例如使用Aspose等第三方组件。

我似乎记得的一件事是,Excel需要在具有本地configuration文件的帐户下运行,而networking服务帐户可能不是这种情况。 因此,如果您需要使用Excel Interop,则在注释中提到的其他帐户下运行它可能是最佳解决scheme。