在 SAP 服务器中解析 xlsx 文件

作者:郑德鼎 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, SD, 开发, 数据工程, 销售分销
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

在SAP服务器中解析 或下载 xlsx文件

在项目中难免会遇到这样的情况:客户的电脑在使用民用版的WPS,并且不能安装正版的微软Office。这种情况下,想使用SAP的Excel上传下载函数就困难重重。老函数可以支持xls的文件解析,但大数据文件还是xlsx好。然而xlsx的读取,基本上就是用OLE或者DOI来读取。这两种方案,前者依赖VB运行时组件,后者绑定微软Office,很显然不能解决我们的问题。这种情况下,我们只能希望让SAP自己去解析xlsx文件。

自从MS Office

2007之后,微软开始使用一套基于xml的文件格式。它会将数据、公式、格式等封装在不同的xml文件里,并用坐标关联起来。我们看一个例子:

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

这个表格有1-9一共9个数字,3X3排列。保存后,我们将xlsx文件修改扩展名称为zip,在路径\xl\worksheets中,找到sheet1的xml文件,打开。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

我们能看到,数据在结构sheetData-row-c-v中保存。

接下来,我们给文件加上选择框线,看有什么变化。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

可以看到row和c上出现了一些参数,同时sheetFormPr出现了outline相关的属性,通过这里是按照行合并,显示出全部框线这种样式。

接下来我们让第一行数据居中加粗,看下会发生什么。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

可以看到这里文档结构参数又发生了变化,第一行单元格的s参数为2,其他的s参数为1,sheetFormPr上的outline相关参数不见了,回到了第一版的样式。

我们看下其他目录下的文件。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

进入\xl\styles.xml,这里是存放所有样式的地方。之前的s参数,在这个文件中,对应count中的流水码参数。类似的格式,这里会合并在一个count类型中

接下来,我们为excel增加一行公式。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

第四行sum计算本列的合计。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

sheet1.xml中出现的第四行,c下出现f公式,这里v会记录下公式计算出来的结果,这样可以避免频繁的重复计算。

文档的结构先介绍到这里。回到我们的问题上。如何将这样的一个xlsx文件导入到SAP中?百度的话一般是建议使用abap2xlsx项目。通过这种方式,可以实现xlsx的读写。但确定就是开发量还是不小。写入的时候增加点开发量还能理解,但是单纯做个批导,都要对excel一顿操作,太浪费时间了。所以这里换一种方式来实现Excel的读取。

CL_EHFND_XLSX是ABAP 752

SP04中出现的一个新的系统标准类,它基于CL_XLSX_DOCUMENT,可以实现xlsx的导入导出。原始文档可以参考论坛:

https://community.sap.com/t5/application-development-blog-posts/excel-file-

xlsx-export-import/ba-p/13421913

通过这个类,可以简易的将excel的v参数读取到内表中,缺点就是它会丢失格式和公式。反向写入的时候,公式会被写入到v参数中,下载完excel后,需要手工将公式行敲回车,让Office自动修改成f公式+v值的形式。单纯的数据下载可以使用这个类来完成。

这里是我封装的SE24类,大家可以直接拿来用或者修改。

在 SAP 服务器中解析 xlsx 文 - 封面图
在 SAP 服务器中解析 xlsx 文 - 封面图

---

class ZCL_OPENXML_XLSX_ITAB definition public final create public .

public section.

types: BEGIN OF typ_alv, row TYPE i, col TYPE i, value TYPE string, END OF typ_alv . types: typ_t_alv TYPE TABLE OF typ_alv WITH DEFAULT KEY .

class-methods ANALYSIS_DOCUMENT importing value(PI_FILENAME) type /IWBEP/SB_ODATA_TY_CHAR_400SM value(PI_SHEETID) type I default 1 value(PI_SHEETNAME) type /IWBEP/SB_ODATA_TY_CHAR_400SM optional value(START_ROW) type I default 1 value(START_COL) type I default 1 changing value(END_ROW) type I default 0 value(END_COL) type I default 0 returning value(PT_TAB) type TYP_T_ALV exceptions FILE_OPEN_ERROR . class-methods DESERIALIZE_DOCUMENT importing value(PI_FILENAME) type /IWBEP/SB_ODATA_TY_CHAR_400SM value(PI_SHEETID) type I default 1 value(PI_SHEETNAME) type /IWBEP/SB_ODATA_TY_CHAR_400SM optional value(START_ROW) type I default 1 value(START_COL) type I default 1 value(PT_TAB) type ANY TABLE exceptions FILE_OPEN_ERROR . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS.

CLASS ZCL_OPENXML_XLSX_ITAB IMPLEMENTATION.

• ---------------------------------------------------------------------------------------+ * | Static Public Method ZCL_OPENXML_XLSX_ITAB=>ANALYSIS_DOCUMENT * +-------------------------------------------------------------------------------------------------+ * | [--->] PI_FILENAME TYPE /IWBEP/SB_ODATA_TY_CHAR_400SM * | [--->] PI_SHEETID TYPE I (default =1) * | [--->] PI_SHEETNAME TYPE /IWBEP/SB_ODATA_TY_CHAR_400SM(optional) * | [--->] START_ROW TYPE I (default =1) * | [--->] START_COL TYPE I (default =1) * | [<-->] END_ROW TYPE I (default =0) * | [<-->] END_COL TYPE I (default =0) * | [<-()] PT_TAB TYPE TYP_T_ALV * | [EXC!] FILE_OPEN_ERROR * +-------------------------------------------------------------------------------------- METHOD analysis_document.

DATA: error_text TYPE string, xstring_excel TYPE xstring.

CLEAR xstring_excel. *open xlsx into xstring TRY. DATA im_file_name TYPE string. im_file_name = pi_filename. xstring_excel = cl_openxml_helper=>load_local_file( im_file_name ). "获取excel路径 为 xstring格式 CATCH cx_openxml_not_found INTO DATA(openxml_not_found). error_text = openxml_not_found->get_text( ). ENDTRY. IF error_text IS NOT INITIAL. MESSAGE e001(00) RAISING file_open_error WITH error_text. ENDIF. *create a xlsx handler DATA(xlsxhandler) = cl_ehfnd_xlsx=>get_instance( )."创建了句柄

*load the xlsx TRY. DATA(xlsxdocument) = xlsxhandler->load_doc( iv_file_data = xstring_excel ). "加载excel CATCH cx_openxml_format INTO DATA(openxml_format). error_text = openxml_format->get_text( ). CATCH cx_openxml_not_allowed INTO DATA(openxml_not_allowed). error_text

...

郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「在SAP服务器中解析xlsx文件.md」整理生成,仅用于内部技术分享与学习交流。