乐趣区

关于abap:SAP-ABAP-解析-excel-文件的函数-TEXTCONVERTXLSTOSAP-单步执行分析

本文是这篇文章 SAP ABAP 解决 Excel 的规范函数 TEXT_CONVERT_XLS_TO_SAP 介绍的后续。

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

应用上面的 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 外部初始化:

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

能够看到走的是 ActiveX 技术:

OLE container 初始化胜利:C_OI_CONTAINER_CONTROL

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

取得 Excel 利用的代理类 (document_proxy):

应用代理类关上本地 excel 文件:FILE://C:\temp\1.xlsx

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

这里通过一般的单步调试,无奈进入 CALL_METHOD 外部:

须要关上 ABAP 调试器的零碎程序调试性能 (System Debugging On/Off):

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

但凡在 ABAP 调试器里以蓝色显示的调用栈,证实是 SAP ABAP 的零碎程序,而非应用程序:

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

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

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

ABAP 通过所谓的 range,来形容待读取 Excel 数据的范畴。

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

代码第 93 行的 get_ranges_data 办法执行结束之后,range 指定范畴的数据,就读取到内表 l_table_range 里了:

如下图所示:

这里采取的依然是通过 OLE 代理对象,向本地 excel.exe 发送命令的形式来实现:

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

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

退出移动版