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

А вот как эта конструкция могла не работать? Где постоянство в жизни...
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #32445467
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andriy Tysh:
Работать мог только Quit (не Close и не FreeAndNil). И обязательно перед ним надо было либо как-то закрывать все окна, либо выполнять DisplayAlerts:=False; Иначе Excel мог пытаться спросить Ваше мнение по поводу записи модифицированных таблиц (или оставшегося Clipboard с данными). В режиме OLE-сервера на этом все заканчивалось, Excel оставался висеть в процессах.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #32445504
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я знаю как!
Терпите, сейчас найду, только проект откопаю.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #32445542
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немножко соврал, не совсем то, что хочешь... Ну да ладно, про 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
Завершение процесса Excel из Delphi
    #32445545
Фотография viman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот так мочу:
Код: 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
Завершение процесса Excel из Delphi
    #32445587
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KillTask('excel.exe'); - это классно, конечно...

А если ты породил несколько сессий Excel-ей, а убить надо только те, при которых ошибка приключилась?
Может, для твоего варианта запускать его (Excel) каждый раз с унакальными именами, а потом по ним убавать?
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #32445653
Фотография viman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем случае побарабану было...Просто создавал кучу файлов, а потом прибивал ексели. В моем случае из 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
Завершение процесса Excel из Delphi
    #32446009
Sclif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Variant где хранится ссылка на Word.Application (ну или Excel) присвоить EmptyParam, после убивания по Quit.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Завершение процесса Excel из Delphi
    #34920742
burton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант 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
Завершение процесса Excel из Delphi
    #34920743
burton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант 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
Завершение процесса Excel из Delphi
    #34922991
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во извращенцы))) Закрытие делается одной командой(Quit вроде и есть, не помню, исходники дома есть). Сам раньше про нее не знал и мучился с кучей процессов, потом умные люди подсказали.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #34949190
Paty_dj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня вообщем такая же проблемка, убиваю процесс Quit ни*рена не получается. Вариант с убитем всех процессов не подходит, так как на машине пользователя возможно будут открыты другие экселевские документы.

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

Код: 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
Завершение процесса Excel из Delphi
    #38431183
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rus,

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

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

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

Код: 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
Завершение процесса Excel из Delphi
    #38431308
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
решил подключать обработку кусками и выяснить на каком этапе происходит затык.
нашел....
Код: 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
Завершение процесса Excel из Delphi
    #38431329
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
такое чувство, что ему не сортировка ненравится, а Sheet.Range
как будто новая ссылка на документ, которая не дестроилась, и соответственно не отпускает процесс. что делать?
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431337
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rus,

Попробуй добавить переменную Rng по типу XL, Workbook, Sheet: OleVariant; использовать ее в сортировке:
Код: pascal
1.
2.
3.
Rng := Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]];
Rng.UnMerge;
Rng.Sort(Key1:=Sheet.Columns[3], Order1:=1, Key2:=Sheet.Columns[9], Key3:=Sheet.Columns[10]);


и в конце
Rng := Unassigned;
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431341
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rusтакое чувство, что ему не сортировка ненравится, а Sheet.Range
как будто новая ссылка на документ, которая не дестроилась, и соответственно не отпускает процесс. что делать?А вдруг ты прав?
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431358
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не проканало((
зато точно не в сортировке дело.

Код: 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.
procedure TfrmMainForm.DataLoad1(FileName: string);
var
XL, Workbook, Sheet, Rng: OleVariant;
str: string;
RefStyle, x, y, rows: Integer;
ar: array of array[0..12] of string;
const
head: Integer = 3;
begin
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);
Rng := Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]];
Rng.UnMerge;
//Rng.Sort(Key1:=Sheet.Columns[3], Order1:=1, Key2:=Sheet.Columns[9], Key3:=Sheet.Columns[10]);
Sleep(10000);
XL.ReferenceStyle := RefStyle;
Rng := Unassigned;
Sheet := Unassigned;
Workbook.Close;
Workbook := Unassigned;
XL.Quit;
XL := Unassigned;
end;


щас буду всеми способами убивать Rng
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431373
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rus,

