Windows 7 .net Excel .SaveAs()错误 HRESULT异常:0x800A03EC

13

背景:
我在工作中烧毁了旧硬盘,正在获得新的。因此我必须重建我的机器。我的经理在他的外借笔记本电脑上安装了Windows 7,我一直在使用它,因为我的机器无法正常运转。但我遇到了一个问题。

我们有很多应用程序使用Microsoft.Office.Interop.Excel引用。到目前为止,我已经解决了几个错误,但是我陷入了困境,因为过去几天一直被困在这个问题上(我的机器实际上是在第一次重建后遭受了硬盘故障),并且一直无法找到解决方法。我已经搜索了这个错误,但是没有找到任何人在Windows 7上遇到这个问题,尽管我已经尝试了其他Windows Server 2008的解决方法,但都无济于事。

如果我无法解决这个问题,那么我将无法使用Windows 7,并希望在重新构建机器之前知道这一点(这将是第三次清除和重新开始)。

问题:
操作系统:Windows 7企业版
错误信息:Exception from HRESULT: 0x800A03EC
代码:

Private m_xls As Microsoft.Office.Interop.Excel.Application
Private m_wkbk As Microsoft.Office.Interop.Excel.Workbook
Private m_wksht As Microsoft.Office.Interop.Excel.Worksheet
m_xls = New Application
m_xls.Visible = False : m_xls.DisplayAlerts = False
m_wkbk = m_xls.Workbooks.Open(Me.FilePath)
m_wksht = CType(m_wkbk.ActiveSheet, Worksheet)
'...Write some data...'
m_wkbk.SaveAs(Me.FilePath, XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, False, False, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)

最后一行出现了错误。

我已经尝试过:

  1. 将AppPool更改为使用NetworkService帐户(它是“ApplicationPoolIdentity”,但在安全设置的用户列表中找不到)。然后将NetworkService帐户完全访问适当的文件夹。
  2. 给NetworkService访问DCOMCNFG中所有“Microsoft Excel应用程序”设置的权限
  3. 运行此命令“appcmd set config -section:asp -enableParentPaths:true”,因为这是我能找到的唯一另一个解决方法
  4. 使用.SaveCopyAs(),虽然可以工作,但会导致不同的错误

我只是想知道是否还有其他人遇到过这个问题,因为Windows 7是新的。 我可以考虑使用Server 2008,但在告诉我的经理它不起作用之前,我想要一些充分的理由。

谢谢, Jeff


我建议使用http://download.cnet.com/Filemon/3000-2094_4-10020837.html。FileMon可以告诉你这里出了什么问题。SaveAs似乎是锁定或身份验证问题。如果需要更多信息,请说明。 - Adriaan Stander
这个链接有帮助吗?http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15 - shahkalpesh
@shahkalpesh:谢谢,是的,我之前看过那个,但它并没有解决我的问题。 - Jeff Keslinke
@astander:我尝试了一个旧版的filemon,导致我的机器崩溃,然后尝试了列表中的版本,但它说要使用procmon,由于“驱动程序兼容性问题”而无法工作。因此,我正在使用Process Explorer,但似乎没有异常情况。 如果有什么信息可以帮助,如果您让我知道,我会发布它? 谢谢! - Jeff Keslinke
请参考这个绝妙的解决方案 - Saeed Neamati
显示剩余2条评论
6个回答

18

注意:由于这是我在内部维基上进行的所有修复的编译内容,因此需要进行一些压缩,但我不确定哪些更改集可使其正常工作,因此我将全部包含。

解决方案:

以下更改可能是解决此问题的超集。

-运行DCOMCNFG.exe并导航到“组件服务>计算机>我的电脑”。
-右键单击“我的电脑”并单击“属性”。
-打开“COM安全性”选项卡。为列出的每个按钮(“访问权限”和“启动和激活权限”下的“编辑限制...”和“编辑默认值...”按钮)添加您的帐户。给您的帐户所有访问选项。单击“应用”,然后单击“确定”。
-仍在DCOMCNFG中,展开“我的电脑”链接并打开“DCOM Config”文件夹。
-右键单击“Microsoft Excel 应用程序”并选择“属性”。
-在“安全性”选项卡下,选择“启动和激活权限”和“配置权限”的“自定义”选项。对于两者,单击“编辑...”按钮。将您的帐户授予访问所有内容的权限。
-仍在“Microsoft Excel 应用程序”的“属性”中,转到“身份”选项卡。
-选择“The Interactive User”选项。
-单击“应用”,然后单击“确定”。
-重新启动计算机。

-尝试下面的 DCOMCNFG 和 ApplicationPoolIdentity 更改。

-以管理员身份运行命令提示符。
-导航到c:\Windows\System32\inetsrv>,并运行'appcmd set config -section:asp -enableParentPaths:true'

或者,您可以使用 .SaveCopyAs(),尽管这仍然可能无法解决问题,并需要进行代码更改。

适用于 Windows 7 的 DCOMCNFG:

