Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Завершение процесса Excel из Delphi / 25 сообщений из 52, страница 1 из 3
17.03.2004, 00:01
    #32444529
brighton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Есть такая проблема: в Delphi-форме - объект OleContainer, в него выгружается содержимое рабочей книги Excel. После просмотра того, что выгрузилось, форма закрывается. Но вот вопрос - каким образом завершить процесс Excel, потому что после закрытия формы Excel.exe продолжает занимать память...
...
Рейтинг: 0 / 0
17.03.2004, 09:59
    #32444780
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
finally
if not VarIsEmpty(XLApp) then
begin
XLApp.Quit;
end;
...
Рейтинг: 0 / 0
17.03.2004, 10:03
    #32444788
Denis Uskov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
+
FreeAndNil(XLApp);
после Quit
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
17.03.2004, 11:27
    #32445035
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Была у меня год назад такая же проблема. И всё то, что описали выше не работало. Что я только не делал: и Квит, и ФриЭндНил, и Клоус. В большинстве случаев не работало.
Прошу не начинать сейчас бранить меня за правду!
Было. ПРикольная ситуация, Екселей нет, а впроцессах их тьма.
То я написал процедуру, которая перебирала все процессы с названием "Microsoft Excel" и у которых нет окон (тоесть следы Екселя). И потом ТерминейтПроцесс.
К сожалению под рукой нет процедуры.
...
Рейтинг: 0 / 0
17.03.2004, 11:46
    #32445079
Grigoriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
+
FreeAndNil(XLApp);
после Quit
да, не указал:
XLAPP := Unassigned;
Sheet := Unassigned;

А вот как эта конструкция могла не работать? Где постоянство в жизни...
...
Рейтинг: 0 / 0
17.03.2004, 14:26
    #32445467
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
2 Andriy Tysh:
Работать мог только Quit (не Close и не FreeAndNil). И обязательно перед ним надо было либо как-то закрывать все окна, либо выполнять DisplayAlerts:=False; Иначе Excel мог пытаться спросить Ваше мнение по поводу записи модифицированных таблиц (или оставшегося Clipboard с данными). В режиме OLE-сервера на этом все заканчивалось, Excel оставался висеть в процессах.
...
Рейтинг: 0 / 0
17.03.2004, 14:38
    #32445504
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
А я знаю как!
Терпите, сейчас найду, только проект откопаю.
...
Рейтинг: 0 / 0
17.03.2004, 14:54
    #32445542
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Немножко соврал, не совсем то, что хочешь... Ну да ладно, про TOleContainer's, думаю, людям тоже интересно будет:

- на форме TrepX_BaseReport лежат три компонента:

Код: plaintext
1.
2.
    exApp: TExcelApplication;
    exWB: TExcelWorkbook;
    exWS: TExcelWorksheet; 


Так вот, установленные свойства:

для exApp
Код: plaintext
1.
2.
    AutoConnect = False
    ConnectKind = ckNewInstance
    AutoQuit = False

для exWB

Код: plaintext
1.
    AutoConnect = False
    ConnectKind = ckRunningOrNew


для exWs

Код: plaintext
1.
    AutoConnect = False
    ConnectKind = ckRunningOrNew


Создается форма, в диалоге которой задаются параметры отчета:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class function TrepX_BaseReport.ShowReport(id_Inp : Integer): Integer;
begin
  with Self.Create(Application) do
  try
    FId := id_Inp;
    if ShowModal = mrOk then
      DoExcel; // Запускаем Excel
    finally
      Free;
  end
end;


Все самое главное - тут:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
procedure TrepX_BaseReport.DoExcel;
begin
try
  try
    fMain.stbarMain.Panels[ 2 ].Text := 'Excel - подключение ...'; // фигня разная    Application.ProcessMessages;
    exApp.Connect;
    exApp.Application.EnableEvents := false; // Ускоряем
    fMain.stbarMain.Panels[ 2 ].Text := 'Excel - новая книга ...';
    Application.ProcessMessages;
    exApp.SheetsInNewWorkbook[ 0 ] :=  1 ;
    exApp.Workbooks.Add(EmptyParam{xlWBATWorksheet}, 0 );
    exWB.ConnectTo(exApp.ActiveWorkbook);
    exWS.ConnectTo(exWB.Sheets[ 1 ] as _Worksheet);
  except
    on E : Exception do begin
      ShowMessage('Ошибка активизации приложения Microsoft Excel. '+
       E.Message);
     exit
    end;
  end;

  try
    BuildReport; // Тут где-то строится отчет
  except // Авария!
    on E : Exception do begin
      ShowMessage('Ошибка создания отчета в Microsoft Excel. '+
       E.Message);
      if Assigned(exApp) then
        if (exApp.Workbooks.Count >  0 ) then // Вот здесь!!
          exApp.AutoQuit := True; // Пусть не зависает фигня в системе!
     exit
    end;
  end

finally
 ...
  fMain.stbarMain.Panels[ 2 ].Text := 'Excel - отключение ...';
  Application.ProcessMessages;
  fMain.stbarMain.Panels[ 2 ].Text := '';

end;

end;


Самая главная строчка -
exApp.AutoQuit := True;

Ну, а если аварии не было, то делаем Excel видимым, и позволяем юзеру закрывать его, когда вздумается!
...
Рейтинг: 0 / 0
17.03.2004, 14:55
    #32445545
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Я вот так мочу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$ 0001 ;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result :=  0 ;

  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS,  0 );
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);

  while integer(ContinueLoop) <>  0  do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL( 0 ),
                        FProcessEntry32.th32ProcessID),  0 ));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;

  CloseHandle(FSnapshotHandle);
end;

.......
KillTask('excel.exe');


...
Рейтинг: 0 / 0
17.03.2004, 15:13
    #32445587
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
KillTask('excel.exe'); - это классно, конечно...

А если ты породил несколько сессий Excel-ей, а убить надо только те, при которых ошибка приключилась?
Может, для твоего варианта запускать его (Excel) каждый раз с унакальными именами, а потом по ним убавать?
...
Рейтинг: 0 / 0
17.03.2004, 15:35
    #32445653
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
В моем случае побарабану было...Просто создавал кучу файлов, а потом прибивал ексели. В моем случае из 30-40 открытых-закрытых процессов 1-2 обязательно оставались висеть в памяти. Просто не было времени разбираться в проблеме. А выходил я так
Код: plaintext
1.
2.
3.
      v.ActiveWorkbook.SaveAs(s+'\razdel3_'+inttostr(x)+'.xls');
      v.ActiveWorkbook.Close;
      v := UnAssigned;

Когда создается 1,2 файла таких проблем не было.

Надо будет AutoQuit попробовать...

...
Рейтинг: 0 / 0
17.03.2004, 17:48
    #32446009
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
В Variant где хранится ссылка на Word.Application (ну или Excel) присвоить EmptyParam, после убивания по Quit.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
07.11.2007, 09:12
    #34920742
burton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Вариант vimana хотелось бы дополнить. Дело в том, что действительно, при "убийстви процессов" происходит терминэйт всех EXCEL (Это уже было отмечено MV). Как один из вариантов - это после успешного создания XlsApp и открытия книги, сразу запомнить ID процесса, который в свою очередь будет последним EXCELевским процессом. Для этого потребуется всего навсего переписать ф-ию KillTask так, чтобы она возвращала значение типа TProcessEntry32.

Что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 function  TForm1.GetProcessId: TProcessEntry32;
 const 
  PROCESS_TERMINATE=$ 0001 ;
 var 
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
 begin 
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0 );
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);

   while  integer(ContinueLoop) <>  0   do 
   begin 
     if  ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase('excel.exe'))
      or  (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase('excel.exe')))  then 
      Result := FProcessEntry32;
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
   end ;

  CloseHandle(FSnapshotHandle);
 end ;
