ABAP】发送文件至企业微信机器人(EXCLE)
外部传输内表内容,转换成EXLCE文件流至企业微信机器人,并获取MEDIA_ID。
IV_KEY为企微机器人KEY,
IV_FIELD_NAME为定义的文件名
https://blog.csdn.net/weixin_65625611/article/details/128204931
REPORT ZTEST666. 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. DATA:iv_key TYPE STRING VALUE 'f5aae1cb-fa8e-4166-8cb5-32be27bb933d'. DATA:iv_field_name TYPE STRING VALUE '888.XLSX'. DATA:itab TYPE TABLE OF ZPPT001. SELECT * INTO TABLE itab[] FROM ZPPT001. DATA: lref_string TYPE REF TO cl_abap_datadescr, lref_data TYPE REF TO data, lt_column TYPE if_fdt_doc_spreadsheet=>t_column, ls_column TYPE LINE OF if_fdt_doc_spreadsheet=>t_column. DATA: lr_tabdescr TYPE REF TO cl_abap_structdescr, lr_data TYPE REF TO data. DATA: lv_lengcth TYPE i, lv_index TYPE i, lt_bin_data TYPE TABLE OF solisti1. DATA: ls_fieldcat_input TYPE lvc_s_fcat. * Field symbols declaration FIELD-SYMBOLS: <fs_contents> TYPE STANDARD TABLE, <fs_line> TYPE any, <fs_field> TYPE any. CREATE DATA lr_data LIKE LINE OF itab. ASSIGN lr_data->* TO <fs_line>. * Create data object CREATE DATA lref_data LIKE itab. * Assign download contents to field symbol ASSIGN lref_data->* TO <fs_contents>. <fs_contents> = itab[]. " 字段清单 lr_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). lt_dfies = cl_salv_data_descr=>read_structdescr( lr_tabdescr ). LOOP AT lt_dfies INTO ls_dfies. lv_index = sy-tabix. CLEAR ls_fieldcat. READ TABLE lt_fieldcat INTO ls_fieldcat WITH KEY fieldname = ls_dfies-fieldname. ASSIGN COMPONENT ls_dfies-fieldname OF STRUCTURE <fs_line> TO <fs_field>. IF sy-subrc = 0. lref_string ?= cl_abap_datadescr=>describe_by_data( <fs_field> ). * Prepare structure for header text ls_column-id = lv_index. ls_column-name = ls_dfies-fieldname. IF ls_fieldcat-coltext IS NOT INITIAL. ls_column-display_name = ls_fieldcat-coltext. ELSE. ls_column-display_name = ls_dfies-scrtext_l. ENDIF. * ls_column-is_result = abap_true. ls_column-type = lref_string. * Append structure prepared to internal table APPEND ls_column TO lt_column. ENDIF. ENDLOOP. * Call class method to convert data to be downloaded to .xlsx compatible xstring cl_fdt_xl_spreadsheet=>if_fdt_doc_spreadsheet~create_document( EXPORTING itab = lref_data iv_call_type = 1 columns = lt_column RECEIVING xdocument = lv_xstring ). 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 = iv_field_name. lv_fielname_length = strlen( lv_filename ). 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. * lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ). CALL METHOD part->set_content_type EXPORTING content_type = 'application/octet-stream; charset=utf-8'. lv_len = xstrlen( lv_xstring ). CALL METHOD part->set_data EXPORTING data = lv_xstring offset = 0 length = lv_len. *FIELD-SYMBOL:<fs_media_id> TYPE ANY. FIELD-SYMBOLS <fs_media_id> TYPE any. TYPES:BEGIN OF TY_U, errcode TYPE STRING, errmsg TYPE STRING, type TYPE STRING, media_id TYPE STRING, created_at TYPE STRING, END OF TY_U. DATA:LS_U TYPE TY_U. DATA:LT_U TYPE TY_U. 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'. * APPEND zmesg. RETURN. ELSE. lv_result_string = lo_http_client->response->get_cdata( ). ZCL_JSON=>deserialize( EXPORTING json = lv_result_string pretty_name = ZCL_JSON=>pretty_mode-camel_case CHANGING data = LS_U ). *READ TABLE LT_U INTO LS_U INDEX 1. * lo_respone_data = ZCL_UI2_CL_JSON=>generate( json = lv_result_string ). IF LS_U IS NOT INITIAL. * lv_field_symbols_string = 'LO_RESPONE_DATA->MEDIA_ID->*'. * ASSIGN (lv_field_symbols_string) TO <fs_media_id>. * IF <fs_media_id> IS ASSIGNED. * ev_media_id = <fs_media_id>. PERFORM http_post USING LS_U-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. *&---------------------------------------------------------------------* *& Form HTTP_POST *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_EV_MEDIA_ID text *----------------------------------------------------------------------* FORM HTTP_POST USING p_ev_media_id. DATA:lv_json_str TYPE string. DATA: lv_url TYPE string. "http 服务接口地址 DATA: lo_http_client TYPE REF TO if_http_client. DATA: lv_len TYPE i."发送报文长度 DATA: lv_resp TYPE string. DATA: lv_message TYPE string. DATA: lv_mtype TYPE bapi_mtype. DATA: lv_code TYPE sysubrc. DATA:ls_data TYPE zttmesg. " 设置http接口地址 lv_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5aae1cb-fa8e-4166-8cb5-32be27bb933d'. ls_data-msgtype = 'file'. ls_data-file-media_id = p_ev_media_id. lv_json_str = ZCL_JSON=>serialize( data = ls_data compress = abap_true pretty_name = ZCL_JSON=>pretty_mode-camel_case ). REPLACE ALL OCCURRENCES OF 'mediaId' IN lv_json_str WITH 'media_id'. "创建客户端请求 CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_url IMPORTING client = lo_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. "lv_subrc = sy-subrc. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. " 设置content type和character set lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ). " 设置方法为 post lo_http_client->request->set_method( if_http_request=>co_request_method_post ). " 设置待传输内容 lv_len = strlen( lv_json_str ). CALL METHOD lo_http_client->request->set_cdata EXPORTING data = lv_json_str offset = 0 length = lv_len. " 发送请求 lo_http_client->send( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 ). IF sy-subrc <> 0. "操作失败,获取失败原因 lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ). lv_mtype = 'E'. EXIT. ENDIF. " 读取远程服务返回的结果消息。 lo_http_client->receive( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 ). IF sy-subrc <> 0 . " lv_subrc = sy-subrc. lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ). lv_mtype = 'E'. WRITE: lv_message, lv_code. EXIT. ELSE. " 读取返回返回内容 CLEAR lv_resp. lv_resp = lo_http_client->response->get_cdata( ). WRITE:lv_resp. ENDIF. ENDFORM. " HTTP_POST
REPORT ZTEST666. 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. DATA:et_table TYPE TABLE OF ZPPT001. DATA:iv_key TYPE STRING VALUE 'f5aae1cb-fa8e-4166-8cb5-32be27bb933d'. DATA:iv_field_name TYPE STRING VALUE '888.XLS'. SELECT * INTO TABLE et_table[] FROM ZPPT001. 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. *https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=KEY&type=TYPE *https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5aae1cb-fa8e-4166-8cb5-32be27bb933d 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. * lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ). CALL METHOD part->set_content_type EXPORTING * content_type = 'application/octet-stream; charset=utf-8'. content_type = 'multipart/form-data; charset=utf-8'. * content_type = 'text/plain'. multipart/form-data *multipart/form-data; boundary=<calculated when request is sent> lv_len = xstrlen( lv_xstring ). CALL METHOD part->set_data EXPORTING data = lv_xstring offset = 0 length = lv_len. *FIELD-SYMBOL:<fs_media_id> TYPE ANY. FIELD-SYMBOLS <fs_media_id> TYPE any. TYPES:BEGIN OF TY_U, errcode TYPE STRING, errmsg TYPE STRING, type TYPE STRING, media_id TYPE STRING, created_at TYPE STRING, END OF TY_U. DATA:LS_U TYPE TY_U. DATA:LT_U TYPE TY_U. 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'. * APPEND zmesg. RETURN. ELSE. lv_result_string = lo_http_client->response->get_cdata( ). ZCL_JSON=>deserialize( EXPORTING json = lv_result_string pretty_name = ZCL_JSON=>pretty_mode-camel_case CHANGING data = LS_U ). *READ TABLE LT_U INTO LS_U INDEX 1. * lo_respone_data = ZCL_UI2_CL_JSON=>generate( json = lv_result_string ). IF LS_U IS NOT INITIAL. * lv_field_symbols_string = 'LO_RESPONE_DATA->MEDIA_ID->*'. * ASSIGN (lv_field_symbols_string) TO <fs_media_id>. * IF <fs_media_id> IS ASSIGNED. * ev_media_id = <fs_media_id>. PERFORM http_post USING LS_U-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. *&---------------------------------------------------------------------* *& Form HTTP_POST *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_EV_MEDIA_ID text *----------------------------------------------------------------------* FORM HTTP_POST USING p_ev_media_id. DATA:lv_json_str TYPE string. DATA: lv_url TYPE string. "http 服务接口地址 DATA: lo_http_client TYPE REF TO if_http_client. DATA: lv_len TYPE i."发送报文长度 DATA: lv_resp TYPE string. DATA: lv_message TYPE string. DATA: lv_mtype TYPE bapi_mtype. DATA: lv_code TYPE sysubrc. DATA:ls_data TYPE zttmesg. " 设置http接口地址 lv_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5aae1cb-fa8e-4166-8cb5-32be27bb933d'. ls_data-msgtype = 'file'. ls_data-file-media_id = p_ev_media_id. lv_json_str = ZCL_JSON=>serialize( data = ls_data compress = abap_true pretty_name = ZCL_JSON=>pretty_mode-camel_case ). REPLACE ALL OCCURRENCES OF 'mediaId' IN lv_json_str WITH 'media_id'. "创建客户端请求 CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_url IMPORTING client = lo_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. "lv_subrc = sy-subrc. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. " 设置content type和character set lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ). " 设置方法为 post lo_http_client->request->set_method( if_http_request=>co_request_method_post ). " 设置待传输内容 lv_len = strlen( lv_json_str ). CALL METHOD lo_http_client->request->set_cdata EXPORTING data = lv_json_str offset = 0 length = lv_len. " 发送请求 lo_http_client->send( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 ). IF sy-subrc <> 0. "操作失败,获取失败原因 lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ). lv_mtype = 'E'. EXIT. ENDIF. " 读取远程服务返回的结果消息。 lo_http_client->receive( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 ). IF sy-subrc <> 0 . " lv_subrc = sy-subrc. lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ). lv_mtype = 'E'. WRITE: lv_message, lv_code. EXIT. ELSE. " 读取返回返回内容 CLEAR lv_resp. lv_resp = lo_http_client->response->get_cdata( ). WRITE:lv_resp. ENDIF. ENDFORM. " HTTP_POST
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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)