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


    本文是这篇文章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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    执行之后,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 程序交互。

  • 相关阅读:
    【STM32】两个版本MDK搭建和三种调试器的使用
    Tomcat WebSokcet 拒绝服务(CVE-2020-13935)
    websocket学习
    [Lua][Love] 有效碰撞处理の类别与位掩码 | fixture:setFilterData
    Spring+SpringBoot+SpringCloud全攻略
    记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)
    soildworks2022如何快速更改草图基准面?
    Python武器库开发-常用模块之subprocess模块(十九)
    SQL Server 阻止了对组件 ‘Ole Automation Procedures‘ 的 过程‘sys.sp_OACreate‘ 的访问
    odoo javascript参考(七)
  • 原文地址:https://blog.csdn.net/i042416/article/details/125397949