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 内部初始化:

这里调用静态方法 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 程序交互。


相关文章
|
5天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
23 0
|
5天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
28 0
|
5天前
aspose实现word,excel等文件预览
aspose实现word,excel等文件预览
|
2天前
|
JSON Rust 前端开发
【sheetjs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了如何使用`sheetjs`的`xlsx`库在前端实现Excel的导出和上传。项目依赖包括Vite、React、SheetJS和Arco-Design。对于导出,从后端获取JSON数据,通过`json_to_sheet`、`book_new`和`writeFile`函数生成并下载Excel文件。对于上传,使用`read`函数将上传的Excel文件解析为JSON并发送至后端。完整代码示例可在GitHub仓库[fullee/sheetjs-demo](https://github.com/fullee/sheetjs-demo)中查看。
33 10
|
4天前
|
Java Apache 索引
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
|
5天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
30 0
|
5天前
|
图形学
R语言其他相关函数(各函数解析含实例,可供查询)
R语言其他相关函数(各函数解析含实例,可供查询)
9 0
|
5天前
|
Python
python如何读取excel文件,并修改内容?
python如何读取excel文件,并修改内容?
22 0
|
5天前
|
XML 存储 安全
基于 ABAP OLE 和 abap2xlsx 两种技术方案对 Excel 文件进行读写的优缺点比较
基于 ABAP OLE 和 abap2xlsx 两种技术方案对 Excel 文件进行读写的优缺点比较
5 0
|
5天前
|
数据挖掘 数据处理 索引
使用Pandas从Excel文件中提取满足条件的数据并生成新的文件
使用Pandas从Excel文件中提取满足条件的数据并生成新的文件
8 1

推荐镜像

更多
http://www.vxiaotou.com