On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
Администратор




Пост N: 1680
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.10.10 10:52. Заголовок: Закрытие Excel


Делаем маленький тест:

func main
Local oExcel := TOleAuto():New( "Excel.Application" )
Local oSheet

oExcel:WorkBooks:Add()
oSheet := oExcel:ActiveSheet
oSheet:Cells( 1, 1 ):Value := 'test'
oExcel:Visible := .t.
wait
retu nil

запускаем. Открывается Excel. Закрываем Excel, вызываем task manager, и видим, что Excel продолжает висеть в памяти.
Возвращаемся в программу, нажимаем эни кей, программа закрывается. Снова смотрим task manager - Excel там уже нет, тоже закрылся.

Вопрос: почему Excel остается в памяти после закрытия Excel ?

Но это в маленьком тесте, хорошо что Excel закрывается при закрытии харбор-программы

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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 12 [только новые]


администратор




Пост N: 1891
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.10.10 11:40. Заголовок: Точно , лажа какая т..


Точно , лажа какая то.
Похожий пример с Word , работает нормально

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 981
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 29.10.10 19:58. Заголовок: Pasha пишет: Вопрос..


Pasha пишет:

 цитата:
Вопрос: почему Excel остается в памяти после закрытия Excel ?


Dima пишет:

 цитата:
Похожий пример с Word , работает нормально


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

Pasha пишет:

 цитата:
После работы с несколькими документами таких экселей там остается - мама не горюй.


Я, например, стараюсь не создавать несколько копий приложения, а если Excel уже загружен, то его и использовать. Примерно так
#ifndef __XHARBOUR__  
#xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )}
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#endif

function main
Local oExcel
Local oSheet

TRY
oExcel := GetActiveObject( "Excel.Application" )
CATCH
oExcel := CreateObject( "Excel.Application" )
END


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


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1681
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.10.10 22:16. Заголовок: Петр пишет: Все раб..


Петр пишет:

 цитата:
Все работает нормально - это фишка Excel. У него так реализован COM сервер. Он следит за вызвавшей его программой, вдруг ей опять обратится к этому самому Excel- у вздумается, а он уже тут как тут.



Я примерно догадался о таком поведении Excel. Если в моем примере перед wait вставить:

oSheet := nil
oExcel := nil

То Excel закрывается сразу после закрытия документа.

Но в рабочей программе это не помогает. Поскольку Excel остается в памяти и после завершения работы программы, сразу возникает предположение, что в xHarbour где-то не вызывается деструктор.
В моей отдельной функции я использую переменные oExcel, oSheet и oRange.
Перед return всем им задал присваивание в nil - но Excel все равно остался жив, аки Дункан Маклауд.


 цитата:
Я, например, стараюсь не создавать несколько копий приложения, а если Excel уже загружен, то его и использовать.



Спасибо за совет, я тоже буду использовать такой прием. Это решит проблему.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1892
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.10.10 22:45. Заголовок: Pasha пишет: Перед ..


Pasha пишет:

 цитата:
Перед return всем им задал присваивание в nil - но Excel все равно остался жив, аки Дункан Маклауд.


Хорошо сравнил

Петр
Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 433
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 30.10.10 16:34. Заголовок: Pasha пишет: oSheet..


Pasha пишет:

 цитата:
oSheet := nil
oExcel := nil



Паш, еще нужен

oExcel:Quit

(советую по опыту Delphi, в Harbour не проверял)




Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1682
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.10.10 18:30. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
Паш, еще нужен

oExcel:Quit



У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание. Вопрос был в том, что после закрытия документа (и самого Excel) пользователем Excel тем не менее оставался в памяти.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1574
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.10.10 20:54. Заголовок: Pasha пишет: У меня..


Pasha пишет:

 цитата:
У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание.



Сделай по другому. Закрой Excel в программе, а пользователю открой документ через
ShellExecute(0, "open", "my.xls", , , 1 ) - только параметры не помню правильно какие...
Может поможет !


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1683
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.10.10 22:19. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделай по другому. Закрой Excel в программе, а пользователю открой документ через
ShellExecute(0, "open", "my.xls", , , 1 ) - только параметры не помню правильно какие...



