UI里面excel数据上传并解析的例子(CSV格式)

来源:互联网 发布:怎么配置linux ip 编辑:程序博客网 时间:2024/05/17 20:33

可以参考系统的例子 CRM_THTMLB_COMP/FileUploadTag 。

下面的是一个简单的CSV格式示例。

METHOD eh_onuploadfile.  DATA lv_flag TYPE char1.  DATA lv_value TYPE string .***实例化前台消息容器* -------------------------------------------------------------------* get BOL core (for message handling)  DATA lr_bol_core                   TYPE REF TO cl_crm_bol_core.  DATA lr_message_container_manager  TYPE REF TO cl_crm_genil_mess_cont_manager.  DATA lr_message_container          TYPE REF TO cl_crm_genil_global_mess_cont.* get BOL core  lr_bol_core = cl_crm_bol_core=>get_instance( ).* get current message container manager  lr_message_container_manager = lr_bol_core->get_message_cont_manager( ).* get message container  lr_message_container = lr_message_container_manager->get_global_message_cont( ).* -------------------------------------------------------------------  AUTHORITY-CHECK OBJECT 'ZXXXXXXX'           ID 'ACTVT' FIELD '01'.  IF sy-subrc <> 0."权限检查    CALL METHOD lr_message_container->add_message      EXPORTING        iv_msg_type       = 'E'        iv_msg_id         = 'ZXXXXX'        iv_msg_number     = '001'        iv_show_only_once = 'X'.    EXIT.  ENDIF.***实例化上传数据控件并使用* -------------------------------------------------------------------* get the file attributes and content  DATA lr_file         TYPE REF TO cl_thtmlb_fileupload.  DATA lv_file_name    LIKE lr_file->file_name.  DATA lv_file_content LIKE lr_file->file_content.  DATA lv_file_length  LIKE lr_file->file_length.  DATA lv_file_type    LIKE lr_file->file_content_type.  DATA lv_length       TYPE i.  lr_file ?= htmlb_event_ex.  lv_file_name    = lr_file->file_name.  lv_file_content = lr_file->file_content.  lv_file_length  = lr_file->file_length.*lv_file_type    = lr_file->file_content_type.*CHECK lv_file_type = 'application/vnd.ms-excel'.* get the last 4 bites of the file name  lv_length = strlen( lv_file_name ).  CHECK lv_length > 4.  lv_length = lv_length - 4.* check the file type  IF lv_file_name+lv_length(4) <> '.csv'.    CALL METHOD lr_message_container->add_message  "判断格式是不是csv      EXPORTING        iv_msg_type       = 'E'        iv_msg_id         = 'ZXXXXX'        iv_msg_number     = '002'        iv_show_only_once = 'X'.    EXIT.  ENDIF.***将二进制流转换为string  DATA lr_converter TYPE REF TO cl_abap_conv_in_ce.  DATA lv_filestring TYPE string .  CALL METHOD cl_abap_conv_in_ce=>create    EXPORTING      encoding    = 'NON-UNICODE'      endian      = 'L'      replacement = '#'      ignore_cerr = abap_true      input       = lv_file_content    RECEIVING      conv        = lr_converter.  lr_converter->read( IMPORTING data = lv_filestring ).  DATA itab_data TYPE STANDARD TABLE OF string.  DATA wa_itab_data  TYPE string .  DATA lin2 TYPE i.  DATA ls_zxxxxxxx TYPE zxxxxxxx .  DATA lt_zxxxxxxx TYPE TABLE OF zxxxxxxx.****将string切分成一行一条数据的内表  SPLIT lv_filestring AT cl_abap_char_utilities=>cr_lf INTO TABLE itab_data.  DELETE itab_data INDEX 1.  DESCRIBE TABLE itab_data LINES lin2 .  IF lin2 = 0 ."数据异常    CALL METHOD lr_message_container->add_message      EXPORTING        iv_msg_type       = 'E'        iv_msg_id         = 'ZXXXXX'        iv_msg_number     = '003'        iv_show_only_once = 'X'.    EXIT.  ENDIF.***整理上传的数据到内表2  DATA lin3 TYPE i.  DATA lv_tabix TYPE string.  DATA itab_data2 TYPE STANDARD TABLE OF string.  DATA wa_itab_data2  TYPE string .  DATA lv_sa TYPE string .  DATA lv_sb TYPE string .  DATA lv_sc TYPE string .  LOOP AT itab_data INTO wa_itab_data.    lv_tabix = sy-tabix .***因为可能出现双引号中带逗号的数值形式,所以必须要去除这样的逗号和双引号    CLEAR:lv_sa,lv_sb,lv_sc.    DO 10 TIMES .      SPLIT wa_itab_data AT '"' INTO lv_sa lv_sb.      IF lv_sb IS INITIAL  .        EXIT.      ENDIF.      SPLIT lv_sb AT '"' INTO lv_sc lv_sb.      REPLACE ALL OCCURRENCES OF ',' IN lv_sc WITH ''.      CONCATENATE lv_sa lv_sc lv_sb INTO wa_itab_data .    ENDDO.    REFRESH itab_data2.    SPLIT wa_itab_data AT ','  INTO TABLE itab_data2.    DESCRIBE TABLE itab_data2 LINES lin3 .    IF lin3 <> 99."列数改变了 每行的列数应该是固定值和内表结构一一对应      CALL METHOD lr_message_container->add_message        EXPORTING          iv_msg_type       = 'E'          iv_msg_id         = 'ZXXXXX'          iv_msg_number     = '004'          iv_show_only_once = 'X'          iv_msg_v1         = lv_tabix          iv_msg_v2         = '列数不是99'.      EXIT.    ENDIF.    CLEAR ls_zxxxxxxx.    CLEAR wa_itab_data2.    READ TABLE itab_data2  INDEX 1 INTO wa_itab_data2.    IF wa_itab_data2 IS INITIAL.      CALL METHOD lr_message_container->add_message        EXPORTING          iv_msg_type       = 'E'          iv_msg_id         = 'ZXXXXX'          iv_msg_number     = '005'          iv_show_only_once = 'X'          iv_msg_v1         = lv_tabix          iv_msg_v2         = '第一列值为空'.      EXIT.    ELSE.      ls_zxxxxxxx-col1 = wa_itab_data2.    ENDIF.       CLEAR wa_itab_data2.    READ TABLE itab_data2  INDEX 88 INTO wa_itab_data2.    TRY .        ls_zxxxxxxx-col88 = wa_itab_data2.      CATCH cx_root.        CALL METHOD lr_message_container->add_message          EXPORTING            iv_msg_type       = 'E'            iv_msg_id         = 'ZXXXXX'            iv_msg_number     = '006'            iv_show_only_once = 'X'            iv_msg_v1         = lv_tabix            iv_msg_v2         = '列【88】填入的不是正确的数值类型'.        EXIT.    ENDTRY.    CLEAR wa_itab_data2.    READ TABLE itab_data2  INDEX 99 INTO wa_itab_data2.    IF wa_itab_data2 IS NOT INITIAL."日期可能用户没填 防止报错      CALL FUNCTION 'CONVERT_DATE_INPUT' "#EC NOTEXT        EXPORTING          input                     = wa_itab_data2          plausibility_check        = 'X'        IMPORTING          output                    = ls_zxxxxxxx-col99        EXCEPTIONS          plausibility_check_failed = 1          wrong_format_in_input     = 2          OTHERS                    = 3.      IF sy-subrc <> 0.        CALL METHOD lr_message_container->add_message          EXPORTING            iv_msg_type       = 'E'            iv_msg_id         = 'ZXXXXX'            iv_msg_number     = '007'            iv_show_only_once = 'X'            iv_msg_v1         = lv_tabix            iv_msg_v2         = '列【99】填入的不是正确的日期类型,年月日以点分割,一年只有12个月,一个月最多31天,2月份也没有29号。'.        EXIT.      ENDIF.    ENDIF.    APPEND ls_zxxxxxxx TO lt_zxxxxxxx .  ENDLOOP.ENDMETHOD.


0 0
原创粉丝点击