Problema al automatizar excel
Publicado por David Amador Martín (1 intervención) el 03/10/2005 13:45:32
Buenas, tengo problemas al automatizar excel utilizando objetos OLE con Forms 6.0, abro excel, escribo y leo datos perfectamente pero al cerrar el fichero y cerrar la sesion de excel ya no puedo abrir de nuevo una sesión diferente de excel de otro fichero distinto que no sea el que he abierto antes.
El código que utilizo para abrir y cerrar es el siguiente:
Function AbrirConexion(visible boolean default false) return number is
sVersion varchar2(20);
Begin
if obj_aplicacion is not null then
ExclError('Error: La conexión ya se realizó anteriormente.');
else
-- Crea un nuevo objeto OLE para la aplicación de Excel
if OLE2.issupported then
begin
obj_aplicacion := OLE2.CREATE_OBJ('Excel.Application');
exception
when others then
ExclError('Error: No se ha podido capturar el objeto Excel, compruebe que la aplicación esté correctamente instalada.');
return 1;
end;
-- Recoge el objeto donde estarán contenidos los trabajos que se vayan a abrir
obj_workbooks := OLE2.get_obj_property(obj_aplicacion,'Workbooks');
if (visible) then
OLE2.Set_Property(obj_aplicacion,'Visible',1); -- Para mostrar la pantalla excel
END IF;
return 0;
else
ExclError('Error: Este PC no soporta objetos OLE.');
return 1;
end if;
end if;
sVersion := OLE2.Get_char_property(obj_aplicacion,'Version');
if not (sVersion like '8%' or sVersion like '9%') then
ExclError('Error: Versión de Excel no válida, debe tener la versión de Excel 97 o 2000 para trabajar');
OLE2.Invoke(obj_aplicacion,'Quit');
OLE2.Release_Obj(obj_aplicacion);
return 1;
end if;
End AbrirConexion;
Procedure nuevo_fichero is
lista1 OLE2.LIST_TYPE;
Begin
obj_workbook := OLE2.get_obj_property(obj_aplicacion,'Workbooks');
OLE2.Invoke(obj_workbook,'Add');
-- Recoge el Workbook que hay actualmente activo
obj_workbook := ole2.get_obj_property(obj_aplicacion,'ActiveWorkbook');
End nuevo_fichero;
Procedure cerrar_fichero(pruta in varchar2) is
arg_save OLE2.list_type;
Begin
if obj_workbook is not null then
arg_save := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(arg_save, pruta);
ole2.invoke(obj_workbook,'SaveAs',arg_save); -- Guarda el fichero
-- Cierra el fichero
ole2.invoke(obj_workbook,'Close');
OLE2.Destroy_Arglist(arg_save);
OLE2.Release_Obj(obj_workbook);
obj_workbook := null;
end if;
End cerrar_fichero;
Procedure CerrarConexion is
id binary_integer;
Begin
if obj_aplicacion is null then
ExclError('Error: No se ha abierto ninguna sesión con Excel');
else
OLE2.Release_Obj(obj_workbooks);
ole2.invoke(obj_aplicacion,'Quit');
ole2.release_obj(obj_aplicacion);
obj_workbooks := null;
obj_aplicacion := null;
end if;
End CerrarConexion;
El código que utilizo para abrir y cerrar es el siguiente:
Function AbrirConexion(visible boolean default false) return number is
sVersion varchar2(20);
Begin
if obj_aplicacion is not null then
ExclError('Error: La conexión ya se realizó anteriormente.');
else
-- Crea un nuevo objeto OLE para la aplicación de Excel
if OLE2.issupported then
begin
obj_aplicacion := OLE2.CREATE_OBJ('Excel.Application');
exception
when others then
ExclError('Error: No se ha podido capturar el objeto Excel, compruebe que la aplicación esté correctamente instalada.');
return 1;
end;
-- Recoge el objeto donde estarán contenidos los trabajos que se vayan a abrir
obj_workbooks := OLE2.get_obj_property(obj_aplicacion,'Workbooks');
if (visible) then
OLE2.Set_Property(obj_aplicacion,'Visible',1); -- Para mostrar la pantalla excel
END IF;
return 0;
else
ExclError('Error: Este PC no soporta objetos OLE.');
return 1;
end if;
end if;
sVersion := OLE2.Get_char_property(obj_aplicacion,'Version');
if not (sVersion like '8%' or sVersion like '9%') then
ExclError('Error: Versión de Excel no válida, debe tener la versión de Excel 97 o 2000 para trabajar');
OLE2.Invoke(obj_aplicacion,'Quit');
OLE2.Release_Obj(obj_aplicacion);
return 1;
end if;
End AbrirConexion;
Procedure nuevo_fichero is
lista1 OLE2.LIST_TYPE;
Begin
obj_workbook := OLE2.get_obj_property(obj_aplicacion,'Workbooks');
OLE2.Invoke(obj_workbook,'Add');
-- Recoge el Workbook que hay actualmente activo
obj_workbook := ole2.get_obj_property(obj_aplicacion,'ActiveWorkbook');
End nuevo_fichero;
Procedure cerrar_fichero(pruta in varchar2) is
arg_save OLE2.list_type;
Begin
if obj_workbook is not null then
arg_save := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(arg_save, pruta);
ole2.invoke(obj_workbook,'SaveAs',arg_save); -- Guarda el fichero
-- Cierra el fichero
ole2.invoke(obj_workbook,'Close');
OLE2.Destroy_Arglist(arg_save);
OLE2.Release_Obj(obj_workbook);
obj_workbook := null;
end if;
End cerrar_fichero;
Procedure CerrarConexion is
id binary_integer;
Begin
if obj_aplicacion is null then
ExclError('Error: No se ha abierto ninguna sesión con Excel');
else
OLE2.Release_Obj(obj_workbooks);
ole2.invoke(obj_aplicacion,'Quit');
ole2.release_obj(obj_aplicacion);
obj_workbooks := null;
obj_aplicacion := null;
end if;
End CerrarConexion;
Valora esta pregunta


0