C#和Excel互操作

Fla*_*ack 10 c# excel interop

我的一个用户在尝试通过我的C#应用​​程序打开Excel文件时遇到问题.

当我从我的机器运行它时,一切正常,它适用于其他用户.我不是Excel互操作专家所以希望你们可以帮助我.

以下是它的设置方式:

我将我的应用程序的引用添加到Microsoft.Office.Interop.Excel.dll,版本10.0.4504.0(我相信是Excel 2002).在我的机器上,我安装了Excel 2007.在我的代码中,我尝试打开这样的工作表:

using Microsoft.Office.Interop
...
Microsoft.Office.Interop.Excel.ApplicationClass _excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook excelWorkbook = _excelApp.Workbooks.Open(workbookPath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", false, false, 0, true, false, false);
Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets;
Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(1);
Run Code Online (Sandbox Code Playgroud)

我将用户版本记录为Excel 9.0(即2000).用户获得的错误是:

Exception='System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   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)
Run Code Online (Sandbox Code Playgroud)

看起来无法打开工作簿.该文件已确认存在,并且在C:用户的PC上松散.我认为使用PIA我不必担心Excel版本问题.我知道有其他用户使用Excel 2000,它可以在我的开发机器上运行.

有任何想法吗?也许我应该更改打开Excel文件的电话?不幸的是,我无法重现它.

Mik*_*lum 14

"我想通过使用PIA我不必担心Excel版本问题.我知道还有其他用户使用Excel 2000,它可以在我的开发机器上运行."

几乎是真的,但并不完全.

通过针对Excel 2002的PIA进行开发,您的程序将兼容所有版本的Excel 2002(10.0)及更高版本.但是,失败的计算机正在运行Excel 2000(9.0),这是一个低于您开发的版本的版本.

Excel 2002下面没有官方支持的PIA,因此如果您需要在Excel 2000(9.0)上运行程序,则必须创建自己的自定义互操作程序集.您可以使用TlbImp.exe为Excel 9.0创建互操作程序集,如文章" 实现与.NET Interop的向后兼容性:Excel作为案例研究"中所述.

如果您的程序集具有强名称,那么您需要创建一个强名称的互操作程序集.这可以通过/ keyfile开关提供.pfx或.snk文件的名称来完成,如文章如何创建主互操作程序集(PIA)中所示.该文章还利用/ primary开关来创建"主互操作程序集".在您的情况下,实际上不需要使用互操作程序集,但不会受到伤害.但是,文章省略的是使用/ sysarray开关,您应该使用它.

然而,制作一个强名称的互操作程序集确实需要考虑一些复杂性.有关更多详细信息,请阅读使用TLBIMP.exe创建强命名互操作程序集.(除此之外,本文还解释了/ sysarray开关的必要性.)

简而言之,如果您的程序集名称不强,那么制作自定义互操作程序集非常简单.如果您的程序集具有强名称,则更复杂,因此,您需要创建一个强名称的互操作程序集.但希望这些文章可以让你前进.

- 迈克