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

可以参考系统的例子 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值