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