Исходное литье get_Range исключает исключение
Я использую С# для управления листом Excel. Следующие два фрагмента кода должны работать одинаково, но один работает, а другой создает исключение. Интересно, почему.
Это работает:
oRange = (Excel.Range)oSheet.get_Range("A1","F1");
oRange.EntireColumn.AutoFit();
Это генерирует исключение:
oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]);
oRange.EntireColumn.AutoFit();
Исключение:
RuntimeBinderException occurred. "object" does not contain a definition for 'get_Range'
oSheet
создается следующим образом:
Excel.Worksheet oSheet = new Excel.Worksheet();
Я должен создать экземпляр как по-разному?
Ответы
Ответ 1
Похоже, что исключение выбрано из oSheet.Cells[1, 1]
и oSheet.Cells[4, 4]
, используемых в качестве аргументов для get_range
.
Применяя следующее, исключение не будет выбрано:
Excel.Range c1 = oSheet.Cells[1, 1];
Excel.Range c2 = oSheet.Cells[4, 4];
oRange = (Excel.Range)oSheet.get_Range(c1, c2);
oRange.EntireColumn.AutoFit();
Таким образом, это может быть связано с функциональностью oSheet.get_Range
. Он получает объект в качестве аргумента, поэтому он может попытаться вызвать метод get_range
для аргументов для получения внутренней ячейки, а добавление из Range
к объекту, выполняемому компилятором, может скрыть вызов метода.
Если вам требуется определение ячеек по строке/столбцу - попробуйте использовать вышеприведенный подход.
Ответ 2
Вместо этого используйте свойство Range Worksheet.
Например, вместо
oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]);
использование
oRange = (Excel.Range)oSheet.Range[oSheet.Cells[1, 1],oSheet.Cells[4,4]];
Я широко использовал метод get_Range(), когда я использовал .NET 2. Когда я перешел на .NET Client Profile, я получил это исключение. Замена ссылок get_Range() с использованием свойства Range затронула эту проблему для меня.
Ответ 3
Для всех, у кого есть эта проблема, гораздо лучше использовать явное преобразование, а не создавать новые переменные.
oRange = (Excel.Range)oSheet.get_Range((Excel.Range)oSheet.Cells[1, 1], (Excel.Range)oSheet.Cells[4,4]);
Ответ 4
Я обновил проект VS С# с .Net Framework 3.5 до 4.5.
Как только я успешно обновился, я получил этот "объект", не содержащий определения для исключения "get_Range" при попытке создания отчета Excel.
То, что я сделал, вместо использования ниже кода
range = xlSheet.get_Range(Cells[xlRow, xlCol], Cells[xlRow, xlCol]);
Я переписал
range = xlSheet.Range[Cells[xlRow, xlCol], xlSheet.Cells[xlRow, xlCol]];
И это сработало.