PDA

Ver la Versión Completa : Excel no es liberado de memoria al final de un proceso de automatización con Delphi


shoulder
26-08-2015, 17:48:05
Hola aunque use las sentencias que a continuacion escribire, si bien a la vista se cierra el archivo de excel con windows, pero si abro el administrador de tareas de windows veo como 20 excel.exe en los procesos (por cada vez que uso el excel desde delphi me queda un proceso colgado). Hay forma de cerrar completamente?.


appExcel := CreateOleObject('Excel.Application');
appExcel.WorkBooks.Open('C:\carpeta\hojas.xlsx');
appExcel.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

..........


appExcel.Workbooks.Close;
appExcel.Quit;
appExcel := Unassigned;

nlsgarcia
26-08-2015, 20:31:35
shoulder,


...cada vez que uso el Excel desde Delphi me queda un proceso colgado...¿Hay forma de cerrar completamente?...

:rolleyes:

Revisa este código:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ComObj, StdCtrls;

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

var
Form1: TForm1;
DataExcel : Array[0..4] of string = ('Data-1.xlsx','Data-2.xlsx','Data-3.xlsx','Data-4.xlsx','Data-5.xlsx');

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
xlOpenXMLWorkbook = 51;

var
Excel, WrkS, WrkB : OLEVariant;
Row, Col : Integer;
Rows, Cols : Integer;
i : Integer;
FileExcel : String;

begin

try
Excel := GetActiveOleObject('Excel.Application');
except
Excel := CreateOleObject('Excel.Application');
end;

Excel.DisplayAlerts := False;
Excel.Visible := False;

for i := Low(DataExcel) to High(DataExcel) do
begin
FileExcel := ExtractFilePath(ParamStr(0)) + DataExcel;
WrkB := Excel.Workbooks.Open(FileExcel);
WrkS := WrkB.Worksheets[1];

Cols := WrkS.UsedRange.Columns.Count;
Rows := WrkS.UsedRange.Rows.Count;

Randomize;

for Row:= 1 to Cols do
for Col:= 1 to Rows do
WrkS.Cells[Col,Row] := Random(1000);

WrkS.SaveAs(FileExcel,xlOpenXMLWorkbook);
WrkB.Close;

WrkS := Unassigned;
WrkB := Unassigned;
end;

Excel.Quit;
Excel := Unassigned;

end;

end.

El código anterior en Delphi 7 sobre Windows 7 Professional x32, [I]Permite por medio de automatización abrir, actualizar, salvar y cerrar 5 Workbooks de Excel, con una sola copia de Excel 2010 en memoria y liberar todos los recursos al final del proceso.

Revisa esta información:

Hojas de Excel en Delphi (http://www.clubdelphi.com/foros/showthread.php?t=84810&highlight=CreateOleObject+nelson)

Espero sea útil :)

Nelson.

shoulder
27-08-2015, 19:23:07
Gracias era lo que me estaba fatando.


Excel.Quit; Excel := Unassigned;

gusspagano
06-07-2016, 20:33:45
Sólo para agradecer a todos en este foro, aunque no preguntes nada encuentras solución a muchas cuestiones.

El código funciona a la perfección en window 10, con delphi XE8 y excel 2013.

Saludos. /,,/