使用Interop在C#中打开Excel文件时出现exception
我有一个运行在服务器上的程序,每天从网站上下载一个.xls文件,然后打开它,然后将其转换为.csv,以便能够正确parsing并添加到数据库。
当我在本地PC上运行它时,一切正常,并且它在服务器上的大部分时间都可以正常工作,但是一周一次或两次,我得到以下exception:
发生exception:System.Runtime.InteropServices.COMException(0x800A03EC):从HRESULT:0x800A03EC在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);
我已经在网上阅读了很多东西,很多解决scheme都提到了安全设置,但是我不认为这是我的情况,否则它根本无法工作。 人们也提到了这个文件正在被腐化。 我真的不确定。 任何帮助将非常感激。
更新:
Excel安装在服务器上,当试图打开文件时发生exception。
运行> dcomcnfg
这将打开组件服务并导航到控制台根\组件服务\计算机\我的电脑\ DCOMconfiguration\ Microsoft Excel应用程序右键单击Microsoft Excel应用程序并select属性
点击标识标签并检查select。
它适用于我select选项 – 交互式用户
请尝试,最好的运气!
工作簿打开(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 );
我也有同样的问题。 它特别涉及到new Microsoft.Office.Interop.Excel.Application();
我一直在做的是在一个临时的位置创build文件,我知道我没有任何权限问题。 一旦我完成创build文档,然后将其移动到最终目的地,删除在我的临时位置创build的文件。
到目前为止,我没有任何问题。
我build议你创build一个日志文件,并按date保存它,以便logging在代码中完成的步骤。 这样你可以看到失败的地方。
如果可能的话,在excel上执行Process.Kill()
,如果这是唯一需要excel的应用程序。 这有助于如果Excel.exe没有正确closures。
最后,如上述注释所述,服务器上的Excel自动化不受支持。 我会build议寻find自动化的Excel的SSIS。
更新:
确保您testing应用程序是否运行,即使没有用户login。 您可能需要将Microsoft Excel的DCOM标识设置为以特定用户帐户而不是交互式用户身份运行。
去:
控制面板\所有控制面板项目\pipe理工具
点击
组件服务并导航到控制台根目录\组件服务\计算机\我的电脑\ DCOMconfiguration\ Microsoft Excel应用程序
右键单击Microsoft Excel应用程序并select属性
在“安全性”选项卡下,设置为“全部自定义” ,并授予“ 所有人”权限(用于testing)
在“标识”选项卡下,设置“ 此用户”并select相应的帐户(与“任务计划程序”用于运行应用程序的帐户相同)
祝你好运!
你有没有检查是否是一个权限问题? 您可能试图将该文件保存到某个位置,而.NET没有写入该位置的权限。