Получится, что ф-ия вернет ID последнего процесса.
Таким образом, вырубить процесс удастся по конкретному FProcessEntry32.th32ProcessID, типа:
Код: plaintext
1.
2.
  TerminateProcess(OpenProcess
                         (PROCESS_TERMINATE, BOOL( 0 ), FProcessEntryExcel.th32ProcessID),  0 );
Сам затестил - работает)))
...
Рейтинг: 0 / 0
07.11.2007, 09:13
    #34920743
burton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Вариант vimana хотелось бы дополнить. Дело в том, что действительно, при "убийстви процессов" происходит терминэйт всех EXCEL (Это уже было отмечено MV). Как один из вариантов - это после успешного создания XlsApp и открытия книги, сразу запомнить ID процесса, который в свою очередь будет последним EXCELевским процессом. Для этого потребуется всего навсего переписать ф-ию KillTask так, чтобы она возвращала значение типа TProcessEntry32.

Что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 function  TForm1.GetProcessId: TProcessEntry32;
 const 
  PROCESS_TERMINATE=$ 0001 ;
 var 
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
 begin 
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0 );
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);

   while  integer(ContinueLoop) <>  0   do 
   begin 
     if  ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase('excel.exe'))
      or  (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase('excel.exe')))  then 
      Result := FProcessEntry32;
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
   end ;

  CloseHandle(FSnapshotHandle);
 end ;
Получится, что ф-ия вернет ID последнего процесса.
Таким образом, вырубить процесс удастся по конкретному FProcessEntry32.th32ProcessID, типа:
Код: plaintext
1.
2.
  TerminateProcess(OpenProcess
                         (PROCESS_TERMINATE, BOOL( 0 ), FProcessEntryExcel.th32ProcessID),  0 );
Сам затестил - работает)))
...
Рейтинг: 0 / 0
07.11.2007, 17:23
    #34922991
Megabyte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Во извращенцы))) Закрытие делается одной командой(Quit вроде и есть, не помню, исходники дома есть). Сам раньше про нее не знал и мучился с кучей процессов, потом умные люди подсказали.
...
Рейтинг: 0 / 0
19.11.2007, 15:21
    #34949190
Paty_dj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
у меня вообщем такая же проблемка, убиваю процесс Quit ни*рена не получается. Вариант с убитем всех процессов не подходит, так как на машине пользователя возможно будут открыты другие экселевские документы.

Kill f***** Excel process
...
Рейтинг: 0 / 0
19.11.2007, 15:53
    #34949317
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Я думаю, убивать процесс - это извращение.
Я сперва делал Quit и освобождал переменные. Все работало.
Потом показалось некрасиво, неизвестно, когда пользователь наглядится на отчет, плюс неизвестно, сохранил он его, или нет, приходилось делать проверку на неосвобожденность переменных Excel'я при выходе из программы, начал делать так:
Создаю отчет, сохраняю в профиле ползователя, закрываю Excel (OLE), открываю сохраненный отчет с помощью ShellExecute. Захочет - пересохранит. Чуть медленней, зато сердито. Никаких лишних процессов.
...
Рейтинг: 0 / 0
19.11.2007, 16:05
    #34949361
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Создание отчета, есессно, при App.Visible := False
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.10.2013, 13:24
    #38431150
Lizard17rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Уважаемые!
Убился ужо в конец........................

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
uses
...., ComObj;


procedure TfrmMainForm.DataLoad(FileName: string; arFile: Pointer);
var
  XL, Workbook, Sheet: OleVariant;
begin
    XL := CreateOleObject('Excel.Application');
    XL.DisplayAlerts := False;
    XL.Visible := True;
    Workbook := XL.WorkBooks.Open(FileName);
    Sheet := Workbook.WorkSheets[1];