Попробуй убрать Workbook.Close;, а вместо XL.Quit напиши
Код: pascal
1.
XL.Quit( SaveChanges := 0 {wdDoNotSaveChanges} )
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431398
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
грит нет такого метода.
но алерты выключены, поэтому сразу закроет без запросов и соответственно без сохранения.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431407
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у тебя этот код отрабатывает нормально? или тоже с выкрутасами?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure TfrmMainForm.DataLoad1(FileName: string);
var
XL, Workbook, Sheet, Rng: OleVariant;
str: string;
RefStyle, x, y, rows: Integer;
const
head: Integer = 3;
begin
XL := CreateOleObject('Excel.Application');
XL.DisplayAlerts := False;
XL.Visible := True;
Workbook := XL.WorkBooks.Open(FileName);
Sheet := Workbook.WorkSheets[1];
rows := 5;
Rng := Sheet.Range[Sheet.Cells[head+1, 1], Sheet.Cells[head+rows, 12]];
Rng.UnMerge;
//Sleep(10000);
Rng := Unassigned;
Sheet := Unassigned;
Workbook := Unassigned;
XL.Quit;
XL := Unassigned;
end;



Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431416
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так прокатило
Rng := Sheet.Range['A4:L8'];
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431423
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rusу тебя этот код отрабатывает нормально? или тоже с выкрутасами?Нормально.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431435
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitri KrizhanovskiLizard17rusу тебя этот код отрабатывает нормально? или тоже с выкрутасами?Нормально.
рву на голове волосы
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431680
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел я в чем проблема.
запись Sheet.Range['A1:L8']; не равна записи Sheet.Range['A'+IntToStr(1)+':L'+IntToStr(8)];
надо как-то типы преобразовать.
помнится было что-то из серии string и char.
сил уже нету по инету лазить искать, а на память не помню.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38431695
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее нужно сначала определить какой тип данных нужно передавать в Range и к нему привести слагаемые
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38432114
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rusИ все равно Excel висит(!) в процессах до закрытия приложения.
http://www.sql.ru/forum/888543/pochemu-eksel-zavershaetsya-tolko-posle-couninitialize
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38432115
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rusсортировка.....
еле-еле ее смог прикрутить, а она торчит.
умеет кто делать сортировку по 3 столбцам?Сам Excel умеет.
Запиши макро и реализуй на Delphi.
Ещё ADO можно прикрутить :)
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38432254
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gator - спасибо. это решение помогло.
Dmitri Krizhanovski - тоже огромный респ за вклад

ИТОГО - Нормально закрыть Excel в работе:

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

var
XL, Workbook, Sheet, Rng: OleVariant;
begin
CoInitialize(nil);
XL := CreateOleObject('Excel.Application');
Workbook := XL.WorkBooks.Open(FileName);
Sheet := Workbook.WorkSheets[1];
Rng := Sheet.Range['A'+IntToStr(1+head)+':L'+IntToStr(rows+head)];
//но не
//Rng := Sheet.Range[Sheet.Cells[4, 1], Sheet.Cells[8, 12]];
...
Rng := Unassigned;
Sheet := Unassigned;
Workbook.Close;
Workbook := Unassigned;
XL.Quit;
XL := Unassigned;
CoUnInitialize;
end;



Вопрос можно закрывать
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38432370
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard17rus,

И вопрос напоследок. У тебя это консольное приложение?
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38432377
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может кому пригодиться, чтобы сортировка не мешала

Код: 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.
var
  XL, Workbook, Sheet, Range, SortKey: OleVariant;

....
Range := Sheet.Range['A'+IntToStr(1+head)+':L'+IntToStr(rows+head)];
    Range.UnMerge;
    Sheet.Sort.SortFields.Clear;
    SortKey := Sheet.Range['C'+IntToStr(1+head)];
    Sheet.Sort.SortFields.Add(Key:=SortKey, SortOn:=0, Order:=1, DataOption:=0);
    SortKey := Sheet.Range['E'+IntToStr(1+head)];
    Sheet.Sort.SortFields.Add(Key:=SortKey, SortOn:=0, Order:=1, DataOption:=0);
    SortKey := Sheet.Range['J'+IntToStr(1+head)];
    Sheet.Sort.SortFields.Add(Key:=SortKey, SortOn:=0, Order:=1, DataOption:=0);
    Sheet.Sort.SetRange(Range);
    Sheet.Sort.Apply;
