需求
在网页应用中(FPM、FBI、WDA)通过ABAP读取EXCEL值到动态内表并把数据发送到其他组件
一、效果
有网页应用如下需要实现数据导入功能,但是此页签行列信息都是动态生成,所以我们在处理上传excel时也需要动态处理
点击数据上传后实现读取与数据回传
二、实现
1.部分代码
先通过GET_VALUE获取到事先传递的结构信息,再读取excel内容,插入data中,最后唤起refresh事件,通知页面接收数据
这是在上载类中PROCESS_EVENT中实现的方法
如下:
METHOD if_fpm_guibb_form~process_event.
DATA: lo_fpm TYPE REF TO if_fpm,
lo_event TYPE REF TO cl_fpm_event.
DATA: lr_upload TYPE REF TO data.
DATA: lv_num TYPE i.
FIELD-SYMBOLS: <fs_data> TYPE zes_s_co_upload,
<fs_table> TYPE STANDARD TABLE,
<fs_table_data> TYPE STANDARD TABLE,
<fs_struc> TYPE any,
<fs_struc_data> TYPE any,
<fs_temp> TYPE any,
<fs_temp_value> TYPE any.
DATA: lr_excel TYPE REF TO cl_fdt_xl_spreadsheet,
lr_excel_core TYPE REF TO cx_fdt_excel_core,
lr_data TYPE REF TO data,
lt_worksheets TYPE STANDARD TABLE OF string,
lv_ws_name TYPE string,
lv_xstring TYPE xstring.
DATA lr_struc TYPE REF TO cl_abap_structdescr.
DATA lr_table TYPE REF TO cl_abap_tabledescr.
DATA lr_type TYPE REF TO cl_abap_typedescr.
DATA lt_comp TYPE abap_component_tab.
DATA ls_comp LIKE LINE OF lt_comp.
DATA lr_struct_data TYPE REF TO data.
DATA lr_table_data TYPE REF TO data.
DATA lv_struct TYPE string.
DATA lv_index TYPE i.
DATA lv_index_unit TYPE i.
DATA:lt_component TYPE abap_compdescr_tab .
DATA:
lo_ref TYPE REF TO cx_root,
ls_bapiret2 TYPE bapiret2,
lv_string TYPE string.
* FIELD-SYMBOLS <fs_table> TYPE STANDARD TABLE.
* FIELD-SYMBOLS <fs_struc> TYPE any.
lo_fpm ?= cl_fpm_factory=>get_instance( ).
CALL METHOD lo_fpm->mo_app_parameter->get_value
EXPORTING
iv_key = 'TABLE'
IMPORTING
er_value = lr_table_data.
CALL METHOD lo_fpm->mo_app_parameter->get_value
EXPORTING
iv_key = 'LINE'
IMPORTING
er_value = lr_struct_data.
CALL METHOD lo_fpm->mo_app_parameter->get_value
EXPORTING
iv_key = 'INDEX'
IMPORTING
ev_value = lv_index.
*
* lr_struc ?= cl_abap_structdescr=>describe_by_name( lv_struct ).
* lt_component = lr_struc->components.
* DESCRIBE TABLE lt_component LINES lv_index.
*
* CALL METHOD cl_abap_tabledescr=>create
* EXPORTING
* p_line_type = lr_struc
* RECEIVING
* p_result = lr_table.
*
* CREATE DATA lr_struct_data TYPE HANDLE lr_struc.
* CREATE DATA lr_table_data TYPE HANDLE lr_table.
ASSIGN lr_struct_data->* TO <fs_struc_data>.
ASSIGN lr_table_data->* TO <fs_table_data>.
CASE io_event->mv_event_id.
WHEN cl_fpm_event=>gc_event_close_dialog_box.
ASSIGN ms_data TO <fs_data>.
IF <fs_data> IS ASSIGNED.
lv_xstring = <fs_data>-data.
TRY.
CREATE OBJECT lr_excel
EXPORTING
document_name = <fs_data>-filename
xdocument = lv_xstring.
CATCH cx_fdt_excel_core INTO lr_excel_core.
RETURN.
ENDTRY.
* Call method to get list of worksheets in the .xlsx file
IF lr_excel IS BOUND.
lr_excel->if_fdt_doc_spreadsheet~get_worksheet_names(
IMPORTING
worksheet_names = lt_worksheets ).
* Condition to check whether .xlsx file has any active worksheets
IF lt_worksheets IS NOT INITIAL.
READ TABLE lt_worksheets INDEX 1 INTO lv_ws_name.
* Get reference of .xlsx file contents in the active worksheet
lr_data = lr_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
lv_ws_name ).
* Check if any blank excel file is uploaded by user
IF lr_data IS BOUND.
ASSIGN lr_data->* TO <fs_table>.
IF <fs_table> IS ASSIGNED.
LOOP AT <fs_table> ASSIGNING <fs_struc>.
CHECK <fs_struc> IS NOT INITIAL."skip blank line
IF sy-tabix = 1.
* DO lv_index TIMES.
* ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struc> TO <fs_temp>.
* IF <fs_temp> IS ASSIGNED AND <fs_temp> = '基本计量单位'.
* lv_index_unit = sy-index.
* UNASSIGN <fs_temp>.
* ENDIF.
* ENDDO.
CONTINUE.
ENDIF.
DO lv_index TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struc> TO <fs_temp>.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struc_data> TO <fs_temp_value>.
IF <fs_temp> IS ASSIGNED..
TRY .
<fs_temp_value> = <fs_temp>.
CATCH cx_root INTO lo_ref.
lv_string = lo_ref->get_text( ).
ls_bapiret2-message_v2 = lv_string.
ls_bapiret2-message_v3 = <fs_temp>.
ls_bapiret2-type = 'E'.
ls_bapiret2-id = 'ZPS'.
ls_bapiret2-number = '147'.
ls_bapiret2-message_v1 = text-010.
CALL METHOD lo_fpm->mo_message_manager->report_bapiret2_message
EXPORTING
is_bapiret2 = ls_bapiret2
io_component = lo_fpm->mo_message_manager.
ENDTRY.
* IF lv_index_unit = sy-index.
* CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
* EXPORTING
* input = <fs_temp_value>
** LANGUAGE = SY-LANGU
* IMPORTING
* output = <fs_temp_value>
* EXCEPTIONS
* unit_not_found = 1
* OTHERS = 2.
* ENDIF.
UNASSIGN <fs_temp>.
ENDIF.
ENDDO.
APPEND <fs_struc_data> TO <fs_table_data>.
ENDLOOP.
IF <fs_table_data> IS NOT INITIAL.
CREATE OBJECT lo_event
EXPORTING
iv_event_id = 'REFRESH'.
GET REFERENCE OF <fs_table_data> INTO lr_upload.
lo_event->mo_event_data->set_value(
iv_key = 'UPLOAD_DATA'
ir_value = lr_upload ).
lo_fpm->raise_event( io_event = lo_event ).
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDCASE.
ENDMETHOD.
2.其中相关的内容可查看系列文章获悉
总结
以上。