如何从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
相关产品推荐
相关产品推荐

