Невозможно привести com объект типа excel applicationclass к интерфейсному типу excel application

I am attempting to capture some data from Excel from within a C# console application.

I get the error

Unable to cast COM object of type ‘microsoft.Office.Interop.Excel.ApplicationClass’ to ‘microsoft.Office.Interop.Excel.Application'»

This code used the ‘Microsoft Excel 12.0 Object Library’, and I included a reference to ‘Microsoft.Office.Interop.Excel’.

I dug a little bit this site and came across
Interop type cannot be embedded, but I could not understand it enough to implement what was suggested as a solution.

My .NET version is 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:\FNN\XLA\fnnComTemplate.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();

    }

}
}

Reseller affiliate logo

Welcome ${RESELLERNAME} Customers

Please opt-in to receive reseller support

I agree that Autodesk may share my name and email address with ${RESELLERNAME} so that ${RESELLERNAME} may provide installation support and send me marketing communications.  I understand that the Reseller will be the party responsible for how this data will be used and managed.

Email Address

Email is required

Entered email is invalid.

  • Remove From My Forums
  • Question

  • I’m having trouble with Excel Interop.  I wrote a sample application:

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

    Dim xlApp As New Application()

    Dim objWorkbook As Workbook

    Dim objWorksheet As Worksheet

    Dim objRange As Range

    Dim intRow As Integer

    Dim intCell As Integer

    Dim strRow As New String(«»)

    ‘ Change the path to SOLVSAMP.XLS to match the path on your computer.

    objWorkbook = xlApp.Workbooks.Open _

    («C:Documents and Settingspmarino.USIDesktopsample.xls»)

    objWorksheet = objWorkbook.Worksheets.Item(1)

    objRange = objWorksheet.Range(«A2», «F16»)

    For intRow = 1 To 15

    For intCell = 1 To 6

    strRow = strRow & objRange.Cells(intRow, intCell).value & vbTab

    Next intCell

    Me.ListBox1.Items.Add(strRow)

    strRow = «»

    Next intRow

    End Sub

    This works fine while debugging.  When I publish the application to localhost and then run, I get this message: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClass’ to interface type ‘Microsoft.Office.Interop.Excel._Application’. This operation failed because the QueryInterface call on the COM component for the interface with IID ‘{000208D5-0000-0000-C000-000000000046}’ failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). on this line:

    Line 20:     objWorkbook = xlApp.Workbooks.Open _
    Line 21:         («C:Documents and Settingspmarino.USIDesktopsample.xls»)

    I have a reference to Microsoft.Office.Interop.Excel which is in c:Program FilesMicrosoft Visual Studio 9.0Visual Studio Tools for OfficePIAOffice11Microsoft.Office.Interop.Excel.dll

    Thanks for your help

Answers

  • I had this problem and it resolved after I ran the Office 2003 repair. Use Add Remove programs> Go to the tab Change or remove programs
    Go to Microsoft Office Professional 2003. Click the link «Click here for support information». Use Repair Button.

    This works.

    • Proposed as answer by

      Tuesday, March 2, 2010 2:08 AM

    • Marked as answer by
      Martin_XieModerator
      Friday, October 22, 2010 4:44 AM

  • Phil Marino,

    Based on your post, I created a new WindowsApplication1 in VB 2005 Express Edition. I copied a sample.xls, added reference of Excel Object Library 12.0 (I am using Office 2007) then use your code snippet with a Button and ListBox control. The application runs well when clicked debugging.

    I publish the application with the default location: http://localhost/WindowsApplication1/, then I can see the page that to install the project and run. The application runs well, too. I can see the result in the ListBox after clicking the button.

    I would like to suggest you to download the OleView.exe to see the related information on RegKeys, Typelib to track down the cause of your problem.

    Hope that can help you.

  • hi again…

    Im gonna answer myself hehe…

    I changed this in the code and now works in all the computer =)

    Dim oExcel As Excel.ApplicationClass —-> Dim oExcel As Excel.Application


    Dim oBooks As Excel.Workbooks

    Dim oBook As Excel.WorkbookClass ——> Dim oBook As Excel.Workbook

    D

    im oSheet As Excel.Worksheet

    • Proposed as answer by
      surendra singh samant
      Thursday, August 27, 2009 4:13 AM
    • Marked as answer by
      Martin_XieModerator
      Friday, October 22, 2010 4:43 AM

  • friends this is Balaji.

    i felt reliable to share the issue i solved. inface the one i face nd suffered from 2-3 days. this is for absolute beginners. Might the Big-B’s knw. but for a beginner newly coding involved with processes would find it help full.

    this error :-

    unable to cast com object of type ‘Microsoft.office.Interop.Excel.ApplicationClass’ to interface type ‘Microsoft.office.Interop.Excel._Application’ .

    The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

    if this arise — the one i solved is not exactly solution in all situations.  a case of mistake can be made by a beginner.

    the situation i solved :

    I tried to kill all the EXCEL processes as some times i used to get the excel file is being used by another processes.

    Solution :

    by doing that we are killing almost the connectivity to the excel. because we import excel in vb.net that process — even that process gets killed nd so the interop classes functionality stops working as the classes connectivity to excel is broken.

    that means by any means if the excel process is terminated we wil get that error.

    • Proposed as answer by
      balajivalla
      Tuesday, September 7, 2010 7:33 AM
    • Marked as answer by
      Martin_XieModerator
      Friday, October 22, 2010 4:44 AM