....
SortKey := Unassigned;
    Range := Unassigned;
    Sheet := Unassigned;
    Workbook.Close;
    Workbook := Unassigned;
    XL.Quit;
    XL := Unassigned;
    CoUnInitialize;
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #38432399
Lizard17rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitri KrizhanovskiLizard17rus,

И вопрос напоследок. У тебя это консольное приложение?
VCL
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Завершение процесса Excel из Delphi
    #39396907
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему. Столкнулся со схожей проблемой.

Есть процедура, которая выводит на печать экселевский файл.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TFmJournal.PrintExcelFile(FileName: String; Copies: Integer; Preview: Boolean);
var ExcelApp: Olevariant;
begin
//   CoInitialize(nil);
   ExcelApp := CreateOleObject('Excel.Application');
   try
      ExcelApp.Visible:=Preview;
      ExcelApp.Workbooks.Open(FileName);
      ExcelApp.Worksheets.PrintOut(EmptyParam,EmptyParam,Copies,Preview);
   finally
//         ExcelApp.Workbooks.Close;
//         ExcelApp.Workbooks:=Unassigned;
         ExcelApp.Quit;
         ExcelApp:=Unassigned;
//         CoUnInitialize;
   end;
end;



Так вот если печатать файл без предпросмотра(preview=false), то всё ок. Если же показать, окно предпросмотра то после печати и закрытия экселя, процесс остается висеть в памяти.
Уже всё перепробовал. Остается вариант убивать процесс?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Завершение процесса Excel из Delphi
    #39875154
Фотография viman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет через 15 лет )
Да, убивать процесс. Почему бы и нет. Я создавал сотни документов в несколько потоков и обязательно на 100 процессов 1-2 повисали. Бился тоже сначала, а потом стал просто прибивать эксель полностью. Очень действенно :)
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39875230
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vimanпотом стал просто прибивать эксель полностью
Молодец, пользователи это оценят.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39875290
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDivimanпотом стал просто прибивать эксель полностью
Молодец, пользователи это оценят.
А что делать, если так коряво спроектировано. Я в таком случае просто проверял запущенность Экселя до начала процесса и требовал, чтобы юзер его закрыл сам.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39875381
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExterisТак вот если печатать файл без предпросмотра(preview=false), то всё ок. Если же показать, окно предпросмотра то после печати и закрытия экселя, процесс остается висеть в памяти.
Если сделать Excel.DisplayAlerts := false, Excel.EnableEvents := false, то перестаёт оставаться. Во всяком случае, у меня после этого, как правило, проблем нет. В некоторых случаях стоит повторить это - есть операции (например, Workbooks.Add), после которых эти настройки почему-то сбрасываются.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39875440
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2А что делать, если так коряво спроектировано. Я в таком случае просто проверял запущенность Экселя до начала процесса и требовал, чтобы юзер его закрыл сам.
Когда после работы программы эксель/ворд продолжают висеть -- обычно это говорит о какой-то ошибке в работе программы или ее логике. Например, не был закрыт корректно экземпляр экселя при возникновении ошибки, или поток закрылся раньше времени (при завершении он меняет какой-то статус, а его кто-то убивает извне, но еще до того, как эксель будет закрыт).
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39875731
Фотография viman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, прога генерила письма в ворде, тысячи вордовских файлов. Пользователь один - я
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39875855
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiКогда после работы программы эксель/ворд продолжают висеть -- обычно это говорит о какой-то ошибке в работе программы или ее логике. Например, не был закрыт корректно экземпляр экселя при возникновении ошибки, или поток закрылся раньше времени (при завершении он меняет какой-то статус, а его кто-то убивает извне, но еще до того, как эксель будет закрыт).
Согласен, поэтому приходилось прибивать ёксель жесткими методами.
...
Рейтинг: 0 / 0
Завершение процесса Excel из Delphi
    #39882332
dimaz137
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lizard17rus,
Если обращаться к индексам Range, то чтобы процесс убился ао команде Excel.Quit, а не по завершению приложения, в скобках должны стоять переменные, а не выражения.
Рабочий код такой:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var  r, c : Integer;
      Cell1, Cell2 : OLEVariant;
      VarMas : Variant;
begin
...
Cell1:=Sheet.Cells.Item[2, 1];
Cell2:=Sheet.Cells.Item[r, c];
VarMas := Sheet.Range[Cell1, Cell2].Value;
...
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Завершение процесса Excel из Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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