SAP ABAP 教程:如何读取上传的 Excel 文件(XLS/XLSX)

作者:郑德鼎 约 5 分钟阅读 更新日期:2026-07-17 内容较新 标签:ABAP, Excel, 文件上传, 数据导入, abap2xlsx, 开发
目录
改写来源:How to Read an Uploaded Excel File in SAP ABAP

在 SAP 项目中,业务用户经常希望通过 Excel 批量导入主数据、配置项或交易数据。ABAP 本身不直接原生支持现代 Office 格式,但借助开源项目 abap2xlsx 提供的类与接口,可以很方便地在 ABAP 中读取 .xls.xlsx 文件。

本文面向 ABAP 开发顾问,演示一个完整的读取 Excel 文件示例:从弹出文件选择对话框,到使用 zcl_excel_reader_2007 读取工作表内容并输出。


1. 适用场景


2. 前置条件

  1. SAP 系统中已安装 **abap2xlsx** 项目(提供 `zif_excel_reader`、`zcl_excel_reader_2007` 等类/接口)。
  2. 开发环境支持 ABAP Objects 和 TRY...CATCH 语法(推荐 NW 7.40 及以上)。
  3. 运行程序的用户拥有访问本地文件对话框的权限(GUI 前台运行)。

3. 核心思路

读取 Excel 的关键步骤如下:

  1. 使用 `cl_gui_frontend_services=>file_open_dialog` 弹出文件选择框。
  2. 使用 `zcl_excel_reader_2007` 加载文件。
  3. 获取活动工作表(active worksheet)。
  4. 遍历工作表的 `sheet_content` 内表,读取单元格数据。

4. 完整示例代码

REPORT z_read_excel_file. PARAMETERS pa_funcname TYPE file_table-filename OBLIGATORY. *--------------------------------------------------------------------* * 选择屏幕的 F4 帮助:弹出文件选择对话框 *--------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_funcname. DATA lv_return TYPE i. DATA lv_user_action TYPE i. DATA it_filetable TYPE filetable. CLEAR it_filetable. TRY. cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |xls (*.xls)\|*.xls\|{ cl_gui_frontend_services=>filetype_all }| multiselection = abap_false CHANGING file_table = it_filetable rc = lv_return user_action = lv_user_action ). IF lv_user_action EQ cl_gui_frontend_services=>action_ok. IF lines( it_filetable ) > 0. pa_funcname = it_filetable[ 1 ]-filename. ENDIF. ENDIF. CATCH cx_root INTO DATA(e_error_message). MESSAGE e_error_message->get_text( ) TYPE 'I'. ENDTRY. *--------------------------------------------------------------------* * 主程序:读取 Excel 内容 *--------------------------------------------------------------------* START-OF-SELECTION. TRY. " 创建 reader 对象 DATA(lo_excel_reader) = CAST zif_excel_reader( NEW zcl_excel_reader_2007( ) ). " 加载本地 Excel 文件 DATA(lo_excel_file) = lo_excel_reader->load_file( pa_funcname ). " 获取活动工作表 DATA(lo_active_sheet) = lo_excel_file->get_active_worksheet( ). " 遍历工作表内容 LOOP AT lo_active_sheet->sheet_content ASSIGNING FIELD-SYMBOL(<cell>) GROUP BY <cell>-cell_row ASSIGNING FIELD-SYMBOL(<row>). LOOP AT GROUP <row> ASSIGNING FIELD-SYMBOL(<cell_data>). WRITE: / <cell_data>-cell_coords, <cell_data>-cell_value, <cell_data>-cell_formula, <cell_data>-data_type, <cell_data>-cell_column, <cell_data>-cell_row, <cell_data>-cell_style. ENDLOOP. ENDLOOP. CATCH cx_root INTO DATA(e_error_message). WRITE: / e_error_message->get_text( ). ENDTRY.

5. 代码说明


6. 可获取的单元格信息

对象/语句作用
cl_gui_frontend_services=>file_open_dialog调用操作系统文件对话框,让用户选择本地 Excel 文件。
zif_excel_readerabap2xlsx 提供的 Excel 读取器接口。
zcl_excel_reader_2007.xlsx 格式读取器实现类。
load_file( )将文件加载为 Excel 工作簿对象。
get_active_worksheet( )获取用户保存时处于活动状态的工作表。
sheet_content包含所有单元格数据的内表,字段包括坐标、值、公式、数据类型等。
LOOP AT ... GROUP BY按行分组遍历,方便按行处理数据。

通过 sheet_content 可以拿到以下常用字段:


7. 常见注意事项

  1. **abap2xlsx 不是 SAP 标准组件**:如果系统尚未安装,需要先从 GitHub 导入 abap2xlsx 项目。生产环境使用前请评估维护策略。
  2. **前台运行**:`file_open_dialog` 需要 SAP GUI 前台环境,后台作业(Background Job)无法使用。
  3. **大文件性能**:对于非常大的 Excel 文件,建议先让用户按模板整理数据,避免一次性读取过多行导致内存压力。
  4. **数据校验**:读取到 ABAP 内表后,建议对每一行进行类型、长度、必输字段等校验,再写入 SAP 表。

8. 最佳实践


9. 参考来源

字段含义
cell_coords单元格坐标,例如 A1B2
cell_value单元格的值。
cell_formula单元格公式(如果有)。
data_type数据类型。
cell_column列号。
cell_row行号。
cell_style单元格样式。

相关指南

郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文由 SAP 技术资料改写整理,仅供学习交流。