C # и Excel взаимодействуют - PullRequest
10 голосов
/ 11 июля 2009

У одного из моих пользователей возникла проблема при попытке открыть файл Excel через мое приложение C #.

Все работает нормально, когда я запускаю его со своей машины, и это работает для других пользователей. Я не эксперт по взаимодействию в 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);

Я зарегистрировал версию пользователя как 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, должны быть изменены? К сожалению, я не могу воспроизвести это.

Ответы [ 3 ]

14 голосов
/ 11 июля 2009

"Я думал, что с помощью PIA я бы не стал надо беспокоиться о версии Excel проблемы. Я знаю, что есть другие пользователи с помощью Excel 2000, и он работает на моем dev machine. "

Почти правда, но не совсем.

Разрабатывая PIA для Excel 2002, ваша программа будет совместима со всеми версиями Excel 2002 (10.0) и выше. Однако неисправный компьютер работает с Excel 2000 (9.0), который является версией ниже версии, для которой вы разработали.

Официально PIA ниже Excel 2002 не поддерживается, поэтому, если вам нужно, чтобы ваша программа работала в Excel 2000 (9.0), вам придется создать собственную сборку взаимодействия. Вы можете использовать TlbImp.exe для создания сборки взаимодействия для Excel 9.0, как описано в статье Достижение обратной совместимости с .NET Interop: Excel как пример .

Если ваша сборка имеет строгое имя, то вам нужно создать сборку взаимодействия со строгим именем. Это можно сделать, указав имя вашего файла .pfx или .snk через ключ / keyfile, как показано в статье Как создать первичную сборку взаимодействия (PIA) . В этой статье также используется ключ / primary для создания «первичной сборки взаимодействия». Делать сборку взаимодействия первичной не очень нужно в вашем случае, но это не повредит. Однако в статье пропущено использование параметра / sysarray, который вы должны использовать.

Однако создание сборки взаимодействия со строгим именем имеет некоторые сложности. Для получения более подробной информации прочитайте Использование TLBIMP.exe для создания сборок взаимодействия со строгими именами . (Помимо прочего, в этой статье объясняется необходимость использования ключа / sysarray.)

Короче говоря, создание пользовательской сборки взаимодействия очень просто, если ваша сборка не имеет строгого имени. Сложнее, если ваша сборка имеет строгое имя и, следовательно, вам нужно создать сборку взаимодействия со строгим именем. Но, надеюсь, эти статьи помогут вам.

- Майк

2 голосов
/ 11 июля 2009

Я использую Microsoft.Office.Interop.Excel.dll: Runtime версия: 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 голосов
/ 11 июля 2009

Я предпочел сохранить файлы Excel в виде электронных таблиц XML, а затем открыть их с помощью объектов System.Xml. XML Я часто использую для всех видов вещей, в то время как Interop для меня - что-то черное. Это может быть недостаточно для ваших нужд, но если это так, то, вероятно, это намного проще, чем связываться с библиотеками Interop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...