SALV_TREE导出Excel缺失总计与小计问题求助
解决CL_SALV_TREE导出Excel缺失总计/小计及聚合函数失效问题
核心思路
CL_SALV_TREE默认导出仅包含原始数据行,不会自动带出总计、小计和聚合计算结果。要解决该问题,需手动构建包含层级汇总数据的内表,再基于此内表完成导出,同时避开ADD-CORRESPONDING的使用限制。
具体解决方案
1. 提取树结构所有节点数据(含汇总行)
CL_SALV_TREE支持遍历所有节点,通过递归方式获取每个节点的显示数据(包括总计、小计行):
DATA: lo_node TYPE REF TO cl_salv_node, lt_export_data TYPE STANDARD TABLE OF <your_struct_type>, ls_export_data TYPE <your_struct_type>. " 获取根节点 lo_node = go_salv_tree->get_root_node( ). " 递归遍历所有节点 PERFORM traverse_nodes USING lo_node CHANGING lt_export_data. FORM traverse_nodes USING lo_node TYPE REF TO cl_salv_node CHANGING ct_data TYPE STANDARD TABLE OF <your_struct_type>. DATA: ls_node_data TYPE <your_struct_type>. " 获取当前节点经聚合计算后的显示数据 lo_node->get_data( IMPORTING data = ls_node_data ). APPEND ls_node_data TO ct_data. " 遍历子节点 DATA: lt_children TYPE cl_salv_node=>tt_nodes, lo_child TYPE REF TO cl_salv_node. lt_children = lo_node->get_children( ). LOOP AT lt_children INTO lo_child. PERFORM traverse_nodes USING lo_child CHANGING ct_data. ENDLOOP. ENDFORM.
若存在折叠节点,需先调用lo_node->expand( )展开所有节点再遍历,避免遗漏子节点数据
2. 手动实现字段汇总替代ADD-CORRESPONDING
OO环境下无法使用ADD-CORRESPONDING,可通过手动累加或动态字段处理实现汇总:
方式1:手动累加数值字段(适合字段较少的场景)
DATA: ls_total TYPE <your_struct_type>. LOOP AT lt_original_data INTO ls_original. ls_total-quantity = ls_total-quantity + ls_original-quantity. ls_total-amount = ls_total-amount + ls_original-amount. " 其他需聚合的数值字段依次处理 ENDLOOP. " 将总计行加入导出内表 APPEND ls_total TO lt_export_data.
方式2:动态字段处理(适合字段较多的场景)
DATA: lo_struct_descr TYPE REF TO cl_abap_structdescr, lt_components TYPE cl_abap_structdescr=>component_table, ls_component TYPE cl_abap_structdescr=>component. lo_struct_descr ?= cl_abap_typedescr=>describe_by_data( ls_total ). lt_components = lo_struct_descr->get_components( ). LOOP AT lt_components INTO ls_component. " 判断是否为数值类型字段 IF ls_component-type_kind = 'N' OR ls_component-type_kind = 'P'. ASSIGN COMPONENT ls_component-name OF STRUCTURE ls_total TO FIELD-SYMBOL(<fs_total>). ASSIGN COMPONENT ls_component-name OF STRUCTURE ls_original TO FIELD-SYMBOL(<fs_original>). IF <fs_total> IS ASSIGNED AND <fs_original> IS ASSIGNED. <fs_total> = <fs_total> + <fs_original>. ENDIF. ENDIF. ENDLOOP.
3. 基于构建好的内表实现Excel导出
可通过CL_SALV_TABLE或GUI_DOWNLOAD完成导出:
方式1:用CL_SALV_TABLE导出为XLSX
DATA: lo_salv_table TYPE REF TO cl_salv_table. CALL METHOD cl_salv_table=>factory EXPORTING list_display = abap_false IMPORTING r_salv_table = lo_salv_table CHANGING t_table = lt_export_data. " 设置导出参数 DATA: lo_export TYPE REF TO cl_salv_export. lo_export = lo_salv_table->get_export( ). lo_export->set_filename( 'SALV_TREE_EXPORT.xlsx' ). lo_export->set_format( if_salv_c_export=>format_xlsx ). " 执行导出 lo_salv_table->export( ).
方式2:用GUI_DOWNLOAD导出为CSV(Excel可直接打开)
CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = 'C:\SALV_TREE_EXPORT.csv' filetype = 'ASC' write_field_separator = 'X' TABLES data_tab = lt_export_data EXCEPTIONS file_write_error = 1 OTHERS = 99. IF sy-subrc <> 0. " 自定义错误处理逻辑 ENDIF.
关键注意事项
- 调用
get_data()时获取的是节点经聚合计算后的最终显示数据,而非原始行数据,确保汇总值准确。 - 动态处理字段时,需严格判断字段类型,避免对非数值字段执行累加操作。
内容的提问来源于stack exchange,提问作者Adrian Cardenas
相关产品推荐
相关产品推荐

