2009-07-10 135 views
10

我的一位用户在尝试通过我的C#应用​​程序打开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, 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); 

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

它看起来像工作簿不能打开。该文件被证实存在,并且在C:用户的个人电脑上很宽松。我想通过使用PIA,我不必担心Excel版本问题。我知道还有其他用户使用Excel 2000,它可以在我的开发机器上运行。

任何想法?也许我的电话打开Excel文件应该改变?不幸的是我无法复制它。

+0

室内用请这方面的帮助,如果ü可以http://stackoverflow.com/questions/9962157/safely-disposing-of-an-object-using-c-sharp/ – 2012-04-01 22:39:10

回答

14

“我想通过使用PIA我不会 担心Excel版本 的问题。我知道有使用Excel 2000的其他用户 ,和它的作品我 dev的机器。”

差不多,但不完全。

通过针对PIA for Excel 2002进行开发,您的程序将与所有版本的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中所述。

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

但是,制作强名称的interop程序集确实有一些复杂性需要考虑。欲了解更多详情,请阅读Using TLBIMP.exe to create Strong Named Interop Assemblies。 (其中,本文解释了/ sysarray开关的必要性。)

简而言之,如果您的程序集不是强命名的,那么制作自定义互操作程序集非常简单。如果你的程序集是强命名的,并且因此你需要创建一个强名称的互操作程序集,这会更加复杂。但希望这些文章应该让你去。

迈克 -

+0

没问题Jaspion。 ..顺便说一句,如果你使用.NET 4.0,你不需要再创建Interop程序集。 :-)所以对这个解决方案的这种需求仅适用于.NET 3.5及更低版本。 – 2011-06-04 00:11:33

2

我使用Microsoft.Office.Interop.Excel.dll: 运行时版本:V1.1.4322 版本:12.0.0.0

能试试这个:

private object mMissingValue = System.Reflection.Missing.Value; 

    private void CreateWorkbook(string fileName) 
    { 
    if (File.Exists(fileName)) 
    { 
     // Create the new excel application reference 
     mExcelApplication = new Application(); 
     // Open the file 
     Workbook excel_workbook = mExcelApplication.Workbooks.Open(templatePath, 
       mMissingValue, mMissingValue, mMissingValue, mMissingValue, mMissingValue, 
       mMissingValue, mMissingValue, mMissingValue, mMissingValue, mMissingValue, 
       mMissingValue, mMissingValue, mMissingValue, mMissingValue); 
     Worksheet sheet = (Worksheet)mExcelWorkbook.Worksheets[1]; 
    } 
} 
0

我来喜欢将Excel文件保存为XML电子表格,然后使用System.Xml对象打开它们。 XML我为各种事情使用了很多,而Interop对我来说是一种黑色艺术。它可能不足以满足您的需求,但如果是这样,它可能比纠结Interop库更容易。