Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
такое чувство, что ему не сортировка ненравится, а Sheet.Range
как будто новая ссылка на документ, которая не дестроилась, и соответственно не отпускает процесс. что делать?
17 окт 13, 14:37    [14985638]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 496
Lizard17rus,

Попробуй добавить переменную Rng по типу XL, Workbook, Sheet: OleVariant; использовать ее в сортировке:
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;
17 окт 13, 14:39    [14985654]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 496
Lizard17rus
такое чувство, что ему не сортировка ненравится, а Sheet.Range
как будто новая ссылка на документ, которая не дестроилась, и соответственно не отпускает процесс. что делать?
А вдруг ты прав?
17 окт 13, 14:40    [14985663]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
не проканало((
зато точно не в сортировке дело.

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

Сообщение было отредактировано: 17 окт 13, 20:40
17 окт 13, 14:46    [14985729]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 496
Lizard17rus,

Попробуй убрать Workbook.Close;, а вместо XL.Quit напиши
XL.Quit( SaveChanges := 0 {wdDoNotSaveChanges} )
17 окт 13, 14:54    [14985789]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
грит нет такого метода.
но алерты выключены, поэтому сразу закроет без запросов и соответственно без сохранения.
17 окт 13, 15:06    [14985864]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
у тебя этот код отрабатывает нормально? или тоже с выкрутасами?

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 для оформления кода, пожалуйста.


Сообщение было отредактировано: 17 окт 13, 20:41
17 окт 13, 15:11    [14985900]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
вот так прокатило
Rng := Sheet.Range['A4:L8'];
17 окт 13, 15:17    [14985943]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 496
Lizard17rus
у тебя этот код отрабатывает нормально? или тоже с выкрутасами?
Нормально.
17 окт 13, 15:20    [14985969]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
Dmitri Krizhanovski
Lizard17rus
у тебя этот код отрабатывает нормально? или тоже с выкрутасами?
Нормально.

рву на голове волосы
17 окт 13, 15:25    [14986013]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
нашел я в чем проблема.
запись Sheet.Range['A1:L8']; не равна записи Sheet.Range['A'+IntToStr(1)+':L'+IntToStr(8)];
надо как-то типы преобразовать.
помнится было что-то из серии string и char.
сил уже нету по инету лазить искать, а на память не помню.
17 окт 13, 17:41    [14987132]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
точнее нужно сначала определить какой тип данных нужно передавать в Range и к нему привести слагаемые
17 окт 13, 17:49    [14987171]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Lizard17rus
И все равно Excel висит(!) в процессах до закрытия приложения.

https://www.sql.ru/forum/888543/pochemu-eksel-zavershaetsya-tolko-posle-couninitialize
17 окт 13, 23:41    [14988455]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Lizard17rus
сортировка.....
еле-еле ее смог прикрутить, а она торчит.
умеет кто делать сортировку по 3 столбцам?
Сам Excel умеет.
Запиши макро и реализуй на Delphi.
Ещё ADO можно прикрутить :)
17 окт 13, 23:44    [14988462]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
Gator - спасибо. это решение помогло.
Dmitri Krizhanovski - тоже огромный респ за вклад

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

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;


Вопрос можно закрывать

Сообщение было отредактировано: 20 окт 13, 03:29
18 окт 13, 08:50    [14995345]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 496
Lizard17rus,

И вопрос напоследок. У тебя это консольное приложение?
18 окт 13, 10:17    [14995995]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
может кому пригодиться, чтобы сортировка не мешала

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;


Сообщение было отредактировано: 20 окт 13, 03:29
18 окт 13, 10:21    [14996030]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Lizard17rus
Member

Откуда:
Сообщений: 21
Dmitri Krizhanovski
Lizard17rus,

И вопрос напоследок. У тебя это консольное приложение?

VCL
18 окт 13, 10:29    [14996092]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Завершение процесса Excel из Delphi  [new]
Exteris
Member

Откуда: Новосибирск
Сообщений: 985
Подниму тему. Столкнулся со схожей проблемой.

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

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), то всё ок. Если же показать, окно предпросмотра то после печати и закрытия экселя, процесс остается висеть в памяти.
Уже всё перепробовал. Остается вариант убивать процесс?
2 фев 17, 07:39    [20171808]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Завершение процесса Excel из Delphi  [new]
viman
Member

Откуда: Тамбов
Сообщений: 1111
Всем привет через 15 лет )
Да, убивать процесс. Почему бы и нет. Я создавал сотни документов в несколько потоков и обязательно на 100 процессов 1-2 повисали. Бился тоже сначала, а потом стал просто прибивать эксель полностью. Очень действенно :)
11 окт 19, 13:10    [21992085]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4096
viman
потом стал просто прибивать эксель полностью

Молодец, пользователи это оценят.
11 окт 19, 14:27    [21992176]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
Василий 2
Member

Откуда:
Сообщений: 804
JaDi
viman
потом стал просто прибивать эксель полностью

Молодец, пользователи это оценят.

А что делать, если так коряво спроектировано. Я в таком случае просто проверял запущенность Экселя до начала процесса и требовал, чтобы юзер его закрыл сам.
11 окт 19, 15:25    [21992271]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 59390
Блог
Exteris
Так вот если печатать файл без предпросмотра(preview=false), то всё ок. Если же показать, окно предпросмотра то после печати и закрытия экселя, процесс остается висеть в памяти.

Если сделать Excel.DisplayAlerts := false, Excel.EnableEvents := false, то перестаёт оставаться. Во всяком случае, у меня после этого, как правило, проблем нет. В некоторых случаях стоит повторить это - есть операции (например, Workbooks.Add), после которых эти настройки почему-то сбрасываются.
11 окт 19, 17:00    [21992403]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4096
Василий 2
А что делать, если так коряво спроектировано. Я в таком случае просто проверял запущенность Экселя до начала процесса и требовал, чтобы юзер его закрыл сам.

Когда после работы программы эксель/ворд продолжают висеть -- обычно это говорит о какой-то ошибке в работе программы или ее логике. Например, не был закрыт корректно экземпляр экселя при возникновении ошибки, или поток закрылся раньше времени (при завершении он меняет какой-то статус, а его кто-то убивает извне, но еще до того, как эксель будет закрыт).
11 окт 19, 19:20    [21992514]     Ответить | Цитировать Сообщить модератору
 Re: Завершение процесса Excel из Delphi  [new]
viman
Member

Откуда: Тамбов
Сообщений: 1111
JaDi, прога генерила письма в ворде, тысячи вордовских файлов. Пользователь один - я
13 окт 19, 23:25    [21993286]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Delphi Ответить