Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Excel программно не закрывается


Автор: Nowichok 4.8.2009, 16:34
Создаю отчёт в Excel средствами Delphi.

Код


   if not VarIsEmpty(Excel) then
    Excel:=null;
   try
    Excel:=CreateOleObject('Excel.Application');
    Excel.Visible:=False;

    Excel.ErrorCheckingOptions.BackgroundChecking := False; 
    Excel.ErrorCheckingOptions.NumberAsText := False;
    Excel.ErrorCheckingOptions.InconsistentFormula := False;

    Excel.ScreenUpdating := FALSE;
   except
    exit
   end;

   Excel.Workbooks.Add;
   Excel.Workbooks[1].ActiveSheet.Name := '';
   Excel.WorkBooks[1].Sheets[1].Activate; 

   ...................

   Excel.ActiveWorkbook.SaveAs(MyDir+'\Report_to_Buh.xls');
   Excel.Workbooks[1].Close;
   Excel.Quit;
   Excel:=0;
 

Проблема в том, что на моём компе (Vista) всё работает. Файл создаётся. Excel-процесс закрывается самой delphi.
на другом компьютере (XP SP3) тоже всё работает.

на работе НЕТ !!! Там до ужаса тормознутые компы (ну вы знаете, как это бывает). Стоит вроде Windows 2k даже.
Так вот на работе отчёт создаётся, но процесс Excel.exe не убивается самой Delphi, Приходится это делать через диспетчер задач.

Как быть ? неужто ещё и писать код, чтобы он после создания отчёта отлавливал наличие процесса Excel.exe в памяти ??

Автор: rith2 4.8.2009, 18:35
Попробуй..

Код

Excel:= nil;


Вроде в ФАКе такое было... пока не заНИЛишь переменную - процесс не убьется

Автор: Данкинг 4.8.2009, 19:53
Код

excel:=unassigned;


Автор: Nowichok 5.8.2009, 18:55
Хорошо, попробую на работе. 
А вот как раз сейчас столкнулся ещё с одной проблемой того же рода.
Простой код - надо было копинуть данные с одного листа Excel'я в новую книгу.
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Excel:variant;
  end; 


.....
if not VarIsEmpty(Excel) then
    Excel:=null;
   try
    Excel:=CreateOleObject('Excel.Application');
    Excel.Visible:=False;
    Excel.ScreenUpdating := FALSE;
   except
    Exit;
   end;

 OpenDialog1.Execute;
 if OpenDialog1.FileName='' then
  exit;

 Excel.Workbooks.Open(OpenDialog1.FileName);
 Excel.Workbooks.Add;

........

 Excel.Workbooks[1].Close;
 Excel.Visible:=true;
 Excel:=unassigned;  // разные комбинации всех вариантов
 Excel.Quit;// разные комбинации всех вариантов
 Excel:=0;// разные комбинации всех вариантов


посдение 3 строчки хоть по отдельности, хоть все вместе ставь, но итог один - после работы программы Excel становтися видимым....точнее ПОЛУвидимым, видна только шапка, остального нет. Некое полуподвиснутое состояние Excel'я. Можно сохранить файл и заново открыть. Будет норм.
 Но сам программно Excel не отображается нормально ((. Этот глюк и на моём компьютере, про работу молчу даже smile.
 почему так?

 P.S. Хотя у меня стоит Vista SP2 x64,....


Автор: Данкинг 5.8.2009, 19:20
Цитата(Nowichok @  5.8.2009,  19:55 Найти цитируемый пост)
посдение 3 строчки хоть по отдельности, хоть все вместе ставь, но итог один - после работы программы Excel становтися видимым....

Ты же сам пишешь:
Код

Excel.Visible:=true;

 smile 

Автор: Nowichok 6.8.2009, 18:55
Это да - мне это и нужно !! Просто показал, что он становиттся полувидимым в подвиснутом состоянии. А мне надо ,чтобы нормально открылся файл после окончания операций программой

Автор: Данкинг 6.8.2009, 21:00
Ну, не знаю, убей объект и заново его создай...

Вот такой код у меня рабочий:


Код

exx:=createoleobject('excel.application');
exx.visible:=true;
Exx.DisplayAlerts:=False;
exx.Workbooks.open(fn);

Автор: Nowichok 9.8.2009, 17:56
!!!! Ошибка найдена.

При подключении к Excel писал для оптимизации кода :

Код

    Excel.ErrorCheckingOptions.BackgroundChecking := False; 
    Excel.ErrorCheckingOptions.NumberAsText := False;
    Excel.ErrorCheckingOptions.InconsistentFormula := False;

    Excel.ScreenUpdating := FALSE;


Это и приводило к тому, что при показе самого Excel'я он был не полностью прорисован.

Вот так. Решение как всегда было рядом smile

Автор: Данкинг 9.8.2009, 18:28
Цитата(Nowichok @  9.8.2009,  18:56 Найти цитируемый пост)
При подключении к Excel писал для оптимизации кода :

Я вообще таких параметров не знаю даже и никогда, соответственно, их не использовал. smile 

Автор: Nowichok 9.8.2009, 18:37
Нашёл в просторах сети. В поисковике даже можно глянуть. Вот так - буду знать, что если что-то беру - нужно знать целесообразное применение.

Автор: Данкинг 9.8.2009, 19:10
Nowichok, вот я всегда использую для создания и начала работы с Excel'ем только те строчки, которые написал. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)