You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从reuse_alv_list导出带用户格式的Excel文件?

解决方案:导出带格式的REUSE_ALV_LIST_DISPLAY数据到Excel(abap2xlsx)

核心思路

REUSE_ALV_LIST_DISPLAY属于传统SLIS框架的ALV列表,没法像OO ALV那样直接获取渲染后的表格对象。要导出保留格式(行/列着色、用户调整的布局)的Excel,得从这几点入手:

  • 捕获用户修改后的布局信息(列宽、隐藏列等)
  • 提取ALV预定义的格式配置(行/列颜色、特殊格式)
  • 将这些格式映射为abap2xlsx支持的单元格样式,再写入Excel文件

具体实现步骤

1. 注册导出触发逻辑

调用REUSE_ALV_LIST_DISPLAY时,指定自定义用户命令回调,用来触发导出操作:

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
  EXPORTING
    i_callback_program       = sy-repid
    i_callback_user_command  = 'USER_COMMAND' " 自定义命令处理FORM
    is_layout                = gs_layout
    it_fieldcat              = gt_fieldcat
  TABLES
    t_outtab                 = gt_data.

2. 在回调中处理导出逻辑

在USER_COMMAND FORM里,捕获导出命令(比如自定义的EXPORT_XLSX),然后依次完成布局获取、Excel初始化、数据写入+格式映射:

FORM user_command USING ucomm TYPE sy-ucomm
                        selfield TYPE slis_selfield.
  CASE ucomm.
    WHEN 'EXPORT_XLSX'.
      " 1. 获取当前生效的用户布局
      DATA(gs_current_layout) TYPE slis_layout_alv.
      CALL FUNCTION 'REUSE_ALV_LAYOUT_INFO_GET'
        EXPORTING
          i_save      = 'A'
          i_layout    = selfield-layout
        IMPORTING
          es_layout   = gs_current_layout
        EXCEPTIONS
          OTHERS      = 1.

      " 2. 初始化abap2xlsx对象
      DATA(lo_excel) = NEW zcl_excel().
      DATA(lo_worksheet) = lo_excel->add_worksheet( 'ALV导出数据' ).

      " 3. 写入表头(只显示布局中未隐藏的列)
      DATA(lv_col) = 1.
      DATA(lo_header_style) = lo_excel->add_cell_style().
      lo_header_style->set_bold( abap_true ). " 表头加粗

      LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>)
        WHERE NOT ( gs_current_layout-no_out = 'X' AND <fs_fieldcat>-col_pos IS INITIAL ).
        " 写入表头文本
        lo_worksheet->set_cell( row = 1 column = lv_col value = <fs_fieldcat>-seltext_m ).
        " 应用表头样式
        lo_worksheet->set_cell_style( row = 1 column = lv_col cell_style = lo_header_style ).
        " 设置列宽(根据用户调整的布局转换单位)
        READ TABLE gs_current_layout-colwidths ASSIGNING FIELD-SYMBOL(<fs_colwidth>)
          WHERE fieldname = <fs_fieldcat>-fieldname.
        IF sy-subrc = 0.
          lo_worksheet->set_column_width( column = lv_col width = <fs_colwidth>-colwidth / 256 * 10 ).
        ENDIF.
        lv_col = lv_col + 1.
      ENDLOOP.

      " 4. 写入数据行并应用格式
      DATA(lv_row) = 2.
      LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>).
        lv_col = 1.
        LOOP AT gt_fieldcat ASSIGNING <fs_fieldcat>
          WHERE NOT ( gs_current_layout-no_out = 'X' AND <fs_fieldcat>-col_pos IS INITIAL ).
          " 写入单元格值
          DATA(lv_value) = <fs_data>-<fs_fieldcat>-fieldname.
          lo_worksheet->set_cell( row = lv_row column = lv_col value = lv_value ).

          " 应用行颜色(需提前在ALV布局中指定颜色字段)
          IF <fs_data>-row_color IS NOT INITIAL.
            DATA(lo_row_style) = lo_excel->add_cell_style().
            " 转换ALV颜色码到Excel颜色(ALV格式为C<背景色><文本色>)
            CASE <fs_data>-row_color+1(1).
              WHEN '1'. lo_row_style->set_fill_foreground_color( zcl_excel_color=>col_gray_light ).
              WHEN '2'. lo_row_style->set_fill_foreground_color( zcl_excel_color=>col_gray ).
              WHEN '3'. lo_row_style->set_fill_foreground_color( zcl_excel_color=>col_yellow ).
              WHEN '4'. lo_row_style->set_fill_foreground_color( zcl_excel_color=>col_blue_light ).
              " 其他颜色按需补充
            ENDCASE.
            lo_worksheet->set_cell_style( row = lv_row column = lv_col cell_style = lo_row_style ).
          ENDIF.

          " 应用列特殊格式(如果预定义了列颜色)
          READ TABLE gt_specialcol ASSIGNING FIELD-SYMBOL(<fs_specialcol>)
            WHERE fieldname = <fs_fieldcat>-fieldname.
          IF sy-subrc = 0.
            DATA(lo_col_style) = lo_excel->add_cell_style().
            CASE <fs_specialcol>-color-col(1).
              WHEN '1'. lo_col_style->set_fill_foreground_color( zcl_excel_color=>col_gray_light ).
              WHEN '3'. lo_col_style->set_fill_foreground_color( zcl_excel_color=>col_yellow ).
            ENDCASE.
            lo_worksheet->set_cell_style( row = lv_row column = lv_col cell_style = lo_col_style ).
          ENDIF.

          lv_col = lv_col + 1.
        ENDLOOP.
        lv_row = lv_row + 1.
      ENDLOOP.

      " 5. 生成并下载Excel文件
      DATA(lo_writer) = NEW zcl_excel_writer_2007( lo_excel ).
      DATA(lv_xlsx) TYPE xstring.
      lv_xlsx = lo_writer->write().

      CALL FUNCTION 'GUI_DOWNLOAD'
        EXPORTING
          filename                = 'ALV导出数据.xlsx'
          filetype                = 'BIN'
        CHANGING
          data_tab                = lv_xlsx.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

3. 关键细节说明

  • 颜色映射:ALV颜色编码格式为C<背景色><文本色>,需手动映射到abap2xlsx的zcl_excel_color常量,可根据需求扩展颜色覆盖范围
  • 用户布局:REUSE_ALV_LAYOUT_INFO_GET能获取用户保存或临时调整的布局,确保导出的列与ALV显示一致
  • 限制说明:REUSE_ALV_LIST_DISPLAY无法捕获用户临时手动设置的格式(比如实时行着色),这类场景建议替换为OO ALV(CL_GUI_ALV_GRID),可通过GET_FRONTEND_TABLE直接获取带格式的单元格数据

内容的提问来源于stack exchange,提问作者ABAP Wizard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:43:19