SAP EXCEL 导出功能 ABAPGIT

发布于:2025-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)
FORM get_excel_data .
  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,
        lv_filename  TYPE cl_salv_export_tool_xls=>y_filename, "#EC NEEDED
        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,
        ls_fieldcat     TYPE lvc_s_fcat,
        lv_headtext     TYPE string,
        lv_xstring      TYPE xstring,
        lv_path         TYPE string,
        lv_bin_filesize TYPE i,
        lv_c            TYPE c LENGTH 1,
        lv_cc           TYPE c LENGTH 1,
        lt_data_tab     TYPE TABLE OF solisti1.
  FIELD-SYMBOLS: <lt_result> TYPE STANDARD TABLE.
  CREATE DATA lr_result_data LIKE gt_alv.



  ASSIGN lr_result_data->* TO <lt_result>.
  <lt_result> =  gt_alv.
  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 ).

**"删除不需要显示的列**
  DELETE lt_dfies WHERE fieldname = 'MATKL' OR  fieldname = 'CHECK' OR  fieldname = 'SELXXX' OR  fieldname = 'OBJNR' OR  fieldname = 'DEL'. 

  LOOP AT lt_dfies INTO ls_dfies.
    " Text
    CLEAR ls_fieldcat.
    READ TABLE gt_fcat 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.
    ****"一些自定义的字段自动获取不到描述,需要手动增加**   也可以使用之前定义的描述,但是在这里获取到field描述是空的,所以我就自定义了**
    IF ls_dfies-fieldname = 'NUM'.
      lv_headtext =  TEXT-003.
    ELSEIF ls_dfies-fieldname = 'INACT_C'.
      lv_headtext =  TEXT-004.
    ELSEIF ls_dfies-fieldname = 'STATUS'.
      lv_headtext =  TEXT-008.
    ELSEIF ls_dfies-fieldname = 'BHDH_S'.
      lv_headtext = TEXT-029.
    ELSEIF ls_dfies-fieldname = 'ICON'.
      lv_headtext = TEXT-044.
    ELSEIF ls_dfies-fieldname = 'BANFN_PO'.
      lv_headtext = TEXT-025.
    ELSEIF ls_dfies-fieldname = 'EBELN_LP'.
      lv_headtext = TEXT-026.
    ELSEIF ls_dfies-fieldname = 'PO_CHECK'.
      lv_headtext = TEXT-027.
    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
    ).
*    LO_SALV_EXPORT_COLUMN_CONF->SET_CELL_DESIGN(
*    EXPORTING
*      CELL_DESIGN = '61'
*      CELL_DESIGN_SRC_FIELD = LW_COMP_TAB-NAME
*    ).
  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.
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer          = lv_xstring
      append_to_table = ''
    IMPORTING
      output_length   = lv_bin_filesize
    TABLES
      binary_tab      = lt_data_tab.

  "获取桌面路径
  CALL METHOD cl_gui_frontend_services=>get_desktop_directory( CHANGING desktop_directory = lv_path ).
  CALL METHOD cl_gui_cfw=>update_view.
  cl_gui_frontend_services=>directory_browse(
          EXPORTING
            initial_folder         = lv_path
          CHANGING
            selected_folder      = lv_path ).


"这里有一点坑的是保存到桌面的地址没有\,且这个字符在SAP显示为¥,所以只能用动态显示的方式获取\。其他地址都是可以的。

  lv_c = reverse( lv_path ).
  lv_cc = lv_path+2(1).
  IF lv_c <> lv_cc.
    lv_filename = lv_path && lv_cc && TEXT-002 &&  '.xlsx '.
  ELSE.
    lv_filename = lv_path && TEXT-002 &&  '.xlsx '.
  ENDIF.
  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      bin_filesize            = lv_bin_filesize
      filename                = lv_filename
      filetype                = 'BIN'
*     append                  = SPACE
*     write_field_separator   = SPACE
*     header                  = '00'
*     trunc_trailing_blanks   = SPACE
*     write_lf                = 'X'
*     col_select              = SPACE
*     col_select_mask         = SPACE
*     dat_mode                = SPACE
*     confirm_overwrite       = SPACE
*     no_auth_check           = SPACE
      codepage                = '4103'
*     ignore_cerr             = ABAP_TRUE
*     replacement             = '#'
*     write_bom               = SPACE
*     trunc_trailing_blanks_eol = 'X'
*     wk1_n_format            = SPACE
*     wk1_n_size              = SPACE
*     wk1_t_format            = SPACE
*     wk1_t_size              = SPACE
*     show_transfer_status    = 'X'
*     fieldnames              =
*     write_lf_after_last_line  = 'X'
*     virus_scan_profile      = '/SCET/GUI_DOWNLOAD'
*  IMPORTING
*     filelength              =
    CHANGING
      data_tab                = lt_data_tab
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      not_supported_by_gui    = 22
      error_no_gui            = 23
      OTHERS                  = 24.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.

ABAP2XLSX
需要用到一个工具(ABAPGIT所以 首先我们需要了解一下ABAPGIT的用法

测试ABAPGIT的SSL

abap2xlsx 项目安装和配置指南
SAP ABAP导入开源项目abap2xlsx到系统

延伸的功能示例:
Using ABAP2XLSX to send ALV table output as Excel spreadsheet via internet email

ABAP学习(16):ABAP2XLSX,操作excel

XLSX Workbench
XLSX Workbench for SAP(ABAP) - tool for exporting data to Excel


网站公告

今日签到

点亮在社区的每一天
去签到