ABAP】发送文件至企业微信机器人(EXCLE)

发布时间 2023-06-14 10:37:03作者: ABAP-武汉-寒夜

 

外部传输内表内容,转换成EXLCE文件流至企业微信机器人,并获取MEDIA_ID。

IV_KEY为企微机器人KEY,

IV_FIELD_NAME为定义的文件名

https://blog.csdn.net/weixin_65625611/article/details/128204931

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.