C#中使用Interop打开Excel文件时出现异常。

10

我有一个正在服务器上运行的程序,每天从一个网站下载一个 .xls 文件,然后将其转换为 .csv 文件以正确解析并添加到数据库中。

当我在本地 PC 上运行时,一切都很正常,在服务器上大部分时间也可以正常工作,但可能每周会出现一两次以下异常:

异常情况如下: System.Runtime.InteropServices.COMException (0x800A03EC): Exception from HRESULT: 0x800A03EC at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)

以下是代码片段:

 Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook wbWorkbook = app.Workbooks.Open(_dir + _fileNameTrim + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            wbWorkbook.SaveAs(_dir + _fileNameTrim + ".csv", Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            wbWorkbook.Close(false, "", true);

我在网上看到了很多东西,很多解决方案都提到安全设置,但我认为这不是我的情况,否则它根本就不会工作。人们还提到文件可能损坏。我真的不确定。非常感谢任何帮助。

更新:

服务器上安装了Excel,并且在尝试打开文件时出现异常。


你的服务器上安装了Excel吗? - David Esteves
你在哪一行代码出现了这个问题?(如果是在保存时,你是否看到了这个链接:https://dev59.com/CG855IYBdhLWcg3wViot ??) - Orkun
1
顺便提一下,您应该避免在服务器上使用Excel实例。考虑改用OpenXML,它对于纯文件操作更快,并且不会导致泄漏或挂起的情况。 - Mathias
2
微软目前不建议,也不支持从任何无人值守、非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在此环境下运行Office可能会表现出不稳定的行为和/或死锁。请参考http://support.microsoft.com/kb/257757。 - granaker
这听起来和我遇到的问题很相似,当我打开文件时,如果Excel已经在运行并且处于活动状态(无论是Excel等待您完成操作,例如按保存键,还是正在编辑单元格),有时会出现0x800A03EC错误。 - user1802863
继续@Mathias的建议...如果您需要更复杂的电子表格工作,像"SpreadsheetGear"这样的产品也是一个选择。 - PandaWood
4个回答

12

运行 dcomcnfg

这将打开组件服务并导航到控制台根目录 \ 组件服务\计算机\我的计算机\DCOM配置\Microsoft Excel 应用程序 右键单击 Microsoft Excel 应用程序并选择属性

点击标识选项卡并检查选择。

对于我来说,当选择“交互式用户”选项时它有效。

请尝试,祝好运!


他们应该在 StackOverflow 上放置一个心形图标! - Cătălin Rădoi

5

.Workbooks.Open(strPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlCorruptLoad.xlExtractData);

这段代码是用于打开一个Excel文档的。其中,strPath代表文件路径。xlExtractData是一个参数,它表示在Excel文件受损时是否尝试恢复数据。

也许您的工作表存在问题(自动筛选器、隐藏名称等)。使用Microsoft.Office.Interop.Excel.XlCorruptLoad.xlExtractData,您可以忽略此缺陷原因(仅读取)。 - hulzi
@Harry,也许你可以参考https://dev59.com/mErSa4cB1Zd3GeqPUTWx。 - user1108069
@Harry,实际上我的意思是,你可以参考那个问题的第一个答案,它解释了错误和Open方法中的参数,这将解决你的问题。 :) - user1108069
@user1108069 你错了,伙计。我在这里从来没有提出过问题。我的评论是来自审核队列的。 - Harry
@Harry,嗯...我有点困惑,什么是审核队列?-_- - user1108069

2
我有相同的问题。具体与new Microsoft.Office.Interop.Excel.Application();相关,我的做法是在我知道没有任何权限问题的临时位置创建文件。一旦我完成文档创建,我就将其移动到最终目标位置,并删除在我的临时位置创建的文件。
到目前为止,我还没有遇到任何问题。
我建议您创建一个日志文件并按日期保存,以记录它在代码中完成的步骤。这样您就可以看到它失败的位置。
如果可能的话,对于仅需要Excel的应用程序,请执行Process.Kill()。这有助于关闭未正常关闭的Excel.exe进程。
最后,正如上面的评论所述,服务器上的Excel自动化不受支持。我建议使用SSIS自动化Excel。
更新:
确保测试应用程序在没有用户登录时是否运行。您可能需要将Microsoft Excel的DCOM身份设置为以特定用户帐户而不是交互式用户身份运行。
转到:
控制面板\所有控制面板项\管理工具
单击
组件服务并导航到Console Root\Component Services\Computers\My Computer\DCOM Config\Microsoft Excel Application
右键单击Microsoft Excel Application并选择属性
在安全选项卡下,全部设置为“自定义”,并给“每个人”(用于测试)访问权限
在标识选项卡下,设置为此用户,并选择适当的帐户(与任务计划程序用于运行应用程序的帐户相同)
祝你好运!

0
你有检查过是否是权限问题吗?可能是因为你试图将文件保存到某个位置,而.NET没有写入该位置的权限。

我怀疑这不是权限问题,因为大部分时间它都能正常工作。 - Toz
他说这个问题发生在打开Excel文件时。我猜他的意思是他是通过代码创建对象或使用.Open()方法来打开文件的。偶尔出现这种情况可能意味着应用程序本身是正常的,所以任何变化都必须与服务器有关。更改DCOM标识可能是一个不错的起点... - Remy

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