Попытка получить ссылку на рабочие листы (использующий 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)).
Действительно ли мой бросок является неправильным?
Да, у вас неправильный гипс.
_Workbook.Sheets
предоставляет вам экземпляр Sheets . Этот интерфейс предоставляет вам все типы листов, а не только рабочие листы; в основном он включает в себя диаграммы, листы макросов и т. д.
С другой стороны, интерфейс Рабочие листы предоставляет вам только рабочие листы, но не диаграммы.
Интерфейсы не могут быть назначены друг другу; следовательно, вы получите ошибку COM. Это сбивает с толку - я даже не уверен, можно ли получить экземпляр интерфейса Worksheets
через PIA, но для вас это Office Interop.
Если вы используете свойство _Workbook.Worksheets
вместо свойства _Workbook.Sheets
, вы должны получить экземпляр Sheets
, который возвращает только Объекты рабочего листа
- несмотря на то, что интерфейс способен предоставлять другие типы листов.
Согласно 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
Если вы имеете дело с Excel 2007+, я бы предложил использовать System.IO.Packaging + System.Xml.Linq (LINQ to XML) для управления таблицами Excel. Он намного чище и не требует фактической установки Excel на машину, на которой вы запускаете приложение.
Вы также столкнетесь с меньшим количеством конфликтов COM (например, как указано выше в вашем сообщении).
Если вы пытаетесь редактировать Excel 2003 или более раннюю версию, к сожалению, я не могу вам помочь.
Нечетный. Согласно эта страница должна быть типа Листов
, а не Рабочих листов
. Не тестировали - попробовать?