此错误发生在“Excel app = New Application();”调用上。

这个链接详细介绍了如何解决XP/Server 2003的问题,但可以适用于Windows 7:http://blog.crowe.co.nz/archive/2006/03/02/589.aspx

我没有/找不到“ASPNET”账户。您必须检查应用程序池以查找应用程序的运行方式。
要做到这一点,进入“计算机管理>服务和应用程序>Internet信息服务>应用程序池”
右键单击适当的AppPool,并选择“高级设置”。在“进程模型>身份”下,您可以找到其正在运行的帐户。我的是“ApplicationPoolIdentity”,但我也找不到它,所以像Windows Server 2003一样将其更改为“Network Service”。
设置好后,请运行DCOMCNFG.exe。导航到'组件服务>计算机>我的计算机>DCOM配置”。
找到并右键单击“Microsoft Excel应用程序”,然后选择“属性”。
选择“安全性”选项卡。在“启动和激活权限”下选择“自定义”,然后点击“编辑”。
然后点击“添加...”按钮。
键入适当帐户的名称,在本例中为“Network Service”,然后单击“检查名称”。然后单击“确定”。
回到“启动和激活权限”页面,突出显示“Network Service”帐户,并选中“本地启动”和“本地激活”复选框。然后点击“确定”。


有人知道这是Win 7的一些怪癖,还是Jeff只有一些非常特定的条件导致了这种情况?我也在努力解决一个saveAs错误。 - pc1oad1etter
截至今天,这仍然是我所知道的唯一处理此问题的方法,而我的团队中使用 Server 2008(也是 Windows 6.1)的其他成员也在使用此方法来处理它。不过,如果有更好的方法,我很乐意听取建议。 - Jeff Keslinke
8
对于Windows 7的64位系统,请使用以下命令以32位模式启动DCOMCNFG: DCOMCNFG -32。否则,您将无法在列表中看到Microsoft Excel应用程序。 - Gordon Bell
在Win7-64上对我有用。我只使用了解决方案部分。+1 - Murta
我不得不使用以上解决方案才能让ABCPDF将Excel文档转换为PDF格式在Windows Server 2012 R2上运行。但我在Windows Server 2012上则不需要这样做。 - BrandonG

4
当我遇到这个错误时,我认为我开始使用.SaveCopyAs而不是SaveAs。如果您能详细说明其他错误,也许可以为那种情况找出解决方法。
另外,您正在做的一件事很可能会导致excel.exe在处理文件后仍然留在内存中。这里有一篇文章展示了使用和释放COM互操作对象的正确方法(http://support.microsoft.com/kb/317109)。虽然很麻烦,但对我来说在应用程序关闭之前释放这些资源起作用了。

我还应该指出,我在Vista上也遇到了这个问题,似乎与拥有更新版本的Office有关,而不是Windows的版本(我也可以在XP机器上重新创建,但不能在某些具有旧版本Interop程序集的机器上)。 - Rick Mogstad
Rick,我的.SaveCopyAs问题是可以修复的,因为我可以修改代码。但问题在于这不是我们唯一使用它的地方,所以我必须不断更改代码,如果这是唯一的解决方案,那么我可能不会追求它。我们知道excel.exe的释放,并尝试释放它(尽管偶尔我会进入服务器并将其关闭)。所以我同意,虽然这不是最好的方法,但现在更改它对我们来说将是一个重大的任务,这将取决于我的经理是否有足够的资源。 - Jeff Keslinke
当然,我只是想提一下,因为我自己遇到了这个问题,不得不费力地弄清楚发生了什么。我试了几个小时来让SaveAs()函数正常工作,但从未找到任何不会出错的参数组合。如果你不能使用SaveCopyAs(),我不确定最好的方法是什么。祝你好运! - Rick Mogstad

0

请确保以管理员身份运行程序(和EXCEL.EXE),并且您要保存到的目录没有“只读”属性。

此外,尝试传递完整的文件路径而不仅仅是文件名。

您还可以尝试传递System.Reflection.Missing.Value而不是省略可选参数。

目前想不到其他方法了。希望这有所帮助。

ShdNx


我的账户是机器上的管理员,当我运行VS时它会以管理员身份运行。我检查了excel.exe进程,它正在以NetworkService身份运行,而我已经给予该目录访问权限。此外,Me.FilePath是整个目录。我尝试了Missing.Value,但仍然出现了相同的错误,所以虽然这些都是好主意,但我仍然卡住了。谢谢! - Jeff Keslinke

0
上面Jeff Keslinke的答案最终对我有用。您还需要查看应用程序池正在使用的应用程序池,并确保标识正确并具有完全访问权限和特权。

0

我遇到了同样的问题,并在Windows事件中发现应用程序崩溃错误,异常代码为0xc0000005。搜索网络并在链接Excel 2010 Crash, Exception code: 0xc0000005找到以下解决方案:将打开文件的文件扩展名从xlsx改为zip。这个解决方案对我的情况有效。


0

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