Форум » [x]Harbour » Закрытие Excel » Ответить

Закрытие Excel

Pasha: Делаем маленький тест: 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 остается в памяти и после закрытия программы. После работы с несколькими документами таких экселей там остается - мама не горюй. Вопрос: почему так может быть, и в каком месте копать, где применить шанцевый инструмент ?

Ответов - 12

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

Петр: Pasha пишет: Вопрос: почему Excel остается в памяти после закрытия Excel ? Dima пишет: Похожий пример с Word , работает нормально Все работает нормально - это фишка Excel. У него так реализован COM сервер. Он следит за вызвавшей его программой, вдруг ей опять обратится к этому самому Excel- у вздумается, а он уже тут как тут. Pasha пишет: После работы с несколькими документами таких экселей там остается - мама не горюй. Я, например, стараюсь не создавать несколько копий приложения, а если Excel уже загружен, то его и использовать. Примерно так [pre2]#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 [/pre2] Извиняюсь за запоздалый ответ, но под рукой не было xHb, чтобы пример проверить.

Pasha: Петр пишет: Все работает нормально - это фишка Excel. У него так реализован COM сервер. Он следит за вызвавшей его программой, вдруг ей опять обратится к этому самому Excel- у вздумается, а он уже тут как тут. Я примерно догадался о таком поведении Excel. Если в моем примере перед wait вставить: oSheet := nil oExcel := nil То Excel закрывается сразу после закрытия документа. Но в рабочей программе это не помогает. Поскольку Excel остается в памяти и после завершения работы программы, сразу возникает предположение, что в xHarbour где-то не вызывается деструктор. В моей отдельной функции я использую переменные oExcel, oSheet и oRange. Перед return всем им задал присваивание в nil - но Excel все равно остался жив, аки Дункан Маклауд. Я, например, стараюсь не создавать несколько копий приложения, а если Excel уже загружен, то его и использовать. Спасибо за совет, я тоже буду использовать такой прием. Это решит проблему.


Dima: Pasha пишет: Перед return всем им задал присваивание в nil - но Excel все равно остался жив, аки Дункан Маклауд. Хорошо сравнил Петр Спасибо !

Sergey Spirin: Pasha пишет: oSheet := nil oExcel := nil Паш, еще нужен oExcel:Quit (советую по опыту Delphi, в Harbour не проверял)

Pasha: Sergey Spirin пишет: Паш, еще нужен oExcel:Quit У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание. Вопрос был в том, что после закрытия документа (и самого Excel) пользователем Excel тем не менее оставался в памяти.

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

Pasha: Andrey пишет: Сделай по другому. Закрой Excel в программе, а пользователю открой документ через ShellExecute(0, "open", "my.xls", , , 1 ) - только параметры не помню правильно какие... Зачем же так неэффективно: два раза запускать Excel. К тому же я не сохраняю сформированный документ на диске. Дальнейшие действия с ним выполняет пользователь: он может его распечатать и закрыть, не сохраняя, может отредактировать и сохранить в нужной ему папке, или что-то другое Да и Петр уже подсказал способ, как можно использовать уже запущенное приложение. Пусть Excel остается в памяти, раз он такой непотопляемый, зато он будет только один

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

Pasha: Окончательный вариант для 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, а только окно документа.

Oskar_AAA: Добрый день, посмотрел тему, пока не понял текст кода "Окончательный вариант для 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?

Pasha: вместо 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 этот код пишется по-другому



полная версия страницы