Leer contenido de un Excel alojado en el servidor

Hola a todos.
El caso es el siguiente: Se ha alojado un archivo en formato excel en un repositorio archiving (no AL11) del cual se desea leer el contenido del archivo excel, pero sin descargarlo al directorio local del cliente haciendo un GUI_DOWNLOAD.

Para obtener todas las conexiones según el ID del repositorio usamos el siguiente FM.

CALL FUNCTION 'ARCHIV_GET_CONNECTIONS'

Luego para obtener el archivo en sí, usamos el FM

CALL FUNCTION 'ARCHIVOBJECT_GET_TABLE'

De este último usamos los valores que nos devuelve la tabla archivobject, con esta tabla hacemos una conversión de 1024 a 255 con el siguiente método.

cl_rmps_general_functions=>convert_1024_to_255( im_tab_1024 = table_archivobject ).

Con el resultado de esta conversión, la pasamos a una tabla interna de tipo cpt_x255.

Teniendo esto seguimos con el código que indica el siguiente tutorial, en donde utiliza clases para hacer la conversión a XML y luego una transformación para XLSX.


*Convert data to xstring
 cl_scp_change_db=>xtab_to_xstr( EXPORTING im_xtab = <mi_tabla_en_cpt_x255>
 im_size = l_lines
 IMPORTING ex_xstring = l_xstring ).

*Load document
 lo_package = cl_xlsx_document=>load_document( iv_data = l_xstring ).

*Get parts
 lo_parts = lo_package->get_parts( ).

*Load XML data
 l_uri = lo_parts->get_part( 2 )->get_parts( )-
>get_part( c_sheet_xml )->get_uri( )->get_uri( ).
 lo_xml_part_uri = cl_openxml_parturi=>create_from_partname( l_uri ).
 lo_xml_part = lo_package->get_part_by_uri( lo_xml_part_uri ).
 ch_sheet_data = lo_xml_part->get_data( ).

*Load sheet data
 CLEAR l_uri.
 l_uri = lo_parts->get_part( 2 )->get_parts( )-
>get_part( c_shared_str_xml )->get_uri( )->get_uri( ).
 lo_xml_part_uri = cl_openxml_parturi=>create_from_partname( l_uri ).
 lo_xml_part = lo_package->get_part_by_uri( lo_xml_part_uri ).
 ch_shared_data = lo_xml_part->get_data( ).
 CATCH cx_root INTO g_ex_root.
 CLEAR g_msg.
 g_msg = g_ex_root->get_text( ).
 IF g_msg IS NOT INITIAL.
 sy-subrc = 4.
 ENDIF.
 ENDTRY.

Terminado esto tenemos que haber creado las transformaciones por el tcode STRANS que están detalladas en el siguiente tutorial, del cual me guié para resolver este tema :wink:

ht_ps://praveensg8.files.wordpress.com/2015/04/reading-excel-file-from-application-server-into-abap-internal-table_1.pdf

*Local data declaration
 DATA lo_shared_str_dom TYPE REF TO if_ixml_document.
 DATA lo_shared_str_nodeset TYPE REF TO if_ixml_node.
 DATA l_shared_str_xml TYPE xstring.

*Converting XML into internal table
 TRY.
 CALL TRANSFORMATION z_transform_excel
 SOURCE XML g_shared_data
 RESULT XML l_shared_str_xml.
*XML to ABAP
 CALL FUNCTION 'SDIXML_XML_TO_DOM'
 EXPORTING
 xml = l_shared_str_xml
 IMPORTING
 document = lo_shared_str_dom
 EXCEPTIONS
 invalid_input = 1
 OTHERS = 2.
 IF sy-subrc = 0.
 lo_shared_str_nodeset = lo_shared_str_dom->clone( ).
 ENDIF.
*Import data

 CALL TRANSFORMATION z_trans_import_xls
 PARAMETERS
 p_shared_string = lo_shared_str_nodeset
 SOURCE XML g_sheet_data
 RESULT lt_data = i_data1.
 CATCH cx_xslt_exception.
 ENDTRY.

Gracias a @LDSDev por su aporte en la búsqueda de la solución a este tema.

Atte.
Jimmy

2 Me gusta