Microsoft Interop Excel закрывает запущенные экземпляры Excel? - PullRequest
1 голос
/ 13 июля 2010

Привет всем, я читал о многих людях, которым трудно закрывать экземпляры запущенного приложения Excel, созданного с использованием объектов Com. Мне удалось время от времени вызывать полное закрытие экземпляров Excel, но не всегда (я вернусь к этому позже).


Моя проблема гораздо сложнее, чем просто закрыть работающий экземпляр Excel, так как я пытаюсь создать приложение, которое будет:

  1. Создайте файл Excel, используя один из множества доступных шаблонов (это прекрасно работает)

  2. Заполните ячейки шаблона в зависимости от критериев, выбранных в моем приложении (также отлично работает)

  3. Позволяет пользователям продолжать ввод значений, которые не могут быть получены из данных в моем приложении (вот что делает закрытие процессов и удаление com-объектов более сложным)

  4. Сохранение данных при закрытии Excel (я могу заставить это работать без очистки ссылок на com-объекты, однако это, очевидно, означает, что процесс Excel не был завершен, попытался очистить ссылки на com-объекты, но затем он не позволит сохранить рабочий лист ПОСЛЕ того, как пользователь закроет Excel или не так, как я его реализовал).

  5. В идеале я хотел бы прекратить процесс Excel, когда пользователь закрывает Excel. (Вот в чем проблема)


Что касается очистки объекта com, у меня есть метод очистки, такой как:

private void cleanUp()
{
    for (int i = 0; i < ranges.Count; i++)
    {
        ranges[i] = null;
    }

    for(int i = 0; i < worksheets.Count; i++)
    {
        worksheets[i] = null;
    }

    for (int i = 0; i < worksheetwrappers.Count; i++)
    {
        worksheetwrappers[i] = null;
    }
    for (int i = 0; i < workbooks.Count; i++)
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks[i]) > 0)
                {
            workbooks[i].Close(false, "", false);
                        workbooks[i] = null;
                }
    }
    for (int i = 0; i < instances.Count; i++)
    {
                while (System.Runtime.InteropServices.Marshal.ReleaseComObject(instances[i]) > 0)
                {
                    instances[i].Quit();
                        instances[i] = null;
                }
        }
} 

Мне еще предстоит сделать рефакторинг и сделать его красивым и опрятным, так что, к сожалению, вы получаете самые основы того, что у меня есть.


В основном моя проблема состоит в том, чтобы знать, когда утилизировать все com-объекты и когда выполнять очистку, поскольку пользователь должен ввести больше данных после заполнения электронной таблицы, то есть я не могу автоматически выполнить очистку после того, как электронная таблица имеет был заселен.

Мне интересно, придется ли мне использовать какой-то наблюдатель для прослушивания, когда Excel закрывается, а затем избавиться от всех объектов Com (что является болью) или если у кого-то есть какая-то умная идея, о которой я не думал из.

Спасибо за любую помощь,

Nic

1 Ответ

1 голос
/ 13 июля 2010

Вы можете попытаться обойти вашу проблему.

1: создание рабочего листа на основе шаблона и заполнение данных

2: запустить процесс Excel с параметром "имя нового файла"

3: дождаться окончания процесса

4: открыть рабочий лист, прочитать данные и утилизировать объекты

Возможно, это вариант - вы хотя бы узнаете, когда пользователь завершит сеанс Excel.

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