外部传输内表内容,转换成EXLCE文件流至企业微信机器人,并获取MEDIA_ID。
IV_KEY为企微机器人KEY,
IV_FIELD_NAME为定义的文件名
FUNCTION zfm_send_file.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IV_KEY) TYPE STRING
*" VALUE(IV_FIELD_NAME) TYPE STRING
*" EXPORTING
*" REFERENCE(EV_MEDIA_ID) TYPE STRING
*" TABLES
*" ZMESG STRUCTURE BAPIRET2
*" ET_TABLE TYPE TABLE
*"----------------------------------------------------------------------
*-----------------------------------------------------------------------
* create function for log
*-----------------------------------------------------------------------
DATA:
lo_http_client TYPE REF TO if_http_client,
lv_service TYPE string,
lv_result_string TYPE string,
lv_len TYPE i,
lv_msg TYPE string,
lv_message TYPE string,
lv_http_method TYPE string,
lv_string TYPE string,
lv_xstring TYPE xstring,
lv_media_id TYPE string,
lv_head_field TYPE string,
lo_entity TYPE REF TO if_http_entity,
lv_name TYPE string,
lv_filename TYPE string,
lv_field_symbols_string TYPE string,
lo_respone_data TYPE REF TO data,
part TYPE REF TO if_http_entity,
lv_fielname_length TYPE i.
DATA: lr_result_data TYPE REF TO data,
lr_data_line TYPE REF TO data.
DATA: lo_excel_export_service TYPE REF TO cl_salv_export_tool_xls,
lo_salv_export_column_conf TYPE REF TO if_salv_export_column_conf,
lo_configuration TYPE REF TO if_salv_export_configuration.
DATA: lv_content TYPE cl_salv_export_tool_xls=>y_file_content,
lv_mime_type TYPE cl_salv_export_tool_xls=>y_mime_type,
lt_infos TYPE cl_salv_export_tool_xls=>yt_msg, "#EC NEEDED
lt_warnings TYPE cl_salv_export_tool_xls=>yt_msg. "#EC NEEDED
DATA: lo_table_rtti TYPE REF TO cl_abap_tabledescr,
lt_dfies TYPE ddfields,
ls_dfies TYPE dfies,
lo_field_catalog TYPE REF TO cl_abap_structdescr.
DATA: lv_fieldname TYPE string,
lt_fieldcat TYPE lvc_t_fcat,
ls_fieldcat TYPE lvc_s_fcat,
lv_headtext TYPE string,
lv_bin_filesize TYPE i,
lt_data_tab TYPE TABLE OF solisti1.
FIELD-SYMBOLS: <lt_result> TYPE STANDARD TABLE.
CREATE DATA lr_result_data LIKE et_table[].
ASSIGN lr_result_data->* TO <lt_result>.
<lt_result> = et_table[].
lo_excel_export_service = cl_salv_export_tool_xls=>create_for_excel( lr_result_data ).
lo_configuration = lo_excel_export_service->configuration( ).
CREATE DATA lr_data_line LIKE LINE OF <lt_result>.
lo_field_catalog ?= cl_abap_tabledescr=>describe_by_data_ref( lr_data_line ).
lt_dfies = cl_salv_data_descr=>read_structdescr( lo_field_catalog ).
LOOP AT lt_dfies INTO ls_dfies.
" Text
CLEAR ls_fieldcat.
READ TABLE lt_fieldcat INTO ls_fieldcat WITH KEY fieldname = ls_dfies-fieldname.
IF ls_fieldcat-coltext IS NOT INITIAL.
lv_headtext = ls_fieldcat-coltext.
ELSE.
lv_headtext = ls_dfies-scrtext_l.
ENDIF.
lv_fieldname = ls_dfies-fieldname.
lo_salv_export_column_conf = lo_configuration->add_column(
header_text = lv_headtext
field_name = lv_fieldname
display_type = if_salv_export_column_conf=>display_types-text_view
).
ENDLOOP.
lo_excel_export_service->check_configuration(
IMPORTING
t_messages_info = lt_infos
t_messages_warning = lt_warnings
).
TRY.
lo_excel_export_service->read_result(
IMPORTING
content = lv_content
mime_type = lv_mime_type
filename = lv_filename
t_messages_info = lt_infos
t_messages_warning = lt_warnings
).
CATCH cx_salv_export_error. "#EC NO_HANDLER
ENDTRY.
lv_xstring = lv_content.
lv_service = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=' && iv_key && '&type=file'.
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_service
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3.
CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
CALL METHOD lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).
CALL METHOD lo_http_client->request->if_http_entity~set_content_type(
EXPORTING
content_type = 'multipart/form-data' ).
CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
EXPORTING
formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.
part = lo_http_client->request->if_http_entity~add_multipart( ).
* LV_FILENAME = CL_HTTP_UTILITY=>UNESCAPE_URL( IV_FIELD_NAME ).
lv_filename = iv_field_name.
lv_fielname_length = strlen( lv_filename ).
* LV_FILENAME = CL_HTTP_UTILITY=>ESCAPE_URL( IV_FIELD_NAME ).
lv_head_field = 'form-data; name="media";filename="' && lv_filename && '"; filelength=' && lv_fielname_length .
CALL METHOD part->set_header_field
EXPORTING
name = 'Content-Disposition'
value = lv_head_field.
CALL METHOD part->set_content_type
EXPORTING
content_type = 'application/octet-stream'.
* content_type = 'text/plain'.
lv_len = xstrlen( lv_xstring ).
CALL METHOD part->set_data
EXPORTING
data = lv_xstring
offset = 0
length = lv_len.
CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
"读取远程服务返回的处理过结果。
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
IF sy-subrc <> 0 .
lo_http_client->get_last_error( IMPORTING message = lv_message ).
* ZMESG-MESSAGE = LV_MESSAGE.
* ZMESG-TYPE = 'E'.
RETURN.
ELSE.
lv_result_string = lo_http_client->response->get_cdata( ).
lo_respone_data = /ui2/cl_json=>generate( json = lv_result_string ).
IF lo_respone_data IS NOT INITIAL.
lv_field_symbols_string = 'LO_RESPONE_DATA->MEDIA_ID->*'.
ASSIGN (lv_field_symbols_string) TO FIELD-SYMBOL(<fs_media_id>).
IF <fs_media_id> IS ASSIGNED.
ev_media_id = <fs_media_id>.
zmesg-type = 'S'.
zmesg-message = text-s04 && ev_media_id .
APPEND zmesg.
ELSE.
zmesg-type = 'E'.
zmesg-message = lv_result_string .
APPEND zmesg.
ENDIF.
ELSE.
zmesg-type = 'E'.
zmesg-message = lv_result_string .
APPEND zmesg.
ENDIF.
ENDIF.
*-----------------------------------------------------------------------
* SAVE function log
ENDFUNCTION.