加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#和Excel互操作

发布时间:2020-12-15 06:44:24 所属栏目:百科 来源:网络整理
导读:我的一个用户在尝试通过C#应用程序打开Excel文件时遇到问题. 当我从我的机器上运行时,一切都可以正常工作,适用于其他用户.我不是Excel interop专家,希望你们可以帮助我. 这是如何设置的: 我添加了一个对我的应用程序的引用到Microsoft.Office.Interop.Excel
我的一个用户在尝试通过C#应用程序打开Excel文件时遇到问题.

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

这是如何设置的:

我添加了一个对我的应用程序的引用到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,true,5,"",Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,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);

我将用户版本记录为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)

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

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

解决方法

“I thought by using the PIA I wouldn’t
have to worry about Excel version
issues. I know there are other users
using Excel 2000,and it works on my
dev machine.”

几乎是真的,但不完全.

通过针对Excel 2002的PIA开发,您的程序将兼容所有版本的Excel 2002(10.0)及更高版本.然而,失败的机器正在运行Excel 2000(9.0),它是您开发的版本低于其版本的版本.

在Excel 2002下没有官方支持的PIA,所以如果你需要你的程序在Excel 2000(9.0)上运行,那么你将必须创建自己的定制互操作程序集.您可以使用TlbImp.exe为Excel 9.0创建一个互操作程序集,如第Achieving Backward Compatibility with .NET Interop: Excel as Case Study条所述.

如果您的程序集是强名,那么您需要创建一个强名的互操作程序集.这可以通过/ keyfile开关提供.pfx或.snk文件的名称来实现,如文章How to create a Primary Interop Assembly (PIA)所示.该文章还使用/ primary开关来创建“主互操作程序集” .在您的情况下,使互操作组合不是真正需要的,但不会受到伤害.然而,文章省略的是使用/ sysarray开关,您应该使用它.

然而,制作强大的互操作程序集确实有一些复杂性.有关更多详细信息,请阅读Using TLBIMP.exe to create Strong Named Interop Assemblies.(除此之外,本文还介绍了/ sysarray开关的需要.)

简而言之,如果你的程序集不是很强名,那么做一个自定义的互操作程序集是非常简单的.如果您的程序集强大命名,那么更复杂,因此,您需要创建一个强名的互操作程序集.但希望这些文章应该让你走.

– 麦克

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读