....
    Sheet := Unassigned;
    Workbook.Close;
    Workbook := Unassigned;
    XL.Quit;
    XL := Unassigned;
end;


И все равно Excel висит(!) в процессах до закрытия приложения.
Перепробывал всё и вся, гугл уже не знает что подсказать.
...
Рейтинг: 0 / 0
17.10.2013, 13:36
    #38431183
Dmitri Krizhanovski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Lizard17rus,

У меня этот код отработал нормально и Excel-я в процессах нет.
Вместо ..... я написАл Sleep(1000)
...
Рейтинг: 0 / 0
17.10.2013, 14:02
    #38431231
Lizard17rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
балиииииин(((((((((((((((((((
Пока свою прогу не закрою - в процессах торчит.
Embercadero XE3
А сам на чем компилил?
...
Рейтинг: 0 / 0
17.10.2013, 14:13
    #38431260
Dmitri Krizhanovski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Lizard17rus,

Это стандартный код. Работал у меня на всех версиях до XE включительно.

А если XL.DisplayAlerts := True? Ничего не показывает?
Воспроизводится, если не делать Workbook := XL.WorkBooks.Open(FileName)?
А на новом проекте тоже воспроизводится?
...
Рейтинг: 0 / 0
17.10.2013, 14:15
    #38431268
Lizard17rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
Жесть((
Решил опробировать свой же приведенный код. В таком виде - да - все норм. как только пускаю с обработкой данных - привет.
...
Рейтинг: 0 / 0
17.10.2013, 14:19
    #38431284
Lizard17rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
вот вся процедура полностью

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
procedure TfrmMainForm.DataLoad(FileName: string; arFile: Pointer);
var
  XL, Workbook, Sheet: OleVariant;
  str: string;
  RefStyle, x, y, rows: Integer;
  ar: array of array[0..12] of string;
const
  head: Integer = 3;
begin
  try
    rows := 0;
    XL := CreateOleObject('Excel.Application');
    XL.DisplayAlerts := False;
    XL.Visible := True;
    RefStyle := XL.ReferenceStyle;
    XL.ReferenceStyle := -4150;
    Workbook := XL.WorkBooks.Open(FileName);
    Sheet := Workbook.WorkSheets[1];
    Sheet.Cells.Replace(What:='«', Replacement:='"');
    Sheet.Cells.Replace(What:='»', Replacement:='"');
    repeat
      Inc(rows);
      str := Sheet.Cells[rows+head, 1];
    until str = '';
    Dec(rows);
    Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]].UnMerge;
    Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]].Sort(Key1:=Sheet.Columns[3], Order1:=1, Key2:=Sheet.Columns[9], Key3:=Sheet.Columns[10]);
    Pointer(ar) := arFile;
    SetLength(ar, rows);
    for y := head+1 to head+rows do
      for x := 1 to 12 do
        begin
          ar[y-head-1,x-1] := Sheet.Cells[y, x];
        end;
    ar := nil;
    XL.ReferenceStyle := RefStyle;
    Sheet := Unassigned;
    Workbook.Close;
    Workbook := Unassigned;
    XL.Quit;
    XL := Unassigned;
  except

  end;
end;
...
Рейтинг: 0 / 0
17.10.2013, 14:29
    #38431308
Lizard17rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение процесса Excel из Delphi
решил подключать обработку кусками и выяснить на каком этапе происходит затык.
нашел....
Код: pascal
1.
2.
Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]].UnMerge;
 Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]].Sort(Key1:=Sheet.Columns[3], Order1:=1, Key2:=Sheet.Columns[9], Key3:=Sheet.Columns[10]);



сортировка.....
еле-еле ее смог прикрутить, а она торчит.
умеет кто делать сортировку по 3 столбцам?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Завершение процесса Excel из Delphi / 25 сообщений из 52, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]