2009-07-10 11 views
10

Jeden z moich użytkowników ma problem podczas próby otwarcia pliku Excel za pośrednictwem mojej aplikacji C#.Współdziałanie C# i Excela

Wszystko działa poprawnie, gdy uruchomię go z mojego komputera i działa ono dla innych użytkowników. Nie jestem ekspertem od Excela, więc mam nadzieję, że możecie mi pomóc.

Oto jak go skonfigurować:

I dodaje odniesienie do mojego app do Microsoft.Office.Interop.Excel.dll, wersja 10.0.4504.0 (co moim zdaniem jest Excel 2002). Na moim komputerze mam zainstalowany program Excel 2007. W moim kodu próbuję otworzyć arkusz tak:

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

Zalogowałem wersję użytkowników, jak Excel 9.0 (która jest 2000). Błąd, który otrzymuje użytkownik:

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) 

Wygląda na to, że skoroszytu nie można otworzyć. Plik został potwierdzony i był luźny na komputerze użytkownika w C :. Pomyślałem, że używając PIA nie musiałbym się martwić o problemy z wersją Excela. Wiem, że inni użytkownicy korzystają z programu Excel 2000 i działają na moim komputerze programistycznym.

Wszelkie pomysły? Może moje wezwania do otwarcia pliku Excel powinny zostać zmienione? Niefortunną rzeczą jest to, że nie mogę tego odtworzyć.

+0

pomóż prawdziwość tego, jeśli u może http://stackoverflow.com/questions/9962157/safely-disposing-of-an-object-using-c-sharp/ –

Odpowiedz

14

„Myślałem, za pomocą PIA nie musiałby się martwić o programie Excel w wersji kwestii. Wiem, że są inni użytkownicy pomocą programu Excel 2000, a to działa na moim komputerze dev ”.

Prawie prawda, ale nie do końca.

Opracowując program PIA dla programu Excel 2002, program będzie zgodny z wszystkimi wersjami programu Excel 2002 (10.0) i nowszymi wersjami. Jednak wadliwa maszyna działa z programem Excel 2000 (9.0), który jest wersją poniżej wersji, której wersję opracowałeś.

Nie ma oficjalnie obsługiwanej PIA poniżej programu Excel 2002, więc jeśli potrzebujesz programu do uruchomienia programu Excel 2000 (9.0), musisz utworzyć własny niestandardowy zestaw współdziałania. Można użyć narzędzia TlbImp.exe, aby utworzyć złożenie współdziałania dla programu Excel 9.0, jak wyjaśniono w artykule Achieving Backward Compatibility with .NET Interop: Excel as Case Study.

Jeśli twój zespół ma silną nazwę, musisz utworzyć silnie nazwany układ współdziałania. Można to zrobić, podając nazwę pliku .pfx lub .snk za pomocą przełącznika/keyfile, jak pokazano w artykule How to create a Primary Interop Assembly (PIA). Ten artykuł korzysta również z przełącznika/primary w celu utworzenia "podstawowego zestawu współdziałania".Sprawienie, że podstawowy zestaw współdziałania nie jest naprawdę potrzebny w twoim przypadku, ale nie boli. W artykule pominięto jednak użycie przełącznika/sysarray, którego należy użyć.

Wykonanie zestawu o ściśle określonych nazwach ma jednak pewne komplikacje do rozważenia. Aby uzyskać więcej informacji, przeczytaj artykuł Using TLBIMP.exe to create Strong Named Interop Assemblies. (Między innymi w tym artykule wyjaśniono potrzebę przełącznika/sysarray.)

W skrócie, tworzenie niestandardowego zestawu współdziałania jest bardzo proste, jeśli zestaw nie jest silnie nazwany. Jest to bardziej skomplikowane, jeśli twój zespół ma silną nazwę, a zatem musisz utworzyć silnie nazwany układ współdziałania. Mam jednak nadzieję, że te artykuły powinny Cię zainteresować.

- Mike

+0

Nie ma problemu Jaspion. .. btw, jeśli używasz .NET 4.0, nie musisz już w ogóle tworzyć zestawów Interop. :-) Tak więc to zapotrzebowanie na to rozwiązanie dotyczy tylko .NET 3.5 i poniżej. –

2

Używam Microsoft.Office.Interop.Excel.dll: Runtime wersja: v1.1.4322 Wersja: 12.0.0.0

Może spróbuj tego:

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

Doszedłem wolą zapisywać pliki Excela jako arkusze kalkulacyjne XML, a następnie otwierać je za pomocą obiektów System.Xml. XML Używam bardzo wielu rzeczy, a Interop jest dla mnie czymś w rodzaju czarnej sztuki. Może nie być wystarczająco dobre dla twoich potrzeb, ale jeśli tak, to prawdopodobnie jest o wiele łatwiejsze niż plątanie się z bibliotekami Interop.

Powiązane problemy