Почему установленный не может бросить объект от Excel interop?

Попытка получить ссылку на рабочие листы (использующий Excel interop):

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

Действительно ли мой бросок является неправильным?

10
задан AngryHacker 22 April 2010 в 23:30
поделиться

4 ответа

Да, у вас неправильный гипс.

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

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

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

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

8
ответ дан 3 December 2019 в 21:20
поделиться

Согласно 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
4
ответ дан 3 December 2019 в 21:20
поделиться

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

Вы также столкнетесь с меньшим количеством конфликтов COM (например, как указано выше в вашем сообщении).

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

0
ответ дан 3 December 2019 в 21:20
поделиться

Нечетный. Согласно эта страница должна быть типа Листов , а не Рабочих листов . Не тестировали - попробовать?

2
ответ дан 3 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: