Я разработал консольное приложение на С# .net, которое создает новый Excel и выполняет в нем некоторые операции [Interop].
Я добавил Interop.Microsoft.Office.Interop.Excel.dll в качестве ссылки в свой проект.
Код отлично работает на XP и в Vista. Но если я храню свой exe в одной из папок, это дает мне исключение
Не удалось получить фабрику классов COM для компонента с CLSID {00024500-0000-0000-C0 00-000000000046} из-за следующей ошибки: 80090006.
Необработанное исключение: System.Exception: Необработанное исключение во время выполнения ---> System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
Кто-нибудь знает, возможно ли это из-за более строгих политик, которые могли быть установлены для любой папки. Я спрашиваю об этом, потому что, если я скопирую этот exe в другую папку, exe работает отлично.
Кусок кода, в котором выдается execption,
/* Create spreadsheet update data */
InteropExcel.Workbook oWorkbook = null;
InteropExcel.Worksheet oWorkSheet = null;
InteropExcel.ApplicationClass appExcel = null;
try
{
// Probable at this line
appExcel = new InteropExcel.ApplicationClass();
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
oWorkSheet = (InteropExcel.Worksheet)oWorkbook.ActiveSheet;
// ...
Я также не могу справиться с этим, даже если я написал этот код в блоке try-catch.
Может ли кто-нибудь предложить какое-либо решение для этого?
Благодарность,
Amit
2 ответа
SpreadsheetGear для .NET проще в использовании и развертывании из приложений .NET (включая консольные приложения) и намного быстрее, чем Excel через COM-взаимодействие.
Вы можете загрузить бесплатную пробную версию здесь.
Отказ от ответственности: я владею SpreadsheetGear LLC
Трудно сказать наверняка, что может быть причиной этого. Итак, сначала несколько вопросов, на которые вы можете ответить или уточнить, отредактировав исходный вопрос выше.
(1) Когда вы говорите, что ссылались на «Interop.Microsoft.Office.Interop.Excel.dll», я предполагаю, что вы имеете в виду Microsoft.Office.Interop.Excel.dll
?
Кроме того, если вы проверите свойства этой ссылки, покажет ли она, что она находится в GAC? Вы можете проверить это, зайдя в обозреватель решений, развернув проект, развернув ссылки, щелкнув правой кнопкой мыши ссылку Microsoft.Office.Interop.Excel
и затем проверив свойство Path
. Если он находится в GAC, свойство Path
должно начинаться с "C:\Windows\Assembly\GAC...".
(2) Также кажется, что у вас есть оператор using, который где-то определяет InteropExcel
? Что-то вроде этого:
using InteropExcel = Microsoft.Office.Interop.Excel;
Это правильно или InteropExcel
- это отдельная ссылка?
(3) Когда вы говорите, что перемещаете исполняемый файл, вы перемещаете только исполняемый файл или всю папку, содержащую исполняемый файл и связанные с ним файлы? Сборка .NET не является автономной, ей нужны ссылки, файлы конфигурации и/или другие файлы, которые должны находиться в той же папке, что и исполняемый файл, или иногда в подпапке той же папки, в которой находится исполняемый файл. Убедитесь, что вы перемещаете все вместе.
(4) Вы должны запускать свой код в режиме отладки, размещенном в интегрированной среде разработки Visual Studio, чтобы вы могли точно знать, какая строка вызывает исключение. Я предполагаю, что ваша первая строка возвращает null
:
appExcel = new InteropExcel.ApplicationClass();
И затем я думаю, что ваша следующая строка выдает NullReferenceException
, потому что ваша ссылка «appExcel» равна нулю:
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
(Хммм... на самом деле, чем больше я об этом думаю, тем меньше в этом смысла. Не тестировалось, но я не ожидал, что вызов appExcel = new InteropExcel.ApplicationClass()
спокойно вернет null
. Я ожидал, что это чтобы либо правильно вернуть объект приложения, либо сгенерировать исключение, но не потерпеть неудачу, вернув null
. Но может быть. Если нет, то я думаю, что ваше исключение может происходить в каком-то коде вне код, который вы показываете. Так что вам действительно нужно запустить его в Visual Studio IDE, чтобы вы могли знать, какая строка не работает.)
(5) Кроме того, ваш вызов метода Workbooks.Add
неверен. Параметр Template
используется для определения того, какая рабочая книга, если таковая имеется, будет действовать как шаблон для новой рабочей книги. В общем, переданный аргумент должен быть Type.Missing
, чтобы опустить этот параметр; это позволит создать новую книгу на основе пустой книги по умолчанию. Если вы передаете аргумент, это может быть либо строка, содержащая полный путь к книге, которую вы хотите использовать в качестве шаблона для новой книги, либо константа Excel.XlWBATemplate
, например Excel.XlWBATemplate.xlWBATChart
или Excel.XlWBATemplate.xlWBATWorksheet
, чтобы определить тип создаваемой книги. Опять же, как правило, этот параметр следует опускать, передавая Type.Missing
. (Подробнее об этом см. в справке по Workbooks.Добавить метод.)
Поэтому я предлагаю вам изменить свою строку с:
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
К
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(Type.Missing);
(6) В общем, вы должны использовать Application
, а не ApplicationClass
. Я знаю, что это кажется странным, потому что Excel.Application
— это интерфейс, а создание интерфейса new
кажется парадоксальным, но именно так это должно быть сделано при автоматизации программ MS Office. (Подробнее об этом см. Не используйте ApplicationClass (если только вам нужно) и Excel interop: _Worksheet или Worksheet?.)
Поэтому ваши строки:
InteropExcel.ApplicationClass appExcel = null;
appExcel = new InteropExcel.ApplicationClass();
Вместо этого должно быть:
InteropExcel.Application appExcel = null;
appExcel = new InteropExcel.Application();
Я не знаю, какая из этих проблем вызывает вашу проблему, возможно, здесь задействованы некоторые из них, но все они должны быть проверены и/или исправлены. Надеемся, что один из них решит вашу проблему.
Если ни одно из этих решений не помогло, вы должны опубликовать дополнительную информацию обо всех этих элементах, которые я выделил, и/или включить что-нибудь еще, что вы, возможно, выяснили за это время.
Я скрестил за тебя пальцы...
Майк
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.