一 數據准備
今天說一下如何使用XLSX Workbench輸出多個Sheet
我們根據上一篇文章所用得數據SFLIGHT(航班信息),我們再引入兩張table(SCARR,SPFLI)作為Sheet2 Shee3得輸出表
首先我們在前面取數部分取出航線和航班計划數據
二 Function ZXLWB_CALLFORM使用結構
1.在這一部分,我們先創建一個通用的附帶header和item內容的結構ZXWLB_S_COMMAN_HEADER
PS:當然你也可以創建一個你需要的結構(如ZXWLB_S_001_HEADER)來存放需要的數據
注意:其中ZWLWB_T_HEADER和ZXLWB_T_ITEM必須定義為結構,不能使用預定於類型
ITEM_T為雙層的嵌套表
在ZXLWB_S_ITEM_LINES下面再嵌套一層表
2.我們仍使用上此使用的結構ZXWLB_S_001_HEADER,增加2個結構字段
將之前創建好的結構 ZXWLB_S_COMMAN_HEADER 放入結構,創建入下圖,需要幾個Sheet就可以放幾個,當然你也可以再嵌套一層,做一個sheet的表類型嵌套ZXWLB_T_COMMAN_HEADER(我們這里簡化了,暫時不創建嵌套SHEET表)
三 事務碼ZXLWB_WORKBENCH修改FORM
1.在Form Structure中增加2個sheet頁節點
創建2個sheet接着在右擊SHEET2_SCARR創建Loop
接着在Loop下一層級創建Pattern
在excel的區域新建一個如下的sheet
將SHEET2_SCARR和 SHEET3_SPFLI綁定到Sheet2(這里說一下,Excel區域的Sheet2僅僅是一個模板,可以理解為形參,而綁定指的是SHEET2_SCARR和SHEET3_SPFLI參照Sheet2來輸出)
雙擊LOOP_SCARR_HEADER綁定內表ZXWLB_S_001_HEADER-SHEET02-HEADER_T
右擊PATTERN_SCARR_HEADER創建子節點,雙擊VALUE后面的按鈕,從結構中選取
雙擊context后前面的狀態變為,點擊右下方的創建按鈕
分配內容
由於HEADER是橫向的排列的,所以需要修改方向箭頭向右
點擊下方按鈕即可切換方向
2.下面我們創建ITEM的循環結構和內容
我們首先創建了一個LOOP_SCARR_ITEM_LINES循環節點,綁定內容為ITEM_T的第一層table
因為ITEM下面有兩層table,所以我們先再LOOP_SCARR_ITEM_LINES下面添加一個文件夾節點-FOLDER_SCARR_ITEM,輸出方向為向下,這個節點就是用來讓數據向下輸出(你可以理解為換行,因為每輸出完一行數據,是需要換行的暨向下輸出數據)
然后再FOLDER_SCARR_ITEM下面添加LOOP_SCARR_ITEM-用來循環每一行行內的數據
然后再LOOP_SCARR_ITEM下面添加結構PATTERN_SCARR_ITEM,以及下一層的內容CONTEXT_SCARR_ITEM,綁定Excel中ITEM1位置,輸出方向是向右
將LOOP_SCARR_HEADER 和LOOP_SCARR_ITEM復制到SHEET3_SPFLI下面
將復制的節點直接拖拽到SHEET3_SPFLI下面,修改名稱
最終節點結構如下圖
(注意:如果你在制作模板的過程中修改了綁定結構,同時找不到新增的結構,則在Form structure中重新填如下NAME OF THE CONTEXT),保存退出重新進入設計界面)
四 使用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為:
Sheet1
Sheet2
Sheet3
如果需要像Sheet1一樣設置抬頭,我們可以在ZXWLB_S_COMMAN_HEADER中添加結構,在Form結構中添加抬頭節點,然后在程序中填入數據即可實現,有興趣的可以參考Sheet1的抬頭制作。