Зачем же так неэффективно: два раза запускать Excel. К тому же я не сохраняю сформированный документ на диске. Дальнейшие действия с ним выполняет пользователь: он может его распечатать и закрыть, не сохраняя, может отредактировать и сохранить в нужной ему папке, или что-то другое
Да и Петр уже подсказал способ, как можно использовать уже запущенное приложение.
Пусть Excel остается в памяти, раз он такой непотопляемый, зато он будет только один


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 22
Зарегистрирован: 28.07.10
ссылка на сообщение  Отправлено: 31.10.10 15:08. Заголовок: Pasha пишет: У меня..


Pasha пишет:

 цитата:
У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание. Вопрос был в том, что после закрытия документа (и самого Excel) пользователем Excel тем не менее оставался в памяти.


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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1685
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 01.11.10 09:56. Заголовок: Окончательный вариан..


Окончательный вариант для xHarbour у меня получился такой:

hObj := GetOleObject( cServer )

if OleError() != 0
hObj := CreateOleObject( cServer )
endif
if OleError() == 0
oServer := TOleAuto():new( hObj )
hObj := nil
oServer:cClassName := cServer
else
MsgInfo("Ошибка инициализации " + cServer)
endif

В таком виде можно не использовать обработчик ошибок
Сразу выявилась маленькая особенность: Если уже был открыт какой-нибудь документ Excel, и программа формирует еще один, при закрытии 2-го окна Excel закрывается и первое.
Надо будет пользователей научить закрывать не приложение Excel, а только окно документа.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 36
Зарегистрирован: 09.09.11
ссылка на сообщение  Отправлено: 05.10.11 12:34. Заголовок: Добрый день, посмотр..


Добрый день, посмотрел тему, пока не понял текст кода "Окончательный вариант для xHarbour...."

Проблема в том, что в процессах остается Excel. Хотя стоят команды

    // закрытие для локального xls отчета
    oExcel :Quit()

      // закрытие сводного xls отчета, после копирования данных из локальных xls отчетов.
      oExcel_S:Quit()

      В процессах крутиться 2 или 3 копии Excel, при закрытии xHarbour программы Excel тоже закрывается.

      PS. При конвертации DBF файлов в XLS формат все процессы Excel правильно открываются и закрываются.
      фрагмент кода форматирования
      Dbf_File:=Mar12+File_dbf
      Xls_Copy:=Mar12+File_Ex
      oExcel :=ToleAuto():New( "Excel.Application" )
      oExcel :Visible := .F.
      oExcel :Workbooks:Open(Dbf_File)
      /// format cells
      oAs:SaveAs(Xls_Copy,Excel97_10)
      oExcel:Quit()
      таких обработок пока 10 шт.
      В этом алгоритме с процессами Excel проблем нет.
      oExcel:Quit() - это же Закрытие Копии Ecel?


      Спасибо: 0 
      ПрофильЦитата Ответить
      Администратор




      Пост N: 2117
      Зарегистрирован: 23.05.05
      ссылка на сообщение  Отправлено: 05.10.11 12:57. Заголовок: вместо oExcel :=Tol..


      вместо

      oExcel :=ToleAuto():New( "Excel.Application" )

      использую

      cServer := "Excel.Application"
      hObj := GetOleObject( cServer )

      if OleError() != 0
      hObj := CreateOleObject( cServer )
      endif
      if OleError() == 0
      oServer := TOleAuto():new( hObj )
      hObj := nil
      oServer:cClassName := cServer
      else
      MsgInfo("Ошибка инициализации " + cServer)
      endif

      ЗЫ в Harbour этот код пишется по-другому

      Спасибо: 0 
      ПрофильЦитата Ответить
      Ответ:
      1 2 3 4 5 6 7 8 9
      большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

      показывать это сообщение только модераторам
      не делать ссылки активными
      Имя, пароль:      зарегистрироваться    
      Тему читают:
      - участник сейчас на форуме
      - участник вне форума
      Все даты в формате GMT  3 час. Хитов сегодня: 199
      Права: смайлы да, картинки да, шрифты да, голосования нет
      аватары да, автозамена ссылок вкл, премодерация откл, правка нет