Подтвердить что ты не робот

С# и Excel interop

Один из моих пользователей сталкивается с проблемой при попытке открыть файл Excel через мое приложение С#.

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

4b9b3361

Ответ 1

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

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

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

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

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

Создание сильной команды interop имеет некоторые сложности, чтобы рассмотреть, однако. Для получения дополнительной информации прочитайте Использование TLBIMP.exe для создания Strong Named Interop Assemblies. (В частности, в этой статье объясняется необходимость использования переключателя /sysarray.)

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

- Майк

Ответ 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];
    }
 }

Ответ 3

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