3
« en: 28 de Diciembre de 2007, 11:46:15 am »
Buenos días,
Os incluyo una función para leer datos de un Excel con varias hojas
function zbc_open_excel .
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(FILENAME) TYPE RLGRAP-FILENAME
*" REFERENCE(I_BEGIN_COL) TYPE I
*" REFERENCE(I_BEGIN_ROW) TYPE I
*" REFERENCE(I_END_COL) TYPE I
*" REFERENCE(I_END_ROW) TYPE I
*" TABLES
*" T_EXCEL TYPE ZTB_BC_EXCEL
*" EXCEPTIONS
*" INCONSISTENT_PARAMETERS
*" UPLOAD_OLE
*"----------------------------------------------------------------------
* Variables Locales
data: l_excel type ole2_object,
l_libro type ole2_object,
l_hoja type ole2_object,
l_cont type i,
l_celli type ole2_object,
l_cellf type ole2_object,
l_cell type ole2_object,
lt_tabla type table of zes_bc_excel_ln.
field-symbols: <lf_aux>.
* Abrimos el Excel
if l_excel-header = space or l_excel-handle = -1.
create object l_excel 'Excel.Application'.
endif.
call method of l_excel 'Workbooks' = l_libro.
call method of l_libro 'Open'
exporting
#1 = filename.
check sy-subrc is initial.
* Recorremos las Hojas del Excel
do.
*-- Incrementamos el Contador
add 1 to l_cont.
*-- Limpiamos los objetos
free object: l_cell, l_celli, l_cellf, l_hoja.
clear lt_tabla[].
*-- Leemos la Hoja
call method of l_excel 'Worksheets' = l_hoja
exporting #1 = l_cont.
*-- Si no existe la hoja Salimos del Bucle
if not sy-subrc is initial. "OR l_cont EQ 3.
exit.
endif.
*-- Recogemos la Primera Celda
call method of l_hoja 'Cells' = l_celli
exporting
#1 = i_begin_row
#2 = i_begin_col.
commit work and wait.
*-- Recogemos la Ultima Celda
call method of l_hoja 'Cells' = l_cellf
exporting
#1 = i_end_row
#2 = i_end_col.
commit work and wait.
*-- Recogemos las celdas comprendidas entre la Primera y la Ultima
*-- y lo copiamos a la memoria intermedia
call method of l_hoja 'RANGE' = l_cell
exporting
#1 = l_celli
#2 = l_cellf.
commit work and wait.
call method of l_cell 'SELECT'.
commit work and wait.
call method of l_cell 'COPY'.
*-- Recogemos los Valores
call method cl_gui_frontend_services=>clipboard_import
importing
data = lt_tabla
exceptions
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
others = 4.
*-- Limpiamos los valores en blanco
sort lt_tabla.
delete lt_tabla where line eq space.
clear: sy-subrc.
*-- Recogemos los datos a la tabla de Salida
check not lt_tabla[] is initial.
assign lt_tabla[] to <lf_aux>.
check sy-subrc is initial.
move <lf_aux> to t_excel-tabla.
append t_excel. clear t_excel.
enddo.
* Cerramos el Excel
call method of l_excel 'QUIT'.
*-- Limpiamos los objetos
free object l_libro.
free object l_hoja.
endfunction.
La tabla ZTB_BC_EXCEL es de "Tipo Tabla" con tipo de linea una estructura con un campo de formato char4092.
Está montada asi para crear una tabla con todo el contenido del excel, con múltiples "subtablas", tantas como hojas contenga el excel.
Es una función beta, pero funciona.
Uvidime sa,
ADGP