На одном компьютере (WinXP MSOffice 2007) при попытке выгрузить отчет из самописной (.NET 3.5) программы в Excel проявилась следующая ошибка: Невозможно привести COM-объект типа «Microsoft.Office.Interop.Excel.ApplicationClass» к интерфейсному типу «Microsoft.Office.Interop.Excel._Application». Операция завершилась со сбоем, поскольку вызов QueryInterface COM-объекта для интерфейса с IID «{000208D5-0000-0000-C000-000000000046}» возвратил следующую ошибку: Ошибка при загрузке библиотеки. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).

Ну да, программа компилировалась на компе с MSOffice 2003, и это наложило определенный отпечаток на набор ее библиотек. Но ведь на других станциях всё работает… Единственная особенность — на проблемной машине зачем-то были установлены primary interop assemblies 2007. В итоге помог метод грубой силы: деинсталляция этих самых assemblies и восстановление офиса.

UPD 2018-08-10: По крайней мере, в одном случае удалось установить причину этой ошибки. Как оказалось, по адресу HKEY_CLASSES_ROOTInterface{000208D5-0000-0000-C000-000000000046}TypeLib лежит некий guid (в моём случае {00020813-0000-0000-C000-000000000046}) и номер версии, который нужно использовать (в моём случае 1.6).

Так вот, в ветке реестра HKCRTypeLib{00020813-0000-0000-C000-000000000046} перечислены разные версии, и среди них оказалась одна запись (1.9), оставшаяся от деинсталлированного офиса 2010. Если эту запись, отсылающую к несуществующей версии excel-а, удалить, то ошибка пропадает.

Навело на решение это обсуждение.

29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

1

02.09.2021, 05:52. Показов 6578. Ответов 26


Студворк — интернет-сервис помощи студентам

Здравствуйте!

Дорогие форумчане, написал программку для офиса, закинул на сервер, чтобы все могли пользоваться и столкнулся с проблемой.
Дело в том, что там где Я ее писал был офис 2016 и на компьютерах с другой версией вылетала ошибка, так же вылетала ошибка если версия word, excel не активирована на компьютере.
Пока вижу 2 пути решения:
1 — переустановить всем офис 2016
2 — попытаться в реестре поковыряться (сомнительный)
Так вот, есть ли способ «вшить» interop в саму программу или иной способ обойти данную…ммм…»загвоздку»? =)

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

P.S. : Желательно не сильно кардинальный, чтобы не пришлось переделывать всё…



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 06:34

2

Zhivoder, используйте «позднее связывание», тогда отпадет привязка к версии Interop.

или же использовать библиотеку Interop от Офиса 2010, тем самым все следующие версии офиса будут с ней совместимы.

качать отсюда (Nuget)

Думаю сейчас редко встретишь офис 2007, хотя, если есть, то лучще тогда версию 12 библиотеки использовать.



2



29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 07:01

 [ТС]

3

Yury Komar, можно чуть подробнее, что за «позднее связывание»?
А библиотеку можно включить в саму программу?

Добавлено через 17 минут
по первому вопросу нашел информацию читаю



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 07:09

4

