使用 C# 代码打开 Excel 工作簿时出错

Posted

技术标签:

【中文标题】使用 C# 代码打开 Excel 工作簿时出错【英文标题】:Error while opening an excel workbook using C# code 【发布时间】:2009-11-09 09:21:11 【问题描述】:

我正在尝试打开一个 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。

【问题讨论】:

它是什么类型的应用程序?控制台应用程序? asp.net/winforms? 【参考方案1】:

(很抱歉回答这个老问题,但这个问题的谷歌结果#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

【讨论】:

【参考方案2】:

如果您尝试使用 System.Reflection.Missing.Value 而不是 Type.Missing 会怎样?

问候,

M.

【讨论】:

【参考方案3】:

你用的是哪个类?

Microsoft.Office.Interop.Excel.ApplicationClass

如果是这样,请尝试将其更改为

Microsoft.Office.Interop.Excel.Application

【讨论】:

【参考方案4】:

如果它对其他人有帮助,我在这个上浪费了很多时间。我为所有文件的 CorruptedLoad 参数传递了Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile,认为这意味着“打开文件,如果它已损坏,请尝试修复”。这适用于大多数文件。

但是,对于某些文件,我仍然收到异常(HRESULT 异常:0x800A03EC)。但是,如果您在 Excel 中手动打开该文件,它并没有损坏。

事实证明,对于这些文件,您不得提供 CorruptedLoad 参数。然后就成功打开了。所以最后我调整了我的代码,首先尝试不使用任何 CorruptedLoad 参数,并且只有当它返回异常时,然后尝试为该参数传递 xlRepairFile 。我还将对该参数的理解调整为“打开并修复此文件,无论它是否损坏”。

【讨论】:

以上是关于使用 C# 代码打开 Excel 工作簿时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试打开Excel工作簿时,尝试/ Catch不会激活

打开 openpyxl 保存的工作簿时 Excel 有不可读的内容

为啥打开新工作簿时宏停止运行?

首次运行时Excel VBA授权失败,第二次运行正常运行

当其他Excel实例具有焦点时,无法获取活动工作表或选定范围

VBA 一些概念与细节