Microsoft.Office.Interop.Excel не работает на 64-разрядных

Я столкнулся с проблемой при разработке на MS Visual Web Developer 2008 Express Ed. Разработка ASP.NET C# на 64-битной ОС Windows7.

Я пытаюсь открыть документ Excel, но он дает мне Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

Я настроил сборку на все процессоры (Любой ЦП, x64, x86), но она не работает. Я искал ответ в интернете, но не мог понять, как с этим справиться.

Странно то, что тот же код работал в той же системе, когда я разрабатывал для Microsoft Visual C# 2010 Express! Как так? разве это не та же самая длл, работающая позади?

Нужно ли менять эту COM DLL, чтобы она работала в системе x64?

Пожалуйста, помогите мне, что я могу сделать?

Мой код:

using Excel = Microsoft.Office.Interop.Excel;
xlApp = new Excel.Application();
__Log("Openning " + excelFileName);
xlWorkBook = xlApp.Workbooks.Open(excelFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(2);

1 ответ

Решение

Покопавшись в интернете, я обнаружил, что в Microsoft Interop есть ошибка в COM-объектах (по крайней мере, в моем случае - MS Excel 2010).

Ошибка заключается в том, что.NET проверяет, подходит ли локализация вашего потока (код C# или VB) к локализации MS Excel, которую вы установили ранее, и, если нет, сообщает, что Microsoft.Office.Interop библиотека старая или недействительная.

Локализация вашего потока основана на региональных настройках вашего компьютера (из панели управления -> региональные и языковые)

Тогда есть два варианта решения этой проблемы:

  1. Чтобы изменить локализацию вашего потока (по коду)
  2. Установите языковой пакет для вашего офиса

Первое решение выглядит так:

using System.Threading;     // For setting the Localization of the thread to fit
using System.Globalization; // the of the MS Excel localization, because of the MS bug

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
excelFileName = System.IO.Path.Combine(excelPath, "Ziperty Buy Model for Web 11_11_2011.xlsm");

Надеюсь, это поможет:) Gr8 день

Другие вопросы по тегам