Zhivoder, Вам ненужно носить эту библиотеку «с собой», она есть в установленном офисе, просто удаляете ссылку на вашу библиотеку от 2016-го офиса, устанавливаете необходимый NuGet пакет, ничего в коде менять не придётся.
Так как проект будет ссылаться на библиотеку от офиса 2010, то все последующие имеют обратную совместимость и успешно будут запускаться и работать.

Позднее связывание неудобно при написании кода и отладке.



0



29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 07:45

 [ТС]

5

на VS2010 NuGet не поставить, попробую потанцевать с бубном…



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 08:29

6

Zhivoder, вытяните из пакета нужную dll



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 08:32

7

Вот попробуйте, вытащил из пакета:



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 08:35

8

Хотя, возможно у вас она тоже есть в системе, посмотрите в поиске по сборкам .NET, возможно нужно просто выбрать версию 12 или 14…

Если нет, используйте, вместо той, что сейчас используете, те, что я выше приложил. Повторюсь, ненужно их таскать с EXE’шником



0



29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 09:43

 [ТС]

9

Yury Komar, ссылку на библиотеку сделал, те, что были на 16 оффис удалил, проблема не ушла, вываливается исключение на других версиях:

Кликните здесь для просмотра всего текста

Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.

************ Текст исключения ************
System.InvalidCastException: Невозможно привести COM-объект типа «Microsoft.Office.Interop.Excel.ApplicationCla ss» к интерфейсному типу «Microsoft.Office.Interop.Excel._Application». Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID «{000208D5-0000-0000-C000-000000000046}» возвратил следующую ошибку: Библиотека не зарегистрирована. (Исключение из HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)).
в System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Obj ect objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
в Microsoft.Office.Interop.Excel.ApplicationClass.se t_DisplayAlerts(Boolean RHS)
в M20k20.Form1.Form1_Load(Object sender, EventArgs e)
в System.EventHandler.Invoke(Object sender, EventArgs e)
в System.Windows.Forms.Form.OnLoad(EventArgs e)
в System.Windows.Forms.Form.OnCreateControl()
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl()
в System.Windows.Forms.Control.WmShowWindow(Message& m)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ScrollableControl.WndProc(Mes sage& m)
в System.Windows.Forms.Form.WmShowWindow(Message& m)
в System.Windows.Forms.Form.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************ Загруженные сборки ************
mscorlib
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4069.0 built by: NET48REL1LAST_B
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
—————————————-
M2k20
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///Y:/1.%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B/28.%20%D0%9F%D0%A2%D0%A3%20%D0%AE%D0%93/11.%20%D0%9C%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%B0%D 0%BB%D1%8C%D0%BD%D0%BE-%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D 0%BA%D0%BE%D0%B5%20%D1%81%D0%BD%D0%B0%D0%B1%D0%B6% D0%B5%D0%BD%D0%B8%D0%B5/%D0%9C2k20/M2k20%20%D0%BD%D0%BE%D0%B2%D0%B0%D1%8F%20%D0%B2%D0 %B5%D1%80%D1%81%D0%B8%D1%8F.exe
—————————————-
Microsoft.VisualBasic
Версия сборки: 10.0.0.0
Версия Win32: 14.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
—————————————-
System
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4001.0 built by: NET48REL1LAST_C
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
—————————————-
System.Core
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4110.0 built by: NET48REL1LAST_B
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
—————————————-
System.Windows.Forms
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4042.0 built by: NET48REL1LAST_C
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
—————————————-
System.Drawing
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
—————————————-
System.Configuration
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
—————————————-
System.Xml
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
—————————————-
System.Runtime.Remoting
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
—————————————-

может Я чего-то не так сделал?)

Добавлено через 2 минуты
может имело смысл 12 версию поставить… сейчас попробую



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 09:51

10

Zhivoder, а другие версии офиса — это какие?

Добавлено через 3 минуты
Да, наверное Вам будет лучше использовать позднее связывание, тогда проблему с библиотекой должны уйти. И да, офис должен быть установлен на всех компах, где используется ваше приложение.



0



29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 09:57

 [ТС]

11

Yury Komar, Он установлен везде, только на некоторых машинах другая версия оффиса.
Пробовал 12 версию, не помогла.

Добавлено через 2 минуты
office 2007



0



Yury Komar

Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 10:01

12

Позднее связывание можно организовать так (перед этим удалив ссылки на Interop из проекта), далее, подтягиваеье библиотеку таким образом

