PDA

Ver la Versión Completa : OLE & ABAP: con visible = 0, ¿dónde lo guarda?


jordiC77
03/03/09, 14:21:33
Hola!!

Estoy trabajando con OLE & ABAP con un fichero excel. Si le pongo
set property of e_appl 'VISIBLE' = 1.
deja el fichero excel abierto.

En cambio, si le pongo
set property of e_appl 'VISIBLE' = 0.
no abre el fichero. Esto es lo que quiero porque el proceso es en fondo y el usuario no tiene que verlo, pero además me gustaría especificarle una ruta en donde me guardara el fichero excel. No se si me he explicado. Más o menos és: créame este fichero excel en visible = 0 y guardalo en c:\temp\...

¿Alguien sabe hacerlo?

Muchas gracias de antemano,
Jordi.

eljota
05/03/09, 14:22:38
Hola,

tendrías que agregar en tu codigo:


DATA: nro_hoja TYPE i,
hoja TYPE OLE2_OBJECT,
e_appl TYPE OLE2_OBJECT.

....

CALL METHOD OF e_appl 'Worksheets' = hoja
EXPORTING #1 = Nro_hoja.

* Luego de hacer todo lo q tengas q hacer con el archivo excel, guardas...

CALL METHOD OF hoja 'SaveAs'
EXPORTING #1 = W_PATH
#2 = 1.

en donde W_path seria la ruta donde quieres q se guarde C:\data\archivo.xls

espero q esto te sirva

salu2

MEG30
05/06/09, 14:17:07
Hola:
Hice un programa que copia un txt almacenado en servidor de sap y genera un archivo ecxel y lo guarda en forma local. El problema es que, o es un error mío con el código(lo adjunto abajo), o realmente es así, para 4 registros tarda 16 segundos, hablando de pruebas en desarrollo con pocos datos, lo cual es demasiado lento. El archivo txt original tiene más de 5 mil registros. Lo probé con ole2 porque el cliente quiere que la primer hoja tenga el nombre de "EtiquetasNuevas" en lugar de Hoja1 y formato texto para las columnas 1 y 3, esto es porque la coluna 1 tiene un número de material(MATNR), que con formato general un numero '802313203000' lo pone así '802313E+11'. El cliente tiene un software de impresión de etiquetas que reconoce archivos excel con el formato antes mencionado. Por tema de lentitud quiero descargar a excel con una función pero no puedo con función dar nombre a la primer hoja ni formato texto a las columnas 1 y 3. La consulta es: ¿es posible abrir un archivo excel ya almacenado y cambiarle con ole2 el nombre a la hoja y dar formato texto a las columnas antes mencionadas? hablamos de con un describe table tener la cantidad de filas y ya sabemos la cantidad de columnas. Muchas gracias por tu ayuda.



*&---------------------------------------------------------------------*
*& Form F_GUARDA_EXCEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form f_guarda_excel.

field-symbols: <fs_table> type any table,
<fs_line> type ty_file,
<fs_data> type any.

data v_filename type rlgrap-filename.
clear v_filename.
move p_path to v_filename.
************************************************************************
* Declaraciones para la llamada a EXCEL.
data: o_hoja_excel type ole2_object,
o_excel type ole2_object,
o_libro type ole2_object,
o_ole_sheets type ole2_object,
o_activesheet type ole2_object,
o_cell type ole2_object,
o_libros_trabajo type ole2_object,
o_l_lineas(10) type c,
o_rango type ole2_object,
v_line type i.

assign t_file to <fs_table>.

* Se crea el objeto Hoja Excel.
create object o_excel 'EXCEL.APPLICATION'.
* Se hace visible la aplicación Excel
set property of o_excel 'VISIBLE' = 1.
call method of o_excel 'WORKBOOKS' = o_libros_trabajo.
call method of o_libros_trabajo 'Add' = o_libros_trabajo.
get property of o_excel 'ActiveSheet' = o_activesheet.
set property of o_activesheet 'Name' = 'EtiquetasNuevas'.

clear v_line.
loop at <fs_table> assigning <fs_line>.
v_line = v_line + 1.

do.
assign component sy-index of structure <fs_line> to <fs_data>.

if sy-subrc ne 0.
exit.
endif.

call method of o_activesheet 'Cells' = o_cell
exporting
#1 = v_line
#2 = sy-index.

IF SY-INDEX EQ 1 OR SY-INDEX EQ 3.
set property of o_cell 'NUMBERFORMAT' = '@'.
ENDIF.

set property of o_cell 'Value' = <fs_data>.
set property of o_cell 'ColumnWidth' = 20.

enddo.

endloop.


call method of o_libros_trabajo 'SAVEAS'
exporting #1 = v_filename. "path de archivo como c:\Etiquetas.xls
call method of o_libros_trabajo 'close'.
* call method of o_excel 'QUIT'.
free object: o_excel,
o_libros_trabajo,
o_cell,
o_activesheet.

