我正在尝试打开excel工作簿并尝试在其中获取工作表。 Excelapp.workbooks.Open行正在抛出异常
来自HRESULT的System.Runtime.InteropServices.COMException:Microsoft.Office.Interop.Excel.Workbooks.Open中的0x800A03EC
这是我的代码:
Excel.Application excelApp = new Excel.ApplicationClass();
Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(strWBPath, 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, true);
StrWbPath是我的Excel位置。我正在引用2007 excel并添加了版本12.0.0.0的Microsoft.office.interop.excel。
答案 0 :(得分:6)
(很抱歉回答这个旧问题,但是这个问题的谷歌结果#1并且缺少正确的答案)。
发生错误是因为excel认为工作簿已损坏。打开Excel文件时,最后一个参数告诉excel如何处理这种情况。通过Microsoft.Office.Interop.Excel.XlCorruptLoad.xlExtractData
指示它检索数据(这将打开一个弹出窗口,告诉用户excel尝试在文件损坏时提取数据)。
但是,我注意到如果您尝试打开的工作簿具有与excel不同的区域设置(使用其他语言设置保存在计算机上)或者您的系统没有设置en-us区域设置,也会导致此问题
虽然这是非常愚蠢的,但它很容易克服。对我来说,解决方案是在打开文件之前将当前语言环境设置为en-us:
static System.Globalization.CultureInfo oldCI;
oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
xlWorkBook = xlApp.Workbooks.Open(filePath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, Microsoft.Office.Interop.Excel.XlCorruptLoad.xlExtractData);
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
信用额转到this page
答案 1 :(得分:0)
如果您尝试使用System.Reflection.Missing.Value而不是Type.Missing怎么办?
此致
微米。
答案 2 :(得分:0)
你在使用哪个班级?
Microsoft.Office.Interop.Excel.ApplicationClass
如果然后尝试将其更改为
Microsoft.Office.Interop.Excel.Application
答案 3 :(得分:0)
万一它对别人有帮助,我就浪费了很多时间。我为所有文件的CorruptedLoad参数传递了Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile
,以为它的意思是“打开文件,如果文件损坏,则尝试修复”。这适用于大多数文件。
但是,对于某些文件,我仍然遇到异常(HRESULT异常:0x800A03EC)。但是,如果您在Excel中手动打开文件,则该文件不会损坏。
事实证明,对于这些文件,您不必提供CorruptedLoad参数。然后,它成功打开。因此,最后我调整了代码,使其首先尝试不使用任何CorruptedLoad参数,并且仅在返回异常的情况下,然后尝试为该参数传递xlRepairFile。我还调整了对该参数的理解,以表示“无论文件是否损坏都可以打开并修复该文件”。