VB.NET
1
2
3
Dim objApp As Object = CreateObject("Excel.Application")
Dim objBook As Object = objApp.Workbooks.Open("D:book1.xls")
'...далее все по той же схеме, как и у вас, только явное указание типов (WorkBook, WorkSheet и т.п. нужно заменить на Object)

Добавлено через 2 минуты
Zhivoder, ну 12 версия должна сработать, возможно потому, что приложение ищет ссылку на библиотеку в том месте, откуда вы ее подключили, а ее там нет.



0



29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 10:07

 [ТС]

13

Yury Komar, Я тоже так подумал, но парадокс…на остальных машинах работает…
Про позднее связывание понял, пока оставлю на запасной вариант, еще помучаюсь, ну на крайняк попрошу сисадмина обновить оффис у сотрудницы)



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 10:11

14

Zhivoder, попробуйте зарегистрировать сборку 12й версии в своей системе и уже вибрать из списка GAC ссылку, а не явно указав файл. пересоберите и проверьте.

обязательно удаляйте все другие ссылки на эту библиотеку



0



1703 / 1197 / 306

Регистрация: 26.06.2017

Сообщений: 3,294

02.09.2021, 12:30

15

Мне сам подход к проблеме кажется не корректным. Вместо того чтобы жёстко фиксировать версию библиотеки лучше попытаться проверить какая(ие) уже зарегистрированы зарегистрирована ли вообще, а затем использовать самую свежую. Вот пример подключения библиотеки в коде.



1



29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 13:00

 [ТС]

16

Uswer, Мне понравился подход к делу, а где почитать как это использовать?
Ну Я имею ввиду, вот прописал строчку с дллимпорт, а дальше по коду надо что-то менять? Что в функцию за Дллимпорт вбивать?

Добавлено через 8 минут
что-то даже на майкрософтовском сайте информации не густо



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 13:00

17

Uswer, Хорошая идея, но, как ни крути, это, вроде, будет то же самое «позднее связывание», что и постом выше, создавая объект COM-сборки, который, в свою очередь, тоже берет актуальную версию, имеющуюся в системе и работает с ней.



0



1703 / 1197 / 306

Регистрация: 26.06.2017

Сообщений: 3,294

02.09.2021, 13:11

18

Цитата
Сообщение от Zhivoder
Посмотреть сообщение

на майкрософтовском сайте информации не густо

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

Цитата
Сообщение от Zhivoder
Посмотреть сообщение

а дальше по коду надо что-то менять?

Насколько я понимаю после подключения библиотеки Вы просто вызываете методы, используете типы данных, которые описаны в этой библиотеке и т.п. В общем работаете так, как будто она подключена через Impots, т.е. в коде менять ничего не потребуется.

Добавлено через 2 минуты
Yury Komar, возможно и так, но ведь теперь в коде можно организовать разного рода проверки: посмотреть в реестр, поисках на дисках и т.д. и при наличии нескольких версий DLL подключить нужную (не обязательно самую свежую кстати). А главное понять, что сама библиотека есть.



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,842

02.09.2021, 13:17

19

Uswer, Удобно, че сказать. Надо попробовать будет.



0



Zhivoder

29 / 25 / 3

Регистрация: 16.12.2019

Сообщений: 94

02.09.2021, 13:30

 [ТС]

20

Блин ребят, Я не такой крутой как вы)))

1. Я отключаю ссылку на тот Интероп, что у меня есть?
2. Что пихать в функцию?

VB.NET
1
2
3
4
<DllImport("Microsoft.Office.Interop.Excel.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Shared Function LoadLibrary(ByVal libname As String) As IntPtr
 
    End Function

3. Если ответ на 1 вопрос «Да», то чем заменить подобного рода строки?

VB.NET
1
2
Private ExcelApp As New Microsoft.Office.Interop.Excel.Application
    Private database As Microsoft.Office.Interop.Excel.Workbook

P.S. Объясните пожалуйста, можете обзываться))))



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

02.09.2021, 13:30

20

Понравилась статья? Поделить с друзьями:
  • Невозможно получить доступ к excel файлу
  • Невозможно подключиться к microsoft excel driver 1с
  • Невозможно переместить ячейки в таблице или диапазоне с примененным фильтром excel
  • Невозможно передать данные в excel
  • Невозможно открыть файл поскольку его размер превышает 512 мб word