Autor Tema: Funcion para leer un EXCEL con sus pestañas  (Leído 37785 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado oscar

  • Administrador
  • Usuario Sr.
  • *****
  • Mensajes: 112
    • Ver Perfil
Funcion para leer un EXCEL con sus pestañas
« en: 31 de Enero de 2008, 06:12:03 pm »
Esta función lee un excel diferenciando cada pestaña.

Hay que fijarse en la tabla de salida.
*"  TABLES
*"      INTERN_SALIDA STRUCTURE  ZALSMEX_TABLINE


Se puede ver que la estructura es de una tabla Z, simplemente hay que copiar la estructura ALSMEX_TABLINE y añadirle un campo CHAR de 40 caracteres, que es donde vamos a recoger el nombre de la pestaña a la que corresponde.

Código: [Seleccionar]
  DATA: lt_zalsmex_tabline   LIKE zalsmex_tabline
                           OCCURS 0 WITH HEADER LINE.


  CALL FUNCTION 'ZEXCEL_LECTURA_LIBRO'
    EXPORTING
      filename                = pf_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 25
      i_end_row               = 10000
    TABLES
      intern_salida           = lt_zalsmex_tabline
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

Para no tener que modificar el código es aconsejable que el campo que vais a añadir tenga el nombre de PESTANIA.

Código: [Seleccionar]
FUNCTION zexcel_lectura_libro .
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     VALUE(FILENAME) LIKE  RLGRAP-FILENAME
*"     VALUE(I_BEGIN_COL) TYPE  I
*"     VALUE(I_BEGIN_ROW) TYPE  I
*"     VALUE(I_END_COL) TYPE  I
*"     VALUE(I_END_ROW) TYPE  I
*"  TABLES
*"      INTERN_SALIDA STRUCTURE  ZALSMEX_TABLINE
*"  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 ty_s_senderline.

  DATA: ld_separator          TYPE  c.

  DATA: ld_rc                 TYPE i.

  DATA: intern                LIKE alsmex_tabline OCCURS 0
                                                  WITH HEADER LINE.

  DATA: lf_pestania(50).



* Se verifica que las filas y columnas sean coherentes
  IF i_begin_row > i_end_row.
    RAISE inconsistent_parameters.
  ENDIF.
  IF i_begin_col > i_end_col.
    RAISE inconsistent_parameters.
  ENDIF.


* 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.


* Se identifica el separador de campos
  CLASS cl_abap_char_utilities DEFINITION LOAD.
  ld_separator = cl_abap_char_utilities=>horizontal_tab.


* Recorremos las Hojas del Excel
  DO.

*-- Incrementamos el Contador para ir de hoja en hoja
    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.
      EXIT.
    ENDIF.

*   Tomamos el nombre de la pestaña
    GET PROPERTY OF l_hoja 'NAME' = lf_pestania.
    COMMIT WORK AND WAIT.


*-- 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 del portapapeles
    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.

    IF sy-subrc <> 0.
      MESSAGE a037(alsmex).
    ENDIF.

*-- 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.


    PERFORM separated_to_intern_convert TABLES lt_tabla intern
                                        USING  ld_separator.

*   Se vuelca el contenido de la hoja tratada en la tabla con la
*   identificación de la pestaña.
    LOOP AT intern.
      CLEAR intern_salida.
      intern_salida-pestania = lf_pestania.
      MOVE-CORRESPONDING intern TO intern_salida.
      APPEND intern_salida.
    ENDLOOP.

*   borramos el portapapeles
    REFRESH lt_tabla.
    CALL METHOD cl_gui_frontend_services=>clipboard_export
       IMPORTING
          data                 = lt_tabla
       CHANGING
          rc                   = ld_rc
       EXCEPTIONS
          cntl_error           = 1
*       ERROR_NO_GUI         = 2
*       NOT_SUPPORTED_BY_GUI = 3
          OTHERS               = 4.

  ENDDO.

* Cerramos el Excel
  CALL METHOD OF l_excel 'QUIT'.


*-- Limpiamos los objetos
  FREE OBJECT l_libro.
  FREE OBJECT l_hoja.

  FREE OBJECT l_excel.
  FREE OBJECT l_celli.
  FREE OBJECT l_cellf.
  FREE OBJECT l_cell.


ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  SEPARATED_TO_INTERN_CONVERT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM separated_to_intern_convert TABLES i_tab       TYPE ty_t_sender
                                        i_intern    TYPE ty_t_itab
                                 USING  i_separator TYPE c.
  DATA: l_sic_tabix LIKE sy-tabix,
        l_sic_col   TYPE kcd_ex_col.
  DATA: l_fdpos     LIKE sy-fdpos.

  REFRESH i_intern.

  LOOP AT i_tab.
    l_sic_tabix = sy-tabix.
    l_sic_col = 0.
    WHILE i_tab CA i_separator.
      l_fdpos = sy-fdpos.
      l_sic_col = l_sic_col + 1.
      PERFORM line_to_cell_separat TABLES i_intern
                                   USING  i_tab l_sic_tabix l_sic_col
                                          i_separator l_fdpos.
    ENDWHILE.
    IF i_tab <> space.
      CLEAR i_intern.
      i_intern-row = l_sic_tabix.
      i_intern-col = l_sic_col + 1.
      i_intern-value = i_tab.
      APPEND i_intern.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " SEPARATED_TO_INTERN_CONVERT

*&---------------------------------------------------------------------*
*&      Form  line_to_cell_separat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM line_to_cell_separat TABLES i_intern    TYPE ty_t_itab
                          USING  i_line
                                 i_row       LIKE sy-tabix
                                 ch_cell_col TYPE kcd_ex_col
                                 i_separator TYPE c
                                 i_fdpos     LIKE sy-fdpos.

  DATA: l_string   TYPE ty_s_senderline.
  DATA  l_sic_int  TYPE i.

  CLEAR i_intern.
  l_sic_int = i_fdpos.
  i_intern-row = i_row.
  l_string = i_line.
  i_intern-col = ch_cell_col.
* csv Dateien mit separator in Zelle: --> ;"abc;cd";
  IF ( i_separator = ';' OR  i_separator = ',' ) AND
       l_string(1) = gc_esc.
    PERFORM line_to_cell_esc_sep USING l_string
                                       l_sic_int
                                       i_separator
                                       i_intern-value.
  ELSE.
    IF l_sic_int > 0.
      i_intern-value = i_line(l_sic_int).
    ENDIF.
  ENDIF.
  IF l_sic_int > 0.
    APPEND i_intern.
  ENDIF.
  l_sic_int = l_sic_int + 1.
  i_line = i_line+l_sic_int.
ENDFORM.                    "line_to_cell_separat

*&---------------------------------------------------------------------*
*&      Form  line_to_cell_esc_sep
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM line_to_cell_esc_sep USING i_string
                                i_sic_int      TYPE i
                                i_separator    TYPE c
                                i_intern_value TYPE ty_d_itabvalue.
  DATA: l_int TYPE i,
        l_cell_end(2).
  FIELD-SYMBOLS: <l_cell>.
  l_cell_end = gc_esc.
  l_cell_end+1 = i_separator .

  IF i_string CS gc_esc.
    i_string = i_string+1.
    IF i_string CS l_cell_end.
      l_int = sy-fdpos.
      ASSIGN i_string(l_int) TO <l_cell>.
      i_intern_value = <l_cell>.
      l_int = l_int + 2.
      i_sic_int = l_int.
      i_string = i_string+l_int.
    ELSEIF i_string CS gc_esc.
*     letzte Celle
      l_int = sy-fdpos.
      ASSIGN i_string(l_int) TO <l_cell>.
      i_intern_value = <l_cell>.
      l_int = l_int + 1.
      i_sic_int = l_int.
      i_string = i_string+l_int.
      l_int = STRLEN( i_string ).
      IF l_int > 0 . MESSAGE x001(kx) . ENDIF.
    ELSE.
      MESSAGE x001(kx) . "was ist mit csv-Format
    ENDIF.
  ENDIF.

ENDFORM.                    "line_to_cell_esc_sep


Datos globales LZEXCELTOP.
Código: [Seleccionar]
FUNCTION-POOL zexcel.                       "MESSAGE-ID ..

TYPE-POOLS: ole2.

TYPES: ty_d_itabvalue             TYPE alsmex_tabline-value.


TYPES: BEGIN OF ty_s_senderline,
         line(4096)               TYPE c,
       END OF ty_s_senderline,
     ty_t_itab                  TYPE alsmex_tabline   OCCURS 0,

     ty_t_sender                TYPE ty_s_senderline  OCCURS 0.

CONSTANTS:  gc_esc              VALUE '"'.


Un saludo...

Desconectado mhz0zhm

  • Novato
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Funcion para leer un EXCEL con sus pestañas
« Respuesta #1 en: 10 de Febrero de 2009, 05:25:49 pm »
Muy bueno y muy útil.

Sin embargo echo en falta las declaraciones de muchas variables, tipos y/o tablas. Y tampoco encuentro nada descriptivo que me permita declararlas yo mismo.

Te agradecería mucho que postearas la declaración de las variables, tipos, tablas,... que falten.


Un cordial saludo y gracias.

Desconectado ale12

  • Usuario Completo
  • ***
  • Mensajes: 92
    • Ver Perfil
Re: Funcion para leer un EXCEL con sus pestañas
« Respuesta #2 en: 11 de Febrero de 2009, 10:52:51 am »
Hola,

yo creo que esta explicado todo, lo único que hay que fijarse es como dice Oscar en la tabla ZALSMEX_TABLINE que para crearla solo tienes que hacer una copia de esta otra  ALSMEX_TABLINE y despues añadirle un campo CHAR de 40 que se llame PESTANIA.

De todas formas si tienes duda en alguna declaración de tabla o tipo en concreto dinos cual es para que pueda corregirlo.

 ;)


Desconectado vmairena

  • Novato
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Funcion para leer un EXCEL con sus pestañas
« Respuesta #3 en: 05 de Mayo de 2009, 05:07:46 pm »
Me estarían faltando la declaración de los siguientes tipos, y no estoy encontrando cómo hacerlo. Podrían indicarme cómo los definieron?
Me faltan las declaraciones de:
ty_s_senderline,
ty_t_sender,
ty_t_itab,
ty_d_itabvalue

Les agradezco si me pueden ayudar con esto!!!!!
Saludos
Verónica


Desconectado oscar

  • Administrador
  • Usuario Sr.
  • *****
  • Mensajes: 112
    • Ver Perfil
Re: Funcion para leer un EXCEL con sus pestañas
« Respuesta #4 en: 05 de Mayo de 2009, 07:07:09 pm »
Esto es lo que faltaba por declarar.

Mil disculpas...
Código: [Seleccionar]
FUNCTION-POOL ZEXCEL.                       "MESSAGE-ID ..

TYPE-POOLS: ole2.

TYPES: ty_d_itabvalue             TYPE alsmex_tabline-value.


  TYPES: BEGIN OF ty_s_senderline,
           line(4096)               TYPE c,
         END OF ty_s_senderline,
       ty_t_itab                  TYPE alsmex_tabline   OCCURS 0,

       ty_t_sender                TYPE ty_s_senderline  OCCURS 0.

CONSTANTS:  gc_esc              VALUE '"'.

Desconectado lizpaez55

  • Novato
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Funcion para leer un EXCEL con sus pestañas
« Respuesta #5 en: 05 de Junio de 2009, 10:08:07 pm »
Holaa
Muchisisimas gracias por tu aporte!
Yo realmente tengo muchos problemitas con excel!jaja

Saluditos


Liz

Desconectado edgar89

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Funcion para leer un EXCEL con sus pestañas
« Respuesta #6 en: 21 de Junio de 2011, 10:29:43 pm »
buenas, disculpe soy totalmente nuevo con sap, y necesito usar esta funcion para leer un archivo con varias pestañas, cuando ejecuto unicamente el modulo de funciones me sale todo perfecto, pero cuando llamo a la funcion desde un programa me sale el siguiente error:
errores tiempo de ejecucion: call_function_conflict_type
exception: cx_sy_dyn_call_illegal_type,
el error se da justo al ejecutar la linea  CALL FUNCTION 'ZEXCEL_LECTURA_LIBRO'

y la manera en la que defino la llamada a la funcion es:

CALL FUNCTION 'ZEXCEL_LECTURA_LIBRO'
  EXPORTING
    filename      =   p_p_file
    i_begin_col   =   2
    i_begin_row   =   2
    i_end_col     =   9
    i_end_row     =   3

  TABLES
    intern_salida = it_tabla

  EXCEPTIONS
    inconsistent_parameters = 1
    upload_ole              = 2
    OTHERS                  = 3.

donde it_tabla es una tabla definida como la tabla ZALSMEX_TABLINE
tal cual como pides al inicio, con el campo pestania incluido y p_p_file tiene la ruta del archivo excel a leer....por favor si me puedes ayudar te lo agradeceria mucho.

Gracias de antemano y que tengas un buen dia...!!

Desconectado oscar

  • Administrador
  • Usuario Sr.
  • *****
  • Mensajes: 112
    • Ver Perfil
Re:Funcion para leer un EXCEL con sus pestañas
« Respuesta #7 en: 22 de Junio de 2011, 09:47:03 am »
Hola Edgar,

Ese error es por tener declarada alguna variable distinta a la que tienes en la función.

Imagino que será por esto.
1º.- Revisa que te has creado la estructura como la verás en la imagen que adjunto a este post. (Para ver la imagen adjunta hay que estar logueado)

2º.- En tu función 'ZEXCEL_LECTURA_LIBRO', tanto la tabla de salida intern_salida como tu tabla interna it_tabla tienen que hacer referencia a esta estructura creada...ZALSMEX_TABLINE.  Revisa si alguna de estas no lo hace.


Saludos,
Oscar.


Desconectado edgar89

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Funcion para leer un EXCEL con sus pestañas
« Respuesta #8 en: 22 de Junio de 2011, 05:00:37 pm »
que tal mira, ya defini la estructura tal cual como la das, y cuando declaro it_tabla lo hago asi,

it_tabla like zalsmex_tabline occurs 0 with header line.

y la intern_salida pues a esa no le hago nada, supongo que cuando llamo la funcion ella se crea con las mismas caracteristicas de it_tabla o no??

la verdad estoy muy confundido, tengo como una semana usando SAP\R3, y me ha pegado bastante, espero no estar molestando mucho..(Y)

Desconectado edgar89

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Funcion para leer un EXCEL con sus pestañas
« Respuesta #9 en: 22 de Junio de 2011, 05:07:23 pm »
umm ya referencia a intern_salida con la estructura en la funcion, pero aun asi me sigue dando el error..:S