Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   OleObject y excel (https://www.clubdelphi.com/foros/showthread.php?t=90097)

Soa Pelaez 06-04-2016 03:41:20

OleObject y excel
 
Buen día.

Si me pudieran ayudar estoy tratando con excel mediante OleObject pero al finalizarlo y cerrar el OleObject el proceso de excel se queda en el administrador de tareas tantas veces como ejecute el código.

El código es el siguiente

Código Delphi [-]
function CargStrinGrid(AGrid: TStringGrid;
  AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Create Excel-OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;
    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);
    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Get the value of the last row
    x := XLApp.ActiveCell.Row;
    // Get the value of the last column
    y := XLApp.ActiveCell.Column;
    // Set Stringgrid's row &col dimensions.
    AGrid.RowCount := x;
    AGrid.ColCount := y;
    // Assign the Variant associated with the WorkSheet to the Delphi Variant
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    //  Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;
  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
//      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
  end;

No se que error estoy cometiendo he buscado soluciones y como lo tengo es la forma en que lo hacen pero aún así en el administrado de tareas se queda como proceso y no cierra, si alguien me puede colaborar se lo agradecería.

AgustinOrtu 06-04-2016 04:27:57

No es realmente mi area, asi que mientras algun compañero pueda tener una pista o idea mas elaborada, un buen punto de partida es:

El bloque de codigo que pusiste en el finally, se ejecuta? Mejor dicho, a que evalua not VarIsEmpty(XLApp)

roman 06-04-2016 13:31:10

Coincido con Agustín. Debería bastar XLApp.Quit para cerrar la instancia de Excel.

LineComment Saludos

Lepe 07-04-2016 12:26:01

Yo esto lo ponddría al revés:

Sheet := Unassigned;
XLAPP := Unassigned;

En alguna ocasión tuve que usar esas asignaciones para que se cerrara bien, no pude dedicarle tiempo, así que no sé decirte que pasa.

bitbow 07-04-2016 21:34:18

Me uno al monitoreo del post, tengo una aplicación que genera excel y nunca he logrado que se cierren todas las instancias que se generan, algunas se cierran y otras se quedan corriendo.

Suerte!!!

cloayza 07-04-2016 22:11:14

Será porque EXCEL tiene libros abiertos y no se ha indicado que acción realizar con ellos?...:D

Código Delphi [-]
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;
    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);

    ....
finally

    For loop := 1 to XLApp.Workbooks.Count Do
         XLApp.Workbooks[1].Close[False];  //False=Cerrar sin guardar, True=Guardar y cerrar

    XLApp.Quit;

      Result := True;
  end;

Espero que les ayude...Saludos cordiales

Soa Pelaez 09-04-2016 04:33:01

Código Delphi [-]
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;
    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);

    ....
finally

    For loop := 1 to XLApp.Workbooks.Count Do
         XLApp.Workbooks[1].Close[False];  //False=Cerrar sin guardar, True=Guardar y cerrar

    XLApp.Quit;

      Result := True;
  end;

Probe tu código y aún me queda el proceso de EXCEL abierto, alguna otra idea se los agradecería

roman 11-04-2016 17:00:15

Yo acabo de probar tu código y no me presenta problemas. ¿No estarás abriendo Excel en otra parte de la aplicación?

LineComment Saludos

Soa Pelaez 15-04-2016 02:28:37

Cita:

Empezado por roman (Mensaje 504293)
Yo acabo de probar tu código y no me presenta problemas. ¿No estarás abriendo Excel en otra parte de la aplicación?

LineComment Saludos


Yo lo ejecuto en XE8 en windows7 y windows8 y el proceso sigue en el administrador de tareas, alguna solución gracias.


La franja horaria es GMT +2. Ahora son las 09:05:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi