Почему нельзя установить приведение объекта из Excel взаимодействия? - PullRequest
10 голосов
/ 23 апреля 2010

Попытка получить ссылку на листы (с помощью Excel взаимодействия):

Excel.Application xl = new Excel.ApplicationClass();
Excel.Workbooks xlWorkBooks = xl.Workbooks;
Excel.Workbook xlWorkBook = xlWorkBooks.Open(fileName, 0, false, 5, "", 
                      "", true, Excel.XlPlatform.xlWindows, "\t",
                      false, false, 0, true, 1, 0);

// Next line crashes
Excel.Worksheets xlWorkSheets = (Excel.Worksheets) xlWorkBook.Worksheets; 

Ошибка в том, что он не может разыграть его:

Невозможно привести COM-объект типа 'System .__ ComObject' к типу интерфейса 'Microsoft.Office.Interop.Excel.Worksheets'. Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{000208B1-0000-0000-C000-000000000046}' завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

Мой актерский состав неправильный?

Ответы [ 6 ]

8 голосов
/ 23 апреля 2010

Да, ваш состав неверен.

_Workbook.Sheets дает вам экземпляр Sheets .Этот интерфейс предоставляет вам все типы листов, а не только рабочие листы;в основном он включает диаграммы, макросы и т. д.

С другой стороны, интерфейс Рабочие листы предоставляет только рабочие таблицы, а не диаграммы.

Интерфейсы не назначаютсядруг другу;следовательно, вы получаете ошибку COM.Это сбивает с толку - я даже не уверен, возможно ли получить экземпляр интерфейса Worksheets через PIA - но это Office Interop for ya.

Пока вы используете вместо этого свойство _Workbook.Worksheetsсвойства _Workbook.Sheets вы должны получить экземпляр Sheets, который возвращает только Worksheet объектов - несмотря на то, что интерфейс способен предоставлять другие типы листов.

4 голосов
/ 23 апреля 2010

Согласно MSDN , Workbook.Worksheets возвращает Microsoft.Office.Interop.Excel.Sheets.

Таким образом, вы могли бы разыграть это так:

Microsoft.Office.Interop.Excel.Sheets sheets = 
    (Microsoft.Office.Interop.Excel.Sheets)xlWorkBook.Worksheets

Или предполагая Excelотображается на Microsoft.Office.Interop.Excel (как следует из вашего вопроса)

Excel.Sheets sheets = (Excel.Sheets)xlWorkBook.Worksheets
3 голосов
/ 07 декабря 2012

Если он работает в одной среде, но не в другой, проверьте ключи реестра Root / TypeLib классов HK.

Возможно, вы пытаетесь запустить HKCR \ TypeLib {00020813-0000-0000-C000-000000000046} \ 1.6, но что-то установленное пользователем добавило ключ: HKCR \ TypeLib {00020813-0000-0000-C000-000000000046} \ 1.7, в результате чего вызов Interop вызывает исключение.

Или, если этоне так ли, это может быть что-то в GAC из-за разных версий ОС.

У меня была эта проблема, когда она работала на наших машинах разработчиков под управлением Windows 7, и вызвала эту ошибку на машине пользователя под управлением XP.

2 голосов
/ 23 апреля 2010

Нечетный.Согласно этой странице , она должна иметь тип Sheets, а не Worksheets.Не проверяли - крутили?

0 голосов
/ 13 октября 2015

Это могло произойти после обновления до последней версии Office. Попробуйте перейти в раздел «Программы и компоненты», найти установку и «починить» ее. По-видимому, он обновил и / или перерегистрировал DLL взаимодействия, использованную для создания этих объектов.

Возможно, это необходимо сделать в сочетании с исправлением реестра, описанным @ codesforcoffee.

0 голосов
/ 23 апреля 2010

Если вы имеете дело с Excel 2007+, я бы предложил использовать System.IO.Packaging + System.Xml.Linq (LINQ to XML) для работы с таблицами Excel.Это намного чище и не требует, чтобы Excel был фактически установлен на машине, на которой вы запускаете ваше приложение.

Вы также столкнетесь с меньшим количеством коллизий COM (как указано выше в вашем посте).*

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

...