如何将应用服务器存储的.xlsx文件读取到ABAP内表中
ABAP读取应用服务器存储的.xlsx文件到内表的解决方案
你的判断完全正确:ALSM_EXCEL_TO_INTERNAL_TABLE仅支持读取前端本地文件,无法直接访问应用服务器AL11路径下的资源;同时直接用OPEN DATASET按文本模式读取.xlsx文件也无法得到可解析的结构化数据,因为.xlsx本质是ZIP格式的压缩包,并非纯文本文件。
以下是两套可落地的解决方案:
方案1:使用SAP标准类CL_XLSX_DOCUMENT(推荐,无第三方依赖)
EHP5及以上版本的SAP系统自带该标准类,可直接解析应用服务器上的xlsx文件,操作步骤如下:
- 第一步:用
OPEN DATASET以二进制模式读取AL11路径下的.xlsx文件,存储到XSTRING类型变量中 - 第二步:调用
CL_XLSX_DOCUMENT的LOAD方法加载XSTRING数据,得到Excel文档实例 - 第三步:获取指定工作表的实例,遍历行/单元格数据,忽略第一行表头后写入自定义内表
示例代码片段:
DATA: lv_file_path TYPE string VALUE '/usr/sap/trans/你的文件路径.xlsx', " 替换为实际AL11路径 lv_xlsx_content TYPE xstring, lo_xlsx_doc TYPE REF TO cl_xlsx_document, lo_worksheet TYPE REF TO if_xlsx_worksheet, lt_cells TYPE if_xlsx_worksheet=>ty_sheet_cell_table, ls_cell LIKE LINE OF lt_cells, lt_final TYPE STANDARD TABLE OF 你自定义的内表类型, " 替换为你实际的内表结构 ls_final LIKE LINE OF lt_final. * 1. 二进制读取应用服务器上的xlsx文件 OPEN DATASET lv_file_path FOR INPUT IN BINARY MODE. IF sy-subrc = 0. READ DATASET lv_file_path INTO lv_xlsx_content. CLOSE DATASET lv_file_path. ELSE. " 自行添加路径不存在/无权限的异常处理逻辑 MESSAGE '文件读取失败' TYPE 'E'. ENDIF. * 2. 加载xlsx文档对象 lo_xlsx_doc = cl_xlsx_document=>load( iv_xlsx = lv_xlsx_content ). * 3. 获取目标工作表,可按需替换为你实际的工作表名称 lo_worksheet = lo_xlsx_doc->get_worksheet( iv_sheet_name = 'Sheet1' ). * 4. 获取工作表所有单元格数据 lt_cells = lo_worksheet->get_cells( ). * 5. 遍历单元格,跳过第一行表头,组装到目标内表 LOOP AT lt_cells INTO ls_cell WHERE row > 1. CASE ls_cell-col. WHEN 1. ls_final-字段1 = ls_cell-value. " 第一列对应内表字段1 WHEN 2. ls_final-字段2 = ls_cell-value. " 第二列对应内表字段2 " 依次补充20列对应的字段匹配逻辑 WHEN 20. ls_final-字段20 = ls_cell-value. " 第二十列对应内表字段20 ENDCASE. AT END OF row. APPEND ls_final TO lt_final. CLEAR ls_final. ENDAT. ENDLOOP.
方案2:低版本系统兼容方案
如果你的系统版本低于EHP5,没有预装CL_XLSX_DOCUMENT类,可使用中转方案实现:
- 用
OPEN DATASET读取应用服务器的xlsx文件,转存到前端本地临时目录 - 调用你熟悉的
ALSM_EXCEL_TO_INTERNAL_TABLE读取本地临时文件,数据处理完成后删除本地临时文件即可
注意事项
- 读取应用服务器文件前请先确认程序运行账号有对应AL11路径的读权限
- 若xlsx文件包含公式,
CL_XLSX_DOCUMENT默认读取的是单元格缓存的计算后展示值,无需额外处理公式逻辑
内容的提问来源于stack exchange,提问作者Stephon_Gordon
相关产品推荐
相关产品推荐

