SAP ABAP 解析 excel 文件的函数 TEXT_CONVERT_XLS_TO_SAP 单步执行分析

Posted JerryWang汪子熙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAP ABAP 解析 excel 文件的函数 TEXT_CONVERT_XLS_TO_SAP 单步执行分析相关的知识,希望对你有一定的参考价值。


本文是这篇文章SAP ABAP 处理 Excel 的标准函数 TEXT_CONVERT_XLS_TO_SAP 介绍的后续。

在本地新建一个 excel 文件,内容如下:

SAP

使用下面的 ABAP 代码进行解析:

REPORT z.

TYPES: BEGIN OF ty_data,
field1 TYPE string,
field2 TYPE string,
END OF ty_data.

TYPES: tt_data TYPE TABLE OF ty_data.

DATA: lt_data TYPE tt_data,
lt_raw TYPE truxs_t_text_data.

CALL FUNCTION TEXT_CONVERT_XLS_TO_SAP
EXPORTING
i_line_header = abap_false
i_tab_raw_data = lt_raw
i_filename = C:\\temp\\1.xlsx
TABLES
i_tab_converted_data = lt_data
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.

WRITE:/ sy-subrc.

执行之后,excel 的数据,存储到 ABAP 变量 ​​lt_data​​ 里。

单步调试:调用 get_spreadsheet_interface, 输入参数为字符串 ​​Excel.Sheet​​, 其他 changing 参数都是 initial,这些参数都是在该 subroutine 内部初始化:

SAP

这里调用静态方法 ​​c_oi_container_control_creator=>get_container_control​​​,初始化 ​​OLE container​​:

SAP

可以看到走的是 ActiveX 技术:

SAP

OLE container 初始化成功:​​C_OI_CONTAINER_CONTROL​

SAP

接着创建一个名为 ​​TRUX_CONTAINER​​ 的 custom container:

SAP

获得 Excel 应用的代理类(​​document_proxy​​):

SAP

使用代理类打开本地 excel 文件:FILE://C:\\temp\\1.xlsx

SAP

这里的本质是,向本地电脑安装的 excel 执行文件,发送一个 ​​OpenDocument​​ 的命令:

SAP

这里通过普通的单步调试,无法进入 CALL_METHOD 内部:

SAP

需要打开 ABAP 调试器的系统程序调试功能(System Debugging On/Off):

SAP

SAP

通过 SAPGUI 的 OLE 容器,发送 ​​OpenDocument​​ 的命令:

SAP

凡是在 ABAP 调试器里以蓝色显示的调用栈,证明是 SAP ABAP 的系统程序,而非应用程序:

SAP

在函数 ​​AC_CALL_METHOD​​ 内部,调用的就是用 C/C++ 语言编写的 kernel 函数了,这些函数无法再在 ABAP 调试器里单步调试。

SAP

以上就是 ABAP 通过给 Excel.exe 发送 ​​OpenDocument​​ 打开 Excel 文件的实现过程。

我们安装一个名叫 ​​Process Explorer​​​ 的软件。
因为我们源代码里,指定的 TABLES 参数的数据类型,其行项目是一个包含 field1 和 field2 两个字段的结构,因此函数内部智能地决定读取第一张 spreadsheet 的前两列,读取行数的范围为 100:

SAP

ABAP 通过所谓的 range,来描述待读取 Excel 数据的范围。

这里代码第 88 行 l_range_list 变量,内容如下:

SAP

SAP

代码第 93 行的 ​​get_ranges_data​​ 方法执行完毕之后,range 指定范围的数据,就读取到内表 l_table_range 里了:

SAP

如下图所示:

SAP

这里采取的仍然是通过 OLE 代理对象,向本地 excel.exe 发送命令的方式来完成:

SAP

我们下载一个名叫 ​​Process Explorer​​的进程管理工具,执行后,在路径 wininit.exe-services.exe-svhost.exe 下面,能发现 SAPGUI 里执行上述 ABAP 程序,所启动的 excel.exe 进程:

SAP

双击上图图例4,能看到 excel.exe 的启动参数 ​​-Embedding​​,证明 ABAP 程序确实通过 OLE 技术同本地的 Excel 程序交互。

SAP


以上是关于SAP ABAP 解析 excel 文件的函数 TEXT_CONVERT_XLS_TO_SAP 单步执行分析的主要内容,如果未能解决你的问题,请参考以下文章

ABAP系列SAP 的逻辑数据库解析

sap abap如何生成Excel,但Excel有多个sheet,然后并将Excel压缩打包后 发邮件

ABAP系列SAP ABAP DOI展示EXCEL或WORD

使用Excel调用ABAP系统的函数

ABAP学习:操作EXCEL

ABAP系列SAP ABAP SY-SUBRC的含义解析