не удалось привести COM-объект типа " microsoft.Офис.Взаимодействие.Превосходить.ApplicationClass " для " microsoft.Офис.Взаимодействие.Превосходить.Применение"

Это моя первая попытка захватить некоторые данные из excel из одного консольного приложения C#.

Я получаю сообщение об ошибке "невозможно привести COM-объект типа" microsoft.Офис.Взаимодействие.Превосходить.ApplicationClass " для " microsoft.Офис.Взаимодействие.Превосходить.Заявление".

этот код использовал "библиотеку объектов Microsoft Excel 12.0", и я дал ссылку на Microsoft.Офис.Взаимодействие.Превосходить.

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

Я немного покопался в этом сайте и наткнулся на это решение: тип взаимодействия не может быть встроен

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

моя версия .Net-4.5.

любая помощь очень высоко ценится.

спасибо заранее.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;

using Excel = Microsoft.Office.Interop.Excel;

namespace deneme
{
class Program
{
    static void Main(string[] args)
    {

        Excel.Application xlApp = new Excel.Application();
        xlApp.Visible = true; // <-- excel application
        xlApp.DisplayAlerts = false;

        // Open the workbook.
        Excel.Workbook wBook = xlApp.Workbooks.Open("C:FNNXLAfnnComTemplate.xlsx",
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);

        // get the sheet
        Excel.Worksheet wSheet = wBook.Sheets[0];
        // foreach (Excel.Worksheet sheet in wBook.Sheets) { if (sheet.Name == "templateSheet") { wSheet = sheet; } }

        Excel.Range rng = wSheet.get_Range("A1");

        aux = wSheet.Range["F6"].Value;

        Console.WriteLine("interop result:" + aux);
        Console.ReadLine();

    }

}
}

6 ответов


Если это не ошибка, связанная с кодом, пожалуйста, удалите ниже данный ключ из реестра.

действия:

Пуск--> Выполнить --> regedit --> HKEY_CLASSES_ROOT-->TypeLib-- > {00020813-0000-0000-C000-000000000046} --> 1.8 / 1.7 (удалить это)

решение: Эта проблема может быть решена путем удаления недействительных ключей реестра, оставшихся от более высокой версии Office. Выполните описанные выше действия.

причиной: Эта проблема вызвана оставшимся разделом реестра, если вы понизили версию Microsoft Office с Office 2010 до Office 2007 или Office 2013 до Office 2010 или 2007.

Дайте мне знать, если это решение не помогло вам


Я уверен, что ответы на этот вопрос (и аналогичные вопросы), предлагающие редактирование реестра и удаление старых ссылок на версии Office больше не на машине правильно.

Я только добавляю этот ответ, потому что в настоящее время я пинаю себя. Два часа потратил на поиски ключей в реестре и ничего не добился. Последний бросок кости был, чтобы попробовать простой ремонт в Microsoft Office и вдруг моя ошибка пропала.

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


Microsoft Office 365

я запускал Microsoft Office 365 с Windows 10 и пробовал упомянутые решения для удаления раздела реестра без успеха.

Я зашел в Панель управления в попытке восстановить пакет Office 365. enter image description here

Я выбрал быстрый ремонт enter image description here

попробовал мою программу снова, и все сработало!


машина была обновлена до 64-разрядной версии Office 2016, и интерфейс COM создавал исключения при вызове из 32-разрядного приложения. В нем не было старых машинописных записей, как в ответе Джаеша.

сравнение трассировок ProcessMonitor с рабочей машиной с Office 2016 привело к тому, что похоже на тупиковые ключи реестра в

HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{00024..

работая машина проверила бы для несуществующий раздел реестра и return

ИМЯ НЕ НАЙДЕНО

У отказавшей машины был раздел реестра, но вскоре после этого возникло исключение.

после многократного удаления раздела реестра, повторного запуска трассировки, удаления следующего ключа сбоя, функциональность com-интерфейса была восстановлена.


оба 1.7 и 1.8 в реестре. Решено путем удаления:

HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}.8

используя тот же самый код, я получил ту же проблему в ноутбуке, когда все работало нормально на другом. Я пробовал различные решения, найденные здесь и там в интернете, но что, наконец, сработало, было явное определение использования не 32-битной версии библиотеки. Для этого в visual studio мне пришлось поставить галочку, а затем снять флажок "предпочитают 32-бит" в разделе сборки конфигурации проекта, который добавил <Prefer32Bit>false</Prefer32Bit> в рамках .файл csproj.