Взаимодействие с Excel: рабочие тетради - PullRequest
1 голос
/ 30 января 2012

Это продолжение моего предыдущего вопроса ( Открыть книгу Excel с кодом vba - ошибка при уведомлении VSTO ), которая еще не решена.У меня свежий набор проблем с Excel Interop.Даже без каких-либо ошибок в файле Excel я вижу, что workBooks.Open иногда зависает бесконечно, в результате чего мое приложение зависает навсегда.Я использую следующий код для инициализации объекта Excel

    public static class InterOpService
    {
            private static Application _excel;


            public static Application Excel
            {
                get
                {
                    try
                    {
                        _excel = (Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
                        _excel.Visible = true;
                    }
                    catch(Exception ex)
                    {

                        _excel = new Application { Visible = true };
                    }
                    return _excel;
                }
            }
     }

Приведенный выше код возвращает мне объект Excel.Он также пытается избежать создания нескольких экземпляров объекта Excel.В следующем коде этот возвращенный объект используется

Application excel = InterOpService.Excel;
Workbooks workBooks = excel.Workbooks;
string file  = fileName;
Workbook workBook = workBooks.Open(file, 0,
                                      true,
                                      5,
                                      "",
                                      "",
                                      true,
                                      XlPlatform.xlWindows,
                                      "\t",
                                      false,
                                      false,
                                      0,
                                      true,
                                      1,
                                      0);

Одна из вероятных причин, по которой я вижу зависание workbooks.open, - совместное использование файлов.Вероятно, антивирусный сканер получает эксклюзивную блокировку файла, и мое приложение зависает при попытке открыть в это время.Проблема в том, что это случайное поведение, и я действительно изо всех сил пытаюсь повторить это. Другая проблема заключается в том, что мне нужно найти выход только с помощью Interop.

1 Ответ

1 голос
/ 14 июля 2012

Я нашел проблему.Ниже приведены причины зависания:

1) Я открывал книгу по сети. Файл

Workbook workBook = workBooks.Open(file, 0,
                                  true,
                                  5,
                                  "",
                                  "",
                                  true,
                                  XlPlatform.xlWindows,
                                  "\t",
                                  false,
                                  false,
                                  0,
                                  true,
                                  1,
                                  0);

не был на моей локальной машине.Количество случаев с зависанием уменьшилось после того, как я скопировал файл на локальную машину и сделал открытие.

2) Память сервера.Другая причина зависания заключалась в том, что загрузка процессора на сервере составляла 100%. Я не контролирую это.Но удовлетворен тем, что я нашел это.

Основная проблема метода Open заключается в том, что он недостаточно отзывчив, чтобы сообщить вызывающему об этих причинах.Лучший способ - выполнить это действие в потоке и дать потоку время на выполнение.Сбой, если поток не отвечает в указанный период времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...