SAP-ABAP:Excel 文件内容解析到 ABAP 内表函数ALSM_EXCEL_TO_INTERNAL_TABLE运用详解
📌 一、核心功能
ALSM_EXCEL_TO_INTERNAL_TABLE 是 SAP 标准函数,用于将 Excel 文件内容解析到 ABAP 内表: ✅ 支持格式:仅 .xls(不支持 .xlsx) ✅ 动态映射:自动将单元格映射到内表字段,无需预定义模板 ⛔ 局限性:
- 最大行数限制:65,536 行(Excel 97-2003 限制)
⚙️ 二、关键参数详解
输入参数
| | | | |
|---|
FILENAME | STRING | | | /usr/sap/tmp/PO_List.xls |
I_BEGIN_ROW | I | | | 2 |
I_END_ROW | I | | | 1000 |
I_BEGIN_COL | I | | | 1 |
I_END_COL | I | | | 5 |
输出结构
TYPES: BEGIN OF alsmex_tabline, row TYPE i, " Excel 行号 col TYPE i, " Excel 列号(A=1, B=2...) value TYPE string, " 单元格值(始终为字符串) END OF alsmex_tabline.DATA: gt_excel_data TYPE TABLE OF alsmex_tabline.
💻 三、最佳实践代码示例
REPORT z_excel_import." 1. 定义数据结构DATA: gt_intern TYPE TABLE OF alsmex_tabline, gv_filename TYPE string VALUE '/usr/sap/tmp/orders.xls', gt_orders TYPE TABLE OF zbapi_order, " 自定义订单结构 ls_order TYPE zbapi_order." 2. 检查文件可访问性OPEN DATASET gv_filename FOR INPUT IN BINARY MODE.IF sy-subrc <> 0. MESSAGE e001(00) WITH '文件无法访问'.ENDIF.CLOSE DATASET gv_filename." 3. 分块读取Excel(每次1000行)DO. lv_start_row = lv_next_row. lv_end_row = lv_start_row + 999. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = gv_filename i_begin_row = lv_start_row i_end_row = lv_end_row TABLES intern = gt_intern EXCEPTIONS OTHERS = 4. IF sy-subrc <> 0 OR gt_intern IS INITIAL. EXIT. " 退出循环 ENDIF. " 4. 映射到业务内表 LOOP AT gt_intern ASSIGNING FIELD-SYMBOL(<fs>). CASE <fs>-col. WHEN 1. ls_order-matnr = <fs>-value. " A列=物料号 WHEN 2. ls_order-menge = <fs>-value * 1. " B列=数量(字符串转数字) WHEN 3. ls_order-werks = <fs>-value. " C列=工厂 ENDCASE. " 行结束时保存数据 AT END OF row. APPEND ls_order TO gt_orders. CLEAR ls_order. ENDAT. ENDLOOP. lv_next_row = lv_end_row + 1.ENDDO." 5. 调用BAPI批量创建订单CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO' TABLES orders = gt_orders return = gt_return.
🚀 四、高级场景优化
场景 1:动态列映射(无需硬编码列号)
" 根据标题行动态确定列位置LOOP AT gt_intern INTO DATA(ls_cell) WHERE row = 1. " 标题行 CASE ls_cell-value. WHEN 'Material'. lv_matnr_col = ls_cell-col. WHEN 'Quantity'. lv_menge_col = ls_cell-col. ENDCASE.ENDLOOP." 数据处理循环中ls_order-matnr = gt_intern[ row = lv_row col = lv_matnr_col ]-value.
场景 2:处理空单元格与数据类型
" 空单元格处理IF <fs>-value IS INITIAL. ls_order-msgty = 'W'. " 警告日志ENDIF." 日期转换(Excel日期为数字)DATA(lv_excel_date) = <fs>-value.CALL FUNCTION 'OLE_CONVERT_DATETIME' EXPORTING ole_datetime = lv_excel_date IMPORTING sap_date = ls_order-deliv_date.
⚠️ 五、关键注意事项
权限问题
- 确保 SAP 应用服务器账号对文件路径有 读取权限
性能陷阱
" 错误做法:一次性读取10万行 -> 内存溢出风险CALL FUNCTION ... i_end_row = 0. " 0=读取所有行" 正确做法:分块读取(每次1000-5000行)DO. CALL FUNCTION ... i_end_row = lv_chunk_end.ENDDO.
格式兼容性
替代方案推荐
| 场景 | 推荐工具 |
|---|
.xlsx | CL_FDT_XL_SPREADSHEET |
| ABAP2XLSX |
| CL_GUI_FRONTEND_SERVICES |
🔧 六、异常处理模板
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' ... EXCEPTIONS inconsistent_parameters = 1 upload_ole = 2 OTHERS = 3.CASE sy-subrc. WHEN 1. RAISE EXCEPTION TYPE zcx_excel_error EXPORTING text = '行列参数冲突'. WHEN 2. " 检查文件是否被占用/损坏 MESSAGE e398(00) WITH '文件被锁定'. WHEN OTHERS. " 获取详细错误 MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDCASE.
💎 总结
- 适用场景:快速解析
.xls 文件的小规模数据导入(<1万行) - 必做优化
- 升级建议
- 新项目优先使用
ABAP2XLSX 或 CL_FDT_XL_SPREADSHEET
通过合理分块和错误处理,该函数仍可高效服务于传统接口场景。完整示例代码可在 SAP Note 2576376 获取。