Pasar un archivo de Excel a una Tabla Interna en ABAP

En este post, veremos como pasar un archivo en formato de excel a una tabla interna en abap.  Lo anterior se realiza mediante la función ‘ALSM_EXCEL_TO_INTERNAL_TABLE ‘.

Aclaro que para poder hacer esto, se necesita que en la máquina donde se esté ejecutando el programa tenga instalada una versión de excel (yo lo intenté con libre office, pero me marca error y mandatoriamente tenemos que tener instalado el microsoft excel, cosas de SAP u_u ).

El código que he desarrollado para interactuar con esta función estándar de SAP es muy sencillo:

*&———————————————————————*
*& Report  Z_EXCEL_A_TI_10
*&
*&———————————————————————*
*&
*& PichuS
*&———————————————————————*

REPORT  Z_EXCEL_A_TI_10.

*PEDIMOS EL ARCHIVO A SUBIR
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME.
PARAMETERS  p_file  like rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BLK1.

*DECLARACIÓN DE ESTRUCTURA, LA CUAL DEBE CONCORDAR CON LOS DATOS DEL
*ARCHIVO DE EXCEL
TYPES: BEGIN OF TY_DATOS,
DISTRO(60),
VERSION(100),
DIFICULTAD(60),
END OF TY_DATOS.

DATA: P_FILE_NAME TYPE STRING,
P_FULLPATH TYPE STRING,
error(255),

IT_DATOS TYPE TABLE OF ty_datos,
WA_DATOS LIKE LINE OF  it_datos,

IT_EXCEL TYPE STANDARD TABLE OF alsmex_tabline,
WA_EXCEL TYPE alsmex_tabline,
V_ID TYPE I,
v_value(30).

at selection-screen on value-request for p_file.
*ESTA FUNCIÓN NOS AYUDA A UBICAR EL ARCHIVO COMO LO HARÍAMOS EN WINDOWS
CALL FUNCTION ’GUI_FILE_LOAD_DIALOG’
EXPORTING
WINDOW_TITLE            = ’Selecciona el archivo a cargar…’
FILE_FILTER             = ’,*.XLS,*.xls.’
IMPORTING
FILENAME                = P_FILE_NAME
FULLPATH                = P_FULLPATH.
IF SY-SUBRC = 0.
p_file = P_FULLPATH.
ENDIF.

start-of-selection.
*VERIFICAMOS QUE SE HAYA SELECCIONADO UN ARCHIVO DE EXCEL
*TAMBIÉN APLICA PARA EL FORMATO DE OFFICE 2007 ”.XLSX”
IF P_FILE_NAME IS INITIAL.
IF P_FILE NS ’.xls’.
perform mensaje_error.
MESSAGE error type ’E’.
EXIT.
ENDIF.
ELSE.
IF P_FILE_NAME NS ’.xls’.
perform mensaje_error.
MESSAGE error type ’E’.
EXIT.
ENDIF.
ENDIF.

*PASAMOS EL ARCHIVO DE EXCEL A LA TABLA INTERNA
CALL FUNCTION ’ALSM_EXCEL_TO_INTERNAL_TABLE’
EXPORTING
filename                = P_FILE
*COLUMNA DONDE SE EMPIEZA A BUSCAR DATOS
i_begin_col             = 1
*RENGLÓN DONDE SE EMPIEZA A BUSCAR DATOS
i_begin_row             = 1
*COLUMNA DONDE TERMINA DE BUSCAR DATOS
i_end_col               = 3
*RENGLÓN DONDE TERMINA DE BUSCAR DATOS
i_end_row               = 10
TABLES
*TABLA INTERNA DONDE ME REGRESA LOS DATOS
intern                  = it_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole              = 2
OTHERS                  = 3.
IF SY-SUBRC <> 0.
MESSAGE e010(ad) WITH ’Error en el archivo, verifique datos’.
ELSE.
*ORDENAMOS DATOS EN TABLA FINAL.
DO.
V_ID = V_ID + 1.
LOOP AT it_excel INTO wa_excel WHERE ROW = V_ID.
CASE wa_excel-col.
WHEN ’0001′.
WA_DATOS-DISTRO      = wa_excel-value.
WHEN ’0002′.
WA_DATOS-VERSION     = wa_excel-value.
WHEN ’0003′.
WA_DATOS-DIFICULTAD  = wa_excel-value.
ENDCASE.
ENDLOOP.
“Si se cargaron datos a la tabla interna, validamos que venga
“información en campos que sean obligatorios
IF SY-SUBRC = 0.
IF WA_DATOS-DISTRO  IS INITIAL OR WA_DATOS-VERSION IS INITIAL.
MESSAGE i010(ad) WITH ’Faltan datos en el archivo’ DISPLAY LIKE ’E’.
EXIT.
ELSE.
append wa_datos to it_datos.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
IF it_datos[] IS INITIAL.
MESSAGE e010(ad) WITH ’Error en el archivo, verifique datos’.
“SI TODO HA SALIDO BIEN, YA TENEMOS LOS DATOS EN NUESTRA TABLA INTERNA
ELSE.
WRITE: SY-ULINE,10 ’DISTRO’,40 ’VERSION’,70 ’DIFICULTAD’,SY-ULINE,/.
LOOP AT IT_DATOS INTO WA_DATOS.
WRITE: 10 WA_DATOS-DISTRO,
40 WA_DATOS-VERSION,
70 WA_DATOS-DIFICULTAD,/.
ENDLOOP.
WRITE SY-ULINE.
ENDIF.
ENDIF.

