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

简介: 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.

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


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

d36afd5a0ae466869e31c83d059740e8.png

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

670439b87d652f8e8db2a111b72d4488.png可以看到走的是 ActiveX 技术:

670439b87d652f8e8db2a111b72d4488 (2).png

OLE container 初始化成功:C_OI_CONTAINER_CONTROL

5b1ce117a144612aba5a31bbf243cbcc.png

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

5b1ce117a144612aba5a31bbf243cbcc.png7cd3727209ac99bab3edd4e795d79ed4.png

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


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

9ba90ae760774006ed923d746eaa672e.png

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

5550c8bf5ddea81ab0ddea0bb312aa00.png

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

70596bb82084a0540f96f401aa953eef.png

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

70596bb82084a0540f96f401aa953eef.png

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

9777b70db7cd27de62f51d19ca54a394.png

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

5550c8bf5ddea81ab0ddea0bb312aa00.png


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


5550c8bf5ddea81ab0ddea0bb312aa00 (1).png


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


我们安装一个名叫 Process Explorer 的软件。

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

a07b41c2f8d540a467ef0bcaf632c0c4.png

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


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

07b7fe01cee85c0afce73d8a1e84ea8c.png

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


12e0bddc565de702955079e9b8c22afc.png


如下图所示:

6733c38d12d70d220dacc078b2947721.png

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

07b7fe01cee85c0afce73d8a1e84ea8c.png

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


7fba6fb99aa578e3697652de50465ffa.png


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

36b57a854904101e3719b06558501665.png

目录
相关文章
|
1月前
|
easyexcel
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
|
2月前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
36 1
|
2月前
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
21 0
|
1月前
|
JavaScript 前端开发
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
|
1天前
aspose实现word,excel等文件预览
aspose实现word,excel等文件预览
|
1天前
【好书推荐6】《Excel函数与公式应用大全for Excel 365 & Excel 2021》
【好书推荐6】《Excel函数与公式应用大全for Excel 365 & Excel 2021》
12 5
|
2天前
|
easyexcel BI
excel合并列导出文件
excel合并列导出文件
|
10天前
|
JSON JavaScript 前端开发
使用JavaScript和XLSX.js将数据导出为Excel文件
使用JavaScript和XLSX.js将数据导出为Excel文件
21 0
|
13天前
|
NoSQL Python
在Python中,我们可以使用许多库来处理Excel文件
Python处理Excel常用pandas和openpyxl库。pandas的`read_excel`用于读取文件,`to_excel`写入;示例展示了数据框操作。openpyxl则用于处理复杂情况,如多工作表,`load_workbook`加载文件,`iter_rows`读取数据,`Workbook`创建新文件,写入单元格数据后保存。
22 1