endform. " F_GUARDA_EXCEL

eljota
08/06/09, 15:52:39
Hola MEG30,

si quieres ganar velocidad, primero debes ocultar el progreso d llenado d la hoja d excel, es decir, donde pones ... visible = '1', cambialo por '0' y justo antes del Save, regresalo a '1'.

Lo otro q dices, de abrir un archivo con datos llenos y solo actualizar formatos también se puede hacer, fíjate en el siguiente ejemplo q está detallado:

REPORT zexcel.
************************************************************************
* Include necesario para la declaracion de objetos OLE2
************************************************************************
INCLUDE ole2incl.
************************************************************************
************************************************************************
* Declaraciones para la llamada a EXCEL.
DATA hoja_excel TYPE ole2_object.
DATA excel TYPE ole2_object.
DATA libro TYPE ole2_object.
DATA ole_sheets TYPE ole2_object.
DATA ole_sheet TYPE ole2_object.
DATA ole_libro TYPE ole2_object.
DATA libros_trabajo TYPE ole2_object.
DATA ole_datasheet TYPE ole2_object.
DATA ole_datacells TYPE ole2_object.
DATA l_lines TYPE i.
DATA l_lineas(10) TYPE c.
DATA rango TYPE ole2_object.
DATA row TYPE ole2_object.
DATA ventana TYPE ole2_object.

DATA end(10) TYPE c.
* Se crea el objeto Hoja Excel.
CREATE OBJECT hoja_excel 'Excel.Sheet'.
* Se llama a la aplicación Excel.
CALL METHOD OF hoja_excel 'Application' = excel.
* Se hace visible la aplicación Excel
SET PROPERTY OF excel 'Visible' = 1.
CALL METHOD OF excel 'Workbooks' = libros_trabajo.
* Se abre el archivo con los datos del listado
CALL METHOD OF libros_trabajo 'Open' = libro EXPORTING
#1 = 'C:\DOCS\PRUEBA.XLS'.
CALL METHOD OF libro 'Worksheets' = ole_sheets.
* Se crea un nuevo libro y se copian los datos del fichero al libro
CALL METHOD OF ole_sheets 'Item' = ole_datasheet EXPORTING #1 = 1.
CALL METHOD OF ole_datasheet 'Copy'.
!
* Se cierra el fichero de trabajo con los datos.
call method of libro 'Close' exporting #1 = 0.
GET PROPERTY OF excel 'ACTIVESHEET' = ole_sheet.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'C1' #2 = 'H1'.
* Se formatea el ancho de columna
SET PROPERTY OF rango 'COLUMNWIDTH' = 21.
GET PROPERTY OF excel 'ACTIVEWINDOW' = ventana.
* Se muestra el libro con el formato en rejilla
SET PROPERTY OF ventana 'DISPLAYGRIDLINES' = -1.
FREE OBJECT rango.
* Se obtiene el total de líneas de la tabla para crear
* un rango con todas las celdas númericas y formatearlas
DESCRIBE TABLE i_detmedi LINES l_lines.
WRITE l_lines TO l_lineas.
TRANSLATE l_lineas USING '. '.
* Se aplica el formato numérico con decimales en los miles a
* las celdas que contienen importes.
CONCATENATE 'H' l_lineas INTO end.
CONDENSE end NO-GAPS.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'C1' #2 = end.
SET PROPERTY OF rango 'NUMBERFORMAT' = '#,##0'.
FREE OBJECT rango.
*Se informa la cabecera del listado, insertando una fila en blanco al principio del mismo
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'A1'.
CALL METHOD OF rango 'ENTIREROW' = row.
CALL METHOD OF row 'INSERT'.
FREE OBJECT rango.
FREE OBJECT row.
* Creando un rango con cada una de las celdas e informando el texto
* en las celdas se obtiene la cabecera
call method of ole_sheet 'RANGE' = rango exporting
#1 = 'A1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-003.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'B1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-012.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'C1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-007.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'D1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-008.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'E1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-013.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'F1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-010.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'G1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-011.
FREE OBJECT rango.
CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'H1'.
SET PROPERTY OF rango 'FORMULAR1C1' = text-013.
FREE OBJECT rango.
* Se liberan todos los objetos creados
FREE OBJECT libro.
FREE OBJECT libros_trabajo.
FREE OBJECT ventana.
FREE OBJECT ole_sheet.
FREE OBJECT rango.
FREE OBJECT ole_sheets.
FREE OBJECT ole_datasheet.
FREE OBJECT hoja_excel.
FREE OBJECT excel.

Espero q esta info te sirva y si tienes alguna otra duda, intentaremos ayudarte :D