form mensaje_error.
concatenate ’Archivo’ P_FILE_NAME ’Inválido’
‘Verifique que su archivo sea de tipo excel .xls’
into error separated by space.
endform.

Y listo, tan sencillo como eso, después de pasar los datos de excel a la tabla interna,  muestro en pantalla la información de la tabla para verificar que la los datos son correctos.

El archivo de Excel que yo enviaré es un fichero llamado “distribuciones_linux.xls” con la siguiente información:

Al correr el programa obtenemos lo siguiente:

  • Primero debemos dar la ruta en donde está nuestro archivo, puedes utilizar el match code de ayuda que está en la parte derecha de la casilla “Archivo”:

  • Después de indicar la dirección y el nombre del archivo excel de nuestro equipo, este se grabará en la casilla de “Archivo”:

  • Posteriormente ejecutamos el programa y obtendremos los datos que se guardaron en nuestra tabla interna:

Cualquier duda o comentario, favor de contactarme por correo electrónico o dejen aquí sus comentarios.

Advertisement

Etiquetas: , , ,

5 comentarios para “Pasar un archivo de Excel a una Tabla Interna en ABAP”

  1. Jaione Dice:

    Yo necesito hacer exactamente lo mismo pero en la celda de excel tengo un texto con formato que puede tener hasta 1000 caracteres. ¿Como podria leerlo y guardarlo en una tabla interna?
    Muchas Gracias.

  2. pichus Dice:

    Hola Jaione,

    Debes quitar el formato de la hoja de Excel, no importa los caracteres que tengas en las casillas, siempre y cuando tu tabla interna donde se guardan los datos (en este ejemplo la información del archivo de Excel se carga a la tabla interna IT_DATOS) esté definida con campos de esta capacidad (CHAR 1000). Si tienes alguna duda en concreto, contáctame y la revisamos.

    Saludos.

  3. Jaione Dice:

    La funcion ALSM_EXCEL_TO_INTERNAL_TABLE devuelve los valores leidos en it_excel y este es de tipo alsmex_tabline. El campo VALUE de la estructura alsmex_tabline es un char de 50 y por tanto, la funcion no lee mas que 50 caracteres de una celda de texto. ¿Como podria hacer para que leyese muchos mas? Por ejemplo 5000.
    Muchas Gracias.

    • pichus Dice:

      Para poder hacer lo que me comentas, puedes hacer un tipo tabla con el campo value de 5000 caracteres, en lugar de utilizar la estructura del alsmex_tabline.

      En lugar de estas lineas:

      IT_EXCEL TYPE STANDARD TABLE OF alsmex_tabline,
      WA_EXCEL TYPE alsmex_tabline,

      Cámbialas por estas otras:

      types: begin of ty_excel,
      row like alsmex_tabline-row,
      col like alsmex_tabline-col,
      value(5000), “aqui estan los 5000 caracteres =)
      end of ty_excel.

      data: it_excel type table of ty_excel,
      wa_excel like line of it_excel.

      Y ya no tendrás problemas para aceptar hasta 5000 caracteres para importar de tu hoja de excel.

      Espero te sirva. Saludos.

  4. Jaione Dice:

    Ya he encontrado la solucion. Lo que me comentas esta bien pero no es suficiente ya que la funcion solo lee 50 caracteres. He creado una funcion Z como copia de la funcion estandar y he modificado la funcion para que lea 5000 caracteres.

    Gracias de todos modos.

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s


Seguir

Get every new post delivered to your Inbox.