您的位置:首页 > 产品设计 > UI/UE

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

2016-07-07 16:42 585 查看
可以参考系统的例子 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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SAP CRM UI EXCEL UPLOAD