• 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*****DesktopEXPORT.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的抬头制作。

  • 相关阅读:
    Python_报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence
    Python_报错:TypeError: file must have 'read' and 'readline' attributes
    Maven不扫描java文件夹下的配置文件解决办法
    Web中的相对路径和绝对路径
    sqlyog报错2058
    base标签的作用
    相对路径和绝对路径的解释
    自定义Tomcat部署目录
    常用正则表达式
    接口的结构定义
  • 原文地址:https://www.cnblogs.com/jxzhu/p/14392765.html
Copyright © 2020-2023  润新知