Получение значений ячеек из Excel API C #

У меня есть лента, которую я сделал для Excel вместе с cs-файлом, который будет выступать в качестве ядра надстройки. При нажатии кнопки на CustomRibbon я хочу проанализировать значения данных для одной из строк.

private void button1_Click(object sender, RibbonControlEventArgs e) { Console.WriteLine(Globals.ThisAddIn.Application.Cells[0, 0]); } 

Но это дает мне ошибку

Исключение из HRESULT: 0x800A03EC

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

  sheet.Cells[0,0]= "hello"; 

Это также дает мне ошибку.

«Самый низкий» применимый индекс для обращения к ячейке в листе Excel равен [1,1], что соответствует столбцу A, ячейке 1. Я вижу, что вы пытаетесь ссылаться на 0,0, который выходит за frameworks стол.

Хотя C # обычно использует индексирование на основе нулевой таблицы, похоже, что программисты Excel Interop придерживались другой методологии. Это или они хотели, чтобы их соглашения были единообразными, так как первая строка в таблице Excel начинается с 1, а не 0. Я не бафф Excel, но это мое лучшее предположение.

Изменить: по запросу Сиддхарта, вот пример, который копирует содержимое элемента управления DataGridView на лист Excel. Обратите внимание, что это просто демонстрирует базовую функциональность и не является полным примером или обязательно лучшей практикой:

 #using Microsoft.Office.Interop; Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; xlApp = new Excel.ApplicationClass(); xlWorkBook = xlApp.Workbooks.Add(1); xlWorkSheet = Excel.Worksheet xlWorkBook.ActiveSheet; // Notice the index starting at [1,1] (row,column) for (int i=1; i 

Обратите внимание на различия между индексацией. Этот пример сначала копирует заголовки из DataGridView, а затем смещает позицию в листе Excel, чтобы скопировать остальную часть данных, поскольку заголовки столбцов не считаются индексными ячейками в DataGrid. Это, вероятно, также будет работать для DataTables.

Попробуйте использовать поле Value2 ячейки.

 sheet.Cells[1,1].Value2 = "hello"; 

Также в этой строке

 Console.WriteLine(Globals.ThisAddIn.Application.Cells[1, 1]); 

Поле «Ячейки» является свойством листа. Вы не можете использовать его в приложении Excel; вам необходимо сначала создать или открыть Рабочую книгу, а затем создать или использовать существующий Рабочий лист .

EDIT : Забыл, что диапазоны Excel являются 1-индексом, а не 0-индексом.