С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Aleklon
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 16
1

Не закрываются офисные потоки (excel, word)

20.05.2017, 21:25. Просмотров 442. Ответов 10
Метки нет (Все метки)

Здравствуйте. Обнаружил что при открытии большого количества файлов, после кода:
Delphi
1
2
3
  
  Excel.Application.Quit;
  Excel := Unassigned;
процесс все равно висит в диспетчере задач и закрывается только с закрытием программы. Могу ошибаться, но подобное как-то решалось с выносом в отдельную функцию, но сейчас проверил, так не пашет, висят десятки процессов и открываются новые.
Можете подсказать что с ними делать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2017, 21:25
Ответы с готовыми решениями:

Перенесение таблиц в Word\Excel
Скажите, как перенести таблицу StringGrid в Word\Excel? Напишите, пожалуйста,...

Компоненты для экпорта в Word, Excel
Ищу компоненты для экпорта в Word, Excel. Где в Инете можно скачать (URL если...

Прога - Буфер обмена - Word, Excel.
Всех приветствую! Вопрос такой. Как подсказать Ворду и Экселю, что данные в...

Word/Excel
Добрый день. Есть таблица на гл. форме, созданная в Database Desktop. Как мне в...

Экспорт в Word и Excel
Можно ли при экспорте в Ворд или Ексель данных из набора данных (который в...

10
krapotkin
3491 / 3083 / 1063
Регистрация: 14.04.2014
Сообщений: 14,893
Записей в блоге: 15
20.05.2017, 22:57 2
составить тестовый пример и выложить, чтобы можно было проверить
0
qwertehok
2325 / 2226 / 606
Регистрация: 29.08.2013
Сообщений: 14,930
21.05.2017, 00:51 3
не закрывается потому что не освобождается
не освобождается потому что используется

загляните в поиск - такое уже обсуждалось
0
Aleklon
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 16
21.05.2017, 04:33  [ТС] 4
Сам код упрощенный

Delphi
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
46
47
48
// основной код. Открываем один файл в Excel и потом перебираем другие, добавляя в него
 
  LoadExcelFile(dir+'\main.xlsx');
  fromr:=Excel.ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count+1;
 
  for i := 0 to from.Count-1 do
  begin
    AddLog(IntToStr(i+1)+'/'+IntToStr(from.Count)+' Файл '+from.Strings[i]);
    try
      Mmex(i, fromr);
    except
      break;
    end;
  end;
 
 
// ну и функция. Открыли файл, добавили в основной, закрыли
 
procedure TForm1.MMEx(i: integer; var fromr: integer);
begin
   LoadExcelFile2(from.Strings[i]); 
   kol:=Excel2.ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count;
   Excel2.Range[Excel2.Cells.Item[2, 1], Excel2.Cells.Item[kol, 23]].Select;
   Excel2.Selection.Copy;
   Excel.ActiveSheet.Cells[fromr,1].Select;
   Excel.ActiveSheet.Paste;
   fromr:=fromr+kol-1;
   Excel2.Application.Quit;
   Excel2 := Unassigned;
end;
 
// само открытие, стандартное
function TForm1.LoadExcelFile2(file1: string): boolean;
begin
  Excel2 := CreateOleObject('Excel.Application');
  Excel2.Visible := false;
  Excel2.DisplayAlerts := false;
  Excel2.WorkBooks.Open(file1);
  Result := true;
end;
 
function TForm1.LoadExcelFile(file1: string): boolean;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.Visible := false;
  Excel.DisplayAlerts := false;
  Excel.WorkBooks.Open(file1);
end;
По логике - открывается один файл, потом туда добавляются открываясь и закрываясь другие. Но по факту процессы экселя потом висят десятками
0
krapotkin
3491 / 3083 / 1063
Регистрация: 14.04.2014
Сообщений: 14,893
Записей в блоге: 15
21.05.2017, 05:46 5
составить тестовый пример и выложить. кускам кода тут уже никто не верит
тем более таким странным, с использованием глобальных переменных внутри процедур
кто там знает, в каком порядке вы там чего крутите.
слово инкапсуляция в данном случае прямо для вас ))
0
BarsikCat
16 / 15 / 9
Регистрация: 20.09.2013
Сообщений: 65
21.05.2017, 09:26 6
Aleklon, попробуйте вставить выделенную жирным шрифтом команду:
....
Excel2.WorkBooks[1].Close;
Excel2.Application.Quit;
Excel2 := Unassigned;
0
Aleklon
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 16
21.05.2017, 13:27  [ТС] 7
BarsikCat, спасибо, но не помогло

Я попробовал еще вынести в MMEx открытие, операции и закрытие с локальными переменными, но тоже ничего не изменилось

В общем получается в итоге так - если с экселевским файлом никаких операций не производится, просто открытие и закрытие, то все нормально. Если хоть что-то, например,

Delphi
1
Excel2.Range[Excel2.Cells.Item[2, 1], Excel2.Cells.Item[kol, 23]].Select
то всё, висят процессы до конца работы программы
0
U-III
56 / 56 / 12
Регистрация: 24.10.2012
Сообщений: 179
21.05.2017, 15:37 8
Delphi
1
2
   Excel2.ActiveWorkbook.Close;
   Excel2.Quit;
Добавлено через 21 секунду
Попробуй так

Или используй
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{$IFDEF CLR}
function VarIsClearOrNull(const v: Variant): Boolean;
var
  vt: Integer;
begin
  vt := VarType(v);
  Result := (vt = varEmpty) or (vt = varNull) or
    ((vt = varUnknown) and (IInterface(v) = nil));
end;
{$ELSE}
function VarIsClearOrNull(const v: Variant): Boolean;
begin
  with TVarData(v) do
    Result := (VType = varEmpty) or (VType = varNull) or
            (((VType = varDispatch) or (VType = varUnknown)) and
              (VDispatch = nil))
end;
{$ENDIF}
0
Aleklon
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 16
21.05.2017, 16:09  [ТС] 9
Спасибо. Сейчас попробую первый вариант.

А по VarIsClearOrNull не понял как его применять то? Эта ж функция просто возвращает статус и больше ничего не делает
0
U-III
56 / 56 / 12
Регистрация: 24.10.2012
Сообщений: 179
21.05.2017, 16:18 10
Цитата Сообщение от Aleklon Посмотреть сообщение
А по VarIsClearOrNull не понял как его применять то? Эта ж функция просто возвращает статус и больше ничего не делает
Да верно. Что-то напутал.
Если не поможет есть другой вариант;

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.MMEx(i: integer; var fromr: integer);
var Excel2:variant;
begin
   Excel2:=LoadExcelFile2(from.Strings[i]); 
   kol:=Excel2.ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count;
   Excel2.Range[Excel2.Cells.Item[2, 1], Excel2.Cells.Item[kol, 23]].Select;
   Excel2.Selection.Copy;
   Excel.ActiveSheet.Cells[fromr,1].Select;
   Excel.ActiveSheet.Paste;
   fromr:=fromr+kol-1;
   Excel2.Workbooks.Close;
   Excel2.Quit;
   Excel2 := Unassigned;
end;
 
// само открытие, стандартное
function TForm1.LoadExcelFile2(file1: string): variant;
begin
  result := CreateOleObject('Excel.Application');
  result .Visible := false;
  result .DisplayAlerts := false;
  result .WorkBooks.Open(file1);
end;
Добавлено через 3 минуты
Aleklon, Отпишись что помогло
0
antipattern
Заблокирован
22.05.2017, 18:43 11
AutoQuit:=True
0
22.05.2017, 18:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2017, 18:43

Импорт excel и word в бд delphi
Здравствуйте!! Подскажите пожалуйста как мне сделать в базе данных при нажатии...

Экспорт Paradox в Word или в Excel
Здравствуйте, как экспортировать данные из Paradox в Word или Excell,...

Чем восстановить офисные файлы microsoft word и excel?
Доброе время суток! По ошибке удалили файлы и очистили корзину. Файлы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru