2011-01-25 2 views
1

...C# Automating в Excel

Excel.Application oXL; 
Excel._Workbook oWB; 
Excel._Worksheet oSheet; 

oXL = new Excel.Application(); 
oWB = (Excel._Workbook)oXL.ActiveWorkbook; 
oSheet = (Excel._Worksheet)oWB.Sheets[1]; 

oSheet.Cells[5,10] = "Value"; 

...

дает это при аварии:

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at ConsoleApplication1.Program.Main(String[] args) in C:\Wherever\Visual Studio 2008\Projects\ConsoleApplication20\ConsoleApplication20\Program. 
cs:line 60 

В этом случае линия 60 является

oSheet = (Excel._Worksheet)oWB.Sheets[1];

и то же самое происходит, если строка написана

oSheet = (Excel._Worksheet)oWB.ActiveSheet;.

Excel уже открыт на экране в то время, с новым рабочим листом на месте.

+0

вероятно, не ответ вы искали, но я нашел офис Interop поддержка C# s оставляет желать много лучшего. С другой стороны, я нашел VB.NET намного более стабильным, когда дело доходит до автоматизации Excel. Просто личное наблюдение из нескольких проектов, над которыми я работал. – Nasir

+0

Ух, я только что закончил это на C#. Спасибо за совет по VB.NET – user225626

+0

@ nsr81 Ничего плохого ни с C#, ни с VB. Все это скомпилировано в MSIL. Продолжить тему? – RichardTheKiwi

ответ

2

Ошибка говорит вам, что oWB равно null. Он равен нулю, поскольку в отличие от открытия Excel из графического интерфейса, автоматизация не создает новую книгу с тремя листами. Вам нужно сначала загрузить книгу или добавить ее.

Смотрите пример здесь http://support.microsoft.com/kb/302084, где он явно добавляет новую книгу, чтобы играть с

//Get a new workbook. 
    oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); 
+0

Хорошо, это работает. Спасибо. Теперь мой вопрос - это то, чего не хватает. Знаете ли вы все о? Кроме того, вы говорите, что в исторической парадигме Get/Set, что C# Office Interop все равно может сделать, и если да, то какой из них является .Workbooks.Add (Missing.Value)? Получить ~ или Установить ~? – user225626

+0

Missing.Value используется для InterOp, когда ожидается значение (или необязательно), но у вас его нет. – RichardTheKiwi

+0

'какой-то .Workbooks.Add (Missing.Value)' Я тоже не думаю, что это так. 'Добавить' - это просто вызов функции, а не Аксессор. – RichardTheKiwi

Смежные вопросы