2009-07-10 36 views
10

Một trong những người dùng của tôi gặp sự cố khi cố gắng mở tệp Excel thông qua ứng dụng C# của tôi.C# và Excel interop

Mọi thứ hoạt động tốt khi tôi chạy nó từ máy của mình và nó hoạt động với những người dùng khác. Tôi không phải là chuyên gia interop của Excel nên hy vọng các bạn có thể giúp tôi.

Sau đây là cách nó được thiết lập:

tôi đã thêm một tham chiếu đến ứng dụng của tôi để Microsoft.Office.Interop.Excel.dll, phiên bản 10.0.4504.0 (mà tôi tin là Excel 2002). Trên máy tính của tôi, tôi đã cài đặt Excel 2007. Trong mã của tôi, tôi cố gắng mở một bảng tính như sau:

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); 

tôi đăng nhập phiên bản sử dụng như Excel 9.0 (đó là 2000). Lỗi mà người dùng nhận được là:

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ó vẻ như không thể mở sổ làm việc. Tệp đã được xác nhận tồn tại và chỉ bị mất trên PC của người dùng tại C :. Tôi nghĩ rằng bằng cách sử dụng PIA tôi sẽ không phải lo lắng về vấn đề phiên bản Excel. Tôi biết có những người dùng khác sử dụng Excel 2000 và nó hoạt động trên máy phát triển của tôi.

Bất kỳ ý tưởng nào? Có thể các cuộc gọi của tôi để mở tệp Excel phải được thay đổi? Điều đáng tiếc là tôi không thể tái tạo nó.

+0

xin vui lòng giúp wiht này nếu u có thể http://stackoverflow.com/questions/9962157/safely-disposing-of-an-object-using-c-sharp/ –

Trả lời

14

"Tôi nghĩ bằng cách sử dụng PIA tôi sẽ không phải lo lắng về Excel phiên bản vấn đề này. Tôi biết có những người dùng khác sử dụng Excel 2000, và nó hoạt động trên máy dev của tôi."

Hầu như đúng, nhưng không hoàn toàn.

Bằng cách phát triển chống lại PIA cho Excel 2002, chương trình của bạn sẽ tương thích với tất cả các phiên bản Excel 2002 (10.0) trở lên. Tuy nhiên, máy không chạy được chạy với Excel 2000 (9.0), đây là phiên bản bên dưới phiên bản mà bạn đã phát triển.

Không có PIA được hỗ trợ chính thức bên dưới Excel 2002, vì vậy nếu bạn cần chương trình chạy trên Excel 2000 (9.0) thì bạn sẽ phải tạo lắp ráp interop tùy chỉnh của riêng mình. Bạn có thể sử dụng TlbImp.exe để tạo một hội đồng interop cho Excel 9.0, như được giải thích trong bài viết Achieving Backward Compatibility with .NET Interop: Excel as Case Study.

Nếu lắp ráp của bạn được đặt tên mạnh, thì bạn cần phải tạo một cụm lắp ráp được đặt tên mạnh mẽ. Điều này có thể được thực hiện bằng cách cung cấp tên tệp .pfx hoặc .snk của bạn thông qua khóa chuyển/keyfile, như được minh họa trong bài viết How to create a Primary Interop Assembly (PIA). Bài viết đó cũng đang sử dụng công tắc/chính để tạo ra một "hội đồng interop chính".Làm cho lắp ráp interop chính là không thực sự cần thiết trong trường hợp của bạn, nhưng không làm tổn thương. Tuy nhiên, những gì bài viết bỏ qua là sử dụng khóa chuyển đổi/sysarray mà bạn nên sử dụng.

Làm cho một hội đồng interop được đặt tên mạnh mẽ có một số phức tạp để xem xét, tuy nhiên. Để biết thêm chi tiết, hãy đọc số Using TLBIMP.exe to create Strong Named Interop Assemblies. (Trong số những thứ khác, bài viết này giải thích sự cần thiết của chuyển đổi/sysarray.)

Nói ngắn gọn, việc lắp ráp interop tùy chỉnh rất đơn giản nếu lắp ráp của bạn không được đặt tên mạnh. Nó phức tạp hơn nếu lắp ráp của bạn có tên mạnh và do đó, bạn cần phải tạo ra một hội đồng interop được đặt tên mạnh mẽ. Nhưng hy vọng những bài viết này sẽ giúp bạn đi.

- Mike

+0

Không có vấn đề Jaspion. .. btw, nếu bạn đang sử dụng .NET 4.0 bạn không cần phải tạo ra các hội đồng Interop nữa. :-) Vì vậy, điều này cần cho giải pháp này chỉ dành cho .NET 3.5 trở xuống. –

2

Tôi đang sử dụng Microsoft.Office.Interop.Excel.dll: Runtime phiên bản: v1.1.4322 Version: 12.0.0.0

thể thử điều này:

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

tôi đã đến để thích lưu các tệp Excel dưới dạng bảng tính XML và sau đó mở chúng với các đối tượng System.Xml. XML Tôi sử dụng rất nhiều thứ cho tất cả mọi thứ, trong khi Interop là một thứ nghệ thuật đen với tôi. Nó có thể không đủ tốt cho nhu cầu của bạn, nhưng nếu có, nó có thể dễ dàng hơn rất nhiều so với các thư viện Interop.

Các vấn đề liên quan