2010-07-13 14 views
1

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


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

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

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

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

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

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


Что касается объекта ком очистки, у меня есть метод очистки, например следующим образом:

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; 
       } 
     } 
} 

Я до сих пор реорганизовать это и сделать его хорошо и аккуратно, поэтому, к сожалению, вы получаете самые основы того, что у меня есть.


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

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

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

Nic

ответ

1

Вы могли бы попробовать работать вокруг проблемы.

1: Создать таблицу на основе шаблона и населяющие данных

2: Запуск процесса Excel с параметром "newfilename"

3: Жди процесс до конца

4: Откройте рабочий лист, прочитайте данные и распоряжаться объектами

Возможно, это вариант - вы, по крайней мере, узнаете, когда пользователь закончил сеанс excel.

+0

Вы легенда, работает в сочетании с использованием другого метода очистки: D! – user389981

+0

@riffnl можете ли вы указать свой код, это было супер frustratnig для меня –

+0

@l___ У меня нет кода для этого. Я на самом деле не сделал этого. Первоначально на самом деле был вопрос: «Я хочу знать, когда пользователь закончит мой Excel-сеанс». Это то, что я предложил, использовать процесс и ждать его завершения (см. Http://support.microsoft.com/kb/305369). – riffnl

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