Microsoft.Office.Interop.Excel在64位系统上无法工作。

8

我在使用 MS Visual Web Developer 2008 Express Ed. 开发 ASP.NET C# 项目的时候遇到了问题。我的操作系统是 Windows7 64 位。

我尝试打开一个 Excel 文档,但它提示 Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

我将构建设置为所有处理器(Any CPU, x64, x86),但这没有用。我在互联网上搜索了答案,但无法找到解决方法。

奇怪的是,在同一台电脑上使用 Microsoft Visual C# 2010 Express 进行开发时,相同的代码可以工作!是不是背后使用的是相同的 DLL 文件?

我需要更改 COM DLL 文件才能在 x64 系统上运行吗?

请帮助我,我该怎么做?

我的代码如下:

using Excel = Microsoft.Office.Interop.Excel;
xlApp = new Excel.Application();
__Log("Openning " + excelFileName);
xlWorkBook = xlApp.Workbooks.Open(excelFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(2);

我不完全确定这会不会解决你的问题,但如果你有一个32位的COM DLL,即使你在64位的Windows上运行,你可能需要使用x86版本的项目构建。 - Andrew
我认为你说得对,@Andrew。如果是32位的Excel,64位的.NET就不能与之兼容。将其构建为x86应该可以解决问题。 - Simon Halsey
已经尝试过了,但是结果还是一样,我不明白为什么这个问题在 Visual C# 中没有出现,只在 Web 开发中出现。 - Bush
1个回答

20

在搜索了互联网后,我发现Microsoft Interop与COM对象存在一个错误(至少对于我的情况,即MS Excel 2010)。

这个错误是.NET检查你的线程(C#或VB代码)的本地化是否适合你之前安装的MS Excel本地化,并且如果不适合,它会告诉你Microsoft.Office.Interop库已经过时或无效。

你的线程本地化来源于你的计算机区域设置(从控制面板-> 区域和语言)

然后有两种解决这个问题的方法:

  1. 更改你的线程本地化(通过代码)
  2. 为你的Office安装语言包

第一种解决方案如下:

using System.Threading;     // For setting the Localization of the thread to fit
using System.Globalization; // the of the MS Excel localization, because of the MS bug

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
excelFileName = System.IO.Path.Combine(excelPath, "Ziperty Buy Model for Web 11_11_2011.xlsm");

希望对你有所帮助 :) 愉快的一天


更多信息,请参考相应的 KB 条目:http://support.microsoft.com/default.aspx?scid=kb;en-us;320369 - Otiel
1
@Otiel:KB似乎说这个bug适用于VS 2005和Excel 2007(以及旧版本)。描述似乎匹配,但可能是一个不相关的bug。 - Kevin Coulombe

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