改写来源:How to Read an Uploaded Excel File in SAP ABAP
在 SAP 项目中,业务用户经常希望通过 Excel 批量导入主数据、配置项或交易数据。ABAP 本身不直接原生支持现代 Office 格式,但借助开源项目 abap2xlsx 提供的类与接口,可以很方便地在 ABAP 中读取 .xls 和 .xlsx 文件。
本文面向 ABAP 开发顾问,演示一个完整的读取 Excel 文件示例:从弹出文件选择对话框,到使用 zcl_excel_reader_2007 读取工作表内容并输出。
读取 Excel 的关键步骤如下:
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.| 对象/语句 | 作用 |
|---|---|
cl_gui_frontend_services=>file_open_dialog | 调用操作系统文件对话框,让用户选择本地 Excel 文件。 |
zif_excel_reader | abap2xlsx 提供的 Excel 读取器接口。 |
zcl_excel_reader_2007 | .xlsx 格式读取器实现类。 |
load_file( ) | 将文件加载为 Excel 工作簿对象。 |
get_active_worksheet( ) | 获取用户保存时处于活动状态的工作表。 |
sheet_content | 包含所有单元格数据的内表,字段包括坐标、值、公式、数据类型等。 |
LOOP AT ... GROUP BY | 按行分组遍历,方便按行处理数据。 |
通过 sheet_content 可以拿到以下常用字段:
| 字段 | 含义 |
|---|---|
cell_coords | 单元格坐标,例如 A1、B2。 |
cell_value | 单元格的值。 |
cell_formula | 单元格公式(如果有)。 |
data_type | 数据类型。 |
cell_column | 列号。 |
cell_row | 行号。 |
cell_style | 单元格样式。 |