ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法

作者:SAPTAB 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, SD, 开发, 数据工程, 销售分销
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

原创 Tab Zhu [ SAP TAB ](javascript:void\(0\);)

我之前在文章( [ Excel批量导入

](https://mp.weixin.qq.com/s?__biz=MzUxODI4MTQyMg==&mid=2247483812&idx=1&sn=6b597a2f98e614c7b4ed5485ee6e14ec&chksm=f98a0005cefd89137c0828ed9ca3089e800eb18ad06d258d8d45372bfc7f56f0d530dcb72588&token=1386289156&lang=zh_CN&scene=21#wechat_redirect)

)中提到过使用CL_XLSX_DOCUMENT来处理excel,此时EXCEL文件被当作多个xml文件来出了,速度和效率上有了很大的提升。但是需要使用cl_ehfnd_xlsx这个类来得到EXCEL的单元格的值,发现很多客户还在使用ERP

ECC6.0 ON HANA 的架构,所以系统里面没有这个类。我们可以看到这个类是属于该S4的组件

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

想到如果从SAP服务器上获取某路径的EXCEL文件,需要读取其中的数据进行逻辑处理,处理的方式大多数为后台自动处理处理,因为sap服务器一般是不能够使用MS软件来处理EXCEL文件的,所以我想到了把cl_ehfnd_xlsx其中的逻辑搬运到ECC

6.0系统的想法. 我在查找资料的时候发现网上有以下资料进行借鉴

XLSX Upload – a unified

approach(https://archive.sap.com/kmuuid2/6026d7c0-c716-3010-c8be-

ea771ff9d783/XLSX%20Upload%20-%20A%20Unified%20Approach.pdf)

但是它有个问题就是每次都需要重新写STRANS程序,然后co_sheet_xml=2 和 co_shared_str_xml = 3

固定,我debug下来发现存放内容xml不一定是在2和3的位置,所有有的excel直接退出

我在想能不能搞个通用的class来处理这个后台sever上读取excel数据的问题: 参考 **S_OOXML_XLSX** 类我们能够得出答案

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

废话不多说,下面开始讲解哈 我把读取excel需要用到的类全部从CL_EHFND_XLSX中拆解处理,包括了以下这几个类

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

同时还包括了3个STRANS

• ehfnd_exp_xlsx_get_sheet_names

• ehfnd_exp_xlsx_get_strings

• ehfnd_exp_xlsx_read_sheet

我们先来了解下,从MS2007开始,微软采用了支持open xml的格式来管理excel [ Jerry大神的文章也有提到

](https://mp.weixin.qq.com/s?__biz=MzI3MDE4MjM5Mg==&mid=2247488360&idx=1&sn=d63e0d160ecaca4472fb307c97acda18&scene=21#wechat_redirect)

,所以我们将excel扩展名从xlsx改为zip,然后打开

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

我们可以看出来XLSX文件是由多个xml文件组成的,这样我们自然就从处理excel变成了处理XML。其中

1. ehfnd_exp_xlsx_get_sheet_names 解析workbook.xml,来获取sheet的name,id,rID ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

2. ehfnd_exp_xlsx_get_strings 解析sharedStrings.xml

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

3. ehfnd_exp_xlsx_read_sheet 解析sheet.xml ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

## 调用程序demo

我们可以从前台和后台或许excel文件来进行处理

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

调用ZCL_TAB_EXCEL类来处理excel,避免了OLE去打开MS应用,速度是非常快的

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

测试下从前后端读取EXCEL到显示的时间分别为:0.22秒和0.004秒,这是相当快的了

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

而且读取3条数据是0.226秒,而我把数据扩展到500多条时,花费的时间也就是0.258秒

ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

*前后台处理excel call demo.abap

*&---------------------------------------------------------------------*

*& Report ZTAB_ZHU_XLSX_02

*&---------------------------------------------------------------------*

*&=====================================================================*

*& create date: 20220514

*& created by: tab-zhu (微信公众号:tab_jxzhu)

*&---------------------------------------------------------------------*

REPORT ztab_zhu_xlsx_02.

*Constants

DATA:BEGIN OF ls_data,

a TYPE string,

b TYPE string,

c TYPE string,

END OF ls_data.

DATA lt_data LIKE STANDARD TABLE OF ls_data.

*Global data

DATA : l_len TYPE sy-tabix.

DATA : l_filename TYPE authb-filename.

DATA l_subrc TYPE sy-subrc.

DATA: l_lines TYPE i. DATA: l_xstring TYPE xstring. DATA: li_e_rcgrepfile_tab TYPE cpt_x255,

li_xtab TYPE cpt_x255.

DATA lst_rcgrepfile TYPE cps_x255.

DATA: l_file_content TYPE xstring.
DATA:BEGIN OF gt_tab OCCURS 0,

a1 TYPE string,

a2 TYPE string,

a3 TYPE string,

END OF gt_tab.

DATA e_file_size TYPE drao-orln.

DATA e_lines TYPE i.

SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-s01. PARAMETERS:rb_01 RADIOBUTTON GROUP gp1,

rb_02 RADIOBUTTON GROUP gp1.

PARAMETERS:i_file TYPE rlgrap-filename DEFAULT '/usr/sap/S4H/SYS/src/test.xlsx'. SELECTION-SCREEN END OF BLOCK blk.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR i_file.

i_file = cl_openxml_helper=>browse_local_file_open(

iv_title = 'Select XLSX File'

iv_filename = ''

iv_extpattern = 'Excel(*.xlsx)|*.xlsx|All files(*.*)|*.*' ).

START-OF-SELECTION.

CASE abap_on.

WHEN rb_02.

• assign value

l_filename = i_file.

• check the authority for file

CALL FUNCTION 'AUTHORITY_CHECK_DATASET'

EXPORTING

• PROGRAM =

activity = sabc_act_read

• Authority Check allows right now only 60 Character

filename = l_filename(60)

EXCEPTIONS

no_authority = 1

activity_unknown = 2

OTHERS = 3.

IF sy-subrc <> 0. RAISE no_permission. ENDIF.

• read the raw-file from the appl.server

CLEAR l_subrc.

OPEN DATASET i_file FOR INPUT IN BINARY MODE.

l_subrc = sy-subrc.

IF sy-subrc <> 0 OR

l_subrc <> 0.

RAISE open_failed. ENDIF.

DO.

CLEAR l_len.

CLEAR lst_rcgrepfile.

READ DATASET i_file INTO lst_rcgrepfile LENGTH l_len.

IF sy-subrc <> 0. IF l_len > 0.

e_file_size = e_file_size + l_len.

APPEND lst_rcgrepfile TO li_e_rcgrepfile_tab. ENDIF.

EXIT.

ENDIF.

CONCATENATE l_file_content lst_rcgrepfile

INTO l_file_content IN BYTE MODE.

e_file_size = e_file_size + l_len.

APPEND lst_rcgrepfile TO li_e_rcgrepfile_tab. ENDDO. IF sy-subrc > 10. RAISE read_error. ENDIF.

DESCRIBE TABLE li_e_rcgrepfile_tab LINES e_lines.

CLOSE DATASET i_file.

IF li_e_rcgrepfile_tab[] IS NOT INITIAL.

li_xtab[] = li_e_rcgrepfile_tab[].

ENDIF.

*Convert data to xstring

cl_scp_change_db=>xtab_to_xstr( EXPORTING im_xtab = li_xtab

im_size = l_lines

IMPORTING ex_xstring = l_xstring ).

WHEN rb_01.

DATA lv_filename TYPE string.

lv_filename = i_file. TRY. l_xstring = cl_openxml_helper=>load_local_file( lv_filename ). "获取excel路径 为 xstring格式 CATCH cx_openxml_not_found INTO DATA(openxml_not_found).

RETURN.

ENDTRY. ENDCASE.

DATA lo_tab_excel TYPE REF TO zcl_tab_excel.

CREATE OBJECT lo_tab_excel.

"mo_xlsx_document

CALL METHOD lo_tab_excel->load_doc( iv_file_data = l_xstring ).

lo_tab_excel->initialize( ).

DATA(lo_sheet) = lo_tab_excel->get_sheet_by_name( 'Sheet1' ). DATA(ls_sheet_data) = lo_tab_excel->get_sheet_data( lo_sheet ).

"获取第1行列数 (一共几列)

DATA(ls_last_columns) = lo_tab_excel->get_last_column_number_in_row( 1 ).

"获取行数

DATA(ls_last_rows) = lo_tab_excel->get_last_row_number( ).

DATA(startrow) = 1.

WHILE startrow <= ls_last_rows.

CLEAR ls_data.

DO ls_last_columns TIMES.

DATA(currentcolumn) = sy-index.

DATA(lv_content) = lo_tab_excel->get_cell_content(

iv_row = startrow

iv_column = currentcolumn

).

ASSIGN COMPONENT currentcolumn OF STRUCTURE ls_data TO FIELD-SYMBOL(<fs_any>).

IF sy-subrc EQ 0. <fs_any> = lv_content. ENDIF. ENDDO. APPEND ls_data TO lt_data.

startrow = startrow + 1.

ENDWHILE.
cl_demo_output=>display( lt_data ).
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图
ABAP 随笔关于 ECC 后台 server 读取 Excel 方案的想法 - 封面图

需要ZCL_TAB_EXCEL类的同学 请后台回复 “ZCL_TAB_EXCEL”

更多其他的文章请点击历史记录

[ 【建议收藏】ABAP随笔-EXCEL-4-批量导入-推荐

](http://mp.weixin.qq.com/s?__biz=MzUxODI4MTQyMg==&mid=2247483812&idx=1&sn=6b597a2f98e614c7b4ed5485ee6e14ec&chk

...

SAPTAB

关于作者:SAPTAB

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

来源说明:本文内容由「ABAP随笔关于ECC后台server读取Excel方案的想法.md」整理生成,仅用于内部技术分享与学习交流。