2021.02.09 【ABAP隨筆】-Excel高效輸出工具-xlsx workbench-輸出多個Sheet


一 數據准備

今天說一下如何使用XLSX Workbench輸出多個Sheet

我們根據上一篇文章所用得數據SFLIGHT(航班信息),我們再引入兩張table(SCARR,SPFLI)作為Sheet2 Shee3得輸出表

首先我們在前面取數部分取出航線和航班計划數據

image.png

二 Function ZXLWB_CALLFORM使用結構

1.在這一部分,我們先創建一個通用的附帶header和item內容的結構ZXWLB_S_COMMAN_HEADER

PS:當然你也可以創建一個你需要的結構(如ZXWLB_S_001_HEADER)來存放需要的數據

image.png

注意:其中ZWLWB_T_HEADER和ZXLWB_T_ITEM必須定義為結構,不能使用預定於類型

image.png

image.png

ITEM_T為雙層的嵌套表

image.png

在ZXLWB_S_ITEM_LINES下面再嵌套一層表

image.png

image.png

image.png

 

2.我們仍使用上此使用的結構ZXWLB_S_001_HEADER,增加2個結構字段

將之前創建好的結構 ZXWLB_S_COMMAN_HEADER 放入結構,創建入下圖,需要幾個Sheet就可以放幾個,當然你也可以再嵌套一層,做一個sheet的表類型嵌套ZXWLB_T_COMMAN_HEADER(我們這里簡化了,暫時不創建嵌套SHEET表)image.png

 

三 事務碼ZXLWB_WORKBENCH修改FORM

1.在Form Structure中增加2個sheet頁節點

image.png

image.png

創建2個sheetimage.png接着在右擊SHEET2_SCARR創建Loop

image.png

image.png

接着在Loop下一層級創建Pattern

image.png

在excel的區域新建一個如下的sheet

image.png

將SHEET2_SCARR和 SHEET3_SPFLI綁定到Sheet2(這里說一下,Excel區域的Sheet2僅僅是一個模板,可以理解為形參,而綁定指的是SHEET2_SCARR和SHEET3_SPFLI參照Sheet2來輸出)

image.png

雙擊LOOP_SCARR_HEADER綁定內表ZXWLB_S_001_HEADER-SHEET02-HEADER_T

image.png

image.png

右擊PATTERN_SCARR_HEADER創建子節點,雙擊VALUE后面的image.png按鈕,從結構中選取

image.png

image.png

雙擊context后前面的狀態變為image.png,點擊右下方的創建按鈕

image.png

分配內容

image.png

image.png

由於HEADER是橫向的排列的,所以需要修改方向箭頭向右

image.png

點擊下方image.png按鈕即可切換方向

image.png

2.下面我們創建ITEM的循環結構和內容

我們首先創建了一個LOOP_SCARR_ITEM_LINES循環節點,綁定內容為ITEM_T的第一層table

image.png

因為ITEM下面有兩層table,所以我們先再LOOP_SCARR_ITEM_LINES下面添加一個文件夾節點-FOLDER_SCARR_ITEM,輸出方向為向下,這個節點就是用來讓數據向下輸出(你可以理解為換行,因為每輸出完一行數據,是需要換行的暨向下輸出數據)

image.png

然后再FOLDER_SCARR_ITEM下面添加LOOP_SCARR_ITEM-用來循環每一行行內的數據

image.png

然后再LOOP_SCARR_ITEM下面添加結構PATTERN_SCARR_ITEM,以及下一層的內容CONTEXT_SCARR_ITEM,綁定Excel中ITEM1位置,輸出方向是向右

image.png

將LOOP_SCARR_HEADER 和LOOP_SCARR_ITEM復制到SHEET3_SPFLI下面

image.png

將復制的節點直接拖拽到SHEET3_SPFLI下面,修改名稱

image.png

最終節點結構如下圖

image.png

(注意:如果你在制作模板的過程中修改了綁定結構,同時找不到新增的結構,則在Form structure中重新填如下NAME OF THE CONTEXT),保存退出重新進入設計界面)

image.png

四 使用FUN:ZXLWB_CALLFORM調用模板

這里直接給上程序,sheet2和sheet3的結構賦值設計非扁平結構的賦值,大家可以自行理解一下

FORM frm_down_excel USING uv_filename TYPE string .
  DATA ls_header TYPE zxwlb_s_001_header.
  DATA ls_item TYPE zxwlb_s_001_item.
  DATA lt_item TYPE zxwlb_t_001_item.

  DATA: lcl_tab       TYPE REF TO cl_abap_tabledescr,
        lcl_tab_struc TYPE REF TO cl_abap_structdescr,
        lt_comps_tab  TYPE abap_compdescr_tab.
  DATA l_t_item TYPE zxlwb_t_item.
  DATA l_s_item_lines TYPE zxlwb_s_item_lines.
  "賦值
  ls_header-flight_info = 'Tab Flight'.
  ls_header-currency = 'CNY'.

  LOOP AT sflight INTO DATA(ls_sflight).
    MOVE-CORRESPONDING ls_sflight TO ls_item.
    ls_header-total_price = ls_header-total_price + ls_item-price.
    APPEND ls_item TO lt_item.
    CLEAR ls_item.
  ENDLOOP.
  APPEND LINES OF lt_item TO ls_header-item.

  "sheet2 和 sheet3
*  PERFORM frm_corresponding_sheet
  lcl_tab ?= cl_abap_tabledescr=>describe_by_data( scarr[] )."根據內表獲取表類型
  lcl_tab_struc ?= lcl_tab->get_table_line_type( )."獲取結構類型
  lt_comps_tab = lcl_tab_struc->components."獲取字段組件屬性


  LOOP AT lt_comps_tab INTO DATA(ls_comps_tab)."根據字段組件內容 將抬頭數據放在HEARER_T[]中
    APPEND ls_comps_tab-name TO ls_header-sheet02-header_t[].
  ENDLOOP.

  LOOP AT scarr INTO DATA(ls_scarr)."將航班數據按照字段結構放到SHEET02-ITEM_T[]中
    CLEAR l_t_item.
    LOOP AT lt_comps_tab INTO ls_comps_tab.
      ASSIGN COMPONENT ls_comps_tab-name  OF STRUCTURE ls_scarr TO FIELD-SYMBOL(<fs_line_value>).
      IF sy-subrc EQ 0.
        APPEND <fs_line_value> TO l_t_item.
      ENDIF.
    ENDLOOP.

    l_s_item_lines-lines = l_t_item.
    APPEND l_s_item_lines TO ls_header-sheet02-item_t[].

  ENDLOOP.

  lcl_tab ?= cl_abap_tabledescr=>describe_by_data( spfli[] )."根據內表獲取表類型
  lcl_tab_struc ?= lcl_tab->get_table_line_type( )."獲取結構類型
  lt_comps_tab = lcl_tab_struc->components."獲取字段組件屬性

  LOOP AT lt_comps_tab INTO ls_comps_tab."根據字段組件內容 將抬頭數據放在HEARER_T[]中
    APPEND ls_comps_tab-name TO ls_header-sheet03-header_t[].
  ENDLOOP.

  LOOP AT spfli INTO DATA(ls_spfli)."將航班計划數據按照字段結構放到SHEET02-ITEM_T[]中
    CLEAR l_t_item.
    LOOP AT lt_comps_tab INTO ls_comps_tab.
      ASSIGN COMPONENT ls_comps_tab-name OF STRUCTURE ls_spfli TO <fs_line_value>.
      IF sy-subrc EQ 0.
        APPEND <fs_line_value> TO l_t_item.
      ENDIF.
    ENDLOOP.

    l_s_item_lines-lines = l_t_item.
    APPEND l_s_item_lines TO ls_header-sheet03-item_t[].

  ENDLOOP.


  "調用function
  CALL FUNCTION 'ZXLWB_CALLFORM'
    EXPORTING
      iv_formname        = 'ZXLSX_WORKBENCH_001' " xlsx workbench form 模板名稱
      iv_context_ref     = ls_header "數據
*     IV_VIEWER_TITLE    = SY-TITLE
*     IV_VIEWER_INPLACE  = 'X'
*     IV_VIEWER_CALLBACK_PROG       = SY-CPROG
*     IV_VIEWER_CALLBACK_FORM       =
      iv_viewer_suppress = 'X' " 為空的,則調用內嵌EXCEL 顯示數據
*     IV_PROTECT         =
      iv_save_as         = uv_filename  "C:\Users\*****\Desktop\EXPORT.xlsx  保存在PC目錄
*     IV_SAVE_AS_APPSERVER          =
*     IV_STARTUP_MACRO   =
*     IT_DOCPROPERTIES   =
* IMPORTING
*     EV_DOCUMENT_RAWDATA           =
*     EV_DOCUMENT_EXTENSION         =
    EXCEPTIONS
      process_terminated = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1
    sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

運行程序,點擊Down Excel可以看到下載下來的excel為:

image.png

Sheet1

image.png

Sheet2

image.png

Sheet3

image.png

如果需要像Sheet1一樣設置抬頭,我們可以在ZXWLB_S_COMMAN_HEADER中添加結構,在Form結構中添加抬頭節點,然后在程序中填入數據即可實現,有興趣的可以參考Sheet1的抬頭制作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM