建议收藏 ABAP 随笔 EXCEL4批量导入推荐

作者:SAPTAB 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图

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

**点击蓝字关注我们**

富强 民主 文明 和谐

自由 平等 公正 法制

爱国 敬业 诚信 友善

_**01** _

**Excel批量导入3-CL_XLSX_DOCUMENT**

**不念过** **去**

**START**

**不畏将来**

我是如何接触到这个类的呢,就要感谢Wang Jerry 的一篇文章。感谢sap研究院大佬让我更透彻的了解了一下XLSX其实就是多个XML文件组合成的。

链接如下: [ 使用ABAP操作Excel的几种方法

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

下面看我的程序:

建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图

_DATA_ error_text  _TYPE_ string.

_lv_filename = p_file._

_ _ _ CHECK _ _ lv_filename _ _ IS _ _ NOT _ _ INITIAL _ _ . _ _ _ _

CALL _ _ METHOD _ _ zcl_document_jxzhu=>import_document_from_frontend " _ _ 调用方法获取 _ _ Excel _ _ 数据 _ _ _ _ EXPORTING _ _ pi_filename = lv_filename "

_ _ 文件路径 _ _ * pi_sheetname = 'Sheet1' "sheet _ _ 页名称 _ _ * start_row = '2'

" _ _ 开始获取的行号 _ _ check_structure = abap_on " _ _ 是否匹配结构去获取 _ _ excel _ _

数据( _ _ X _ _ 为 _ _ excel _ _ 排列顺序和内表字段顺序无关 _ _ , _ _ 仅用结构来匹配) _ _ _ _

IMPORTING _ _ error_text = error_text " _ _ 错误消息 _ _ _ _ CHANGING _ _

pt_tab = lt_zmmt001 _ _ _ _ EXCEPTIONS _ _ file_open_error = _ _ 1 _ _

OTHERS = _ _ 2 _ _ . _ _ _ _ IF _ _ sy-subrc <> _ _ 0 _ _ . _ _ *

Implement suitable error handling here _ _ _ _ ENDIF _ _ . _ _

cl_demo_output=>display( lt_zmmt001 ). _

---

*create a xlsx handler

DATA(xlsxhandler) = cl_ehfnd_xlsx=>get_instance( ).

*open xlxs into xstring

DATA(xstring_excel) = cl_openxml_helper=>load_local_file( pi_filename ).

*load the xlsx

DATA(xlsxdocument) = xlsxhandler->load_doc( iv_file_data = xstring_excel ).

*extract data from sheet ( pi_sheetname)

DATA(firstsheet) = xlsxdocument->get_sheet_by_name( iv_sheet_name =

pi_sheetname ). ”根据传入的sheet名称获取sheet ‍

*extract data from first sheet

firstsheet = xlsxdocument->get_sheet_by_id( iv_sheet_id = 1 ).

"获取第一个sheet页

"check file structure, first line of excel file

DATA(columncount) = firstsheet->get_last_column_number_in_row( 1 ).

DATA column TYPE i VALUE 1.

"获取第一行有多少列,为下面循环赋值做准备

*get the components of structure 得到内表的组成字段属性

DATA lw_tab_ref TYPE REF TO data.

CREATE DATA lw_tab_ref LIKE LINE OF pt_tab.

DATA tablestructure TYPE REF TO cl_abap_structdescr.

tablestructure ?= cl_abap_typedescr=>describe_by_data_ref( lw_tab_ref ).

DATA(tablecomponents) = tablestructure->get_components( ).

"get the content of excel. 将excel结构和内表结构对比,判断是否一致

TYPES: BEGIN OF columninfo,

column TYPE i,

columnname TYPE string,

END OF columninfo.

TYPES columnsinfo TYPE STANDARD TABLE OF columninfo

WITH EMPTY KEY.

DATA columnfromfile TYPE columnsinfo.

IF check_structure = abap_on.

• get the title row compare with tab structure if need

DO columncount TIMES.

DATA(cellvalue) = firstsheet->get_cell_content(

EXPORTING

iv_row = 1

iv_column = column ).

APPEND INITIAL LINE TO columnfromfile

ASSIGNING FIELD-SYMBOL(<columnfromfile>).

<columnfromfile>-column = column.

<columnfromfile>-columnname = cellvalue.

IF line_exists( tablecomponents[ name = cellvalue ] ).

DELETE tablecomponents WHERE name = cellvalue.

ELSE.

error_text = error_text && |,{ cellvalue }|.

ENDIF.

column = column + 1.

ENDDO. IF error_text IS NOT INITIAL.

MESSAGE e001(00) RAISING file_open_error WITH error_text.

ENDIF. ENDIF.

• get the title row compare with tab structure if need

*get data of excel 获取excel的内容

*有按照结构来获取数据,和按照列的顺序来获取excel数据

CASE check_structure.

WHEN abap_on.

"按照字段对应获取数据

WHILE currentrow <= rowcount.

APPEND INITIAL LINE TO pt_tab ASSIGNING

FIELD-SYMBOL(<currentrow>).

LOOP AT columnfromfile

REFERENCE INTO DATA(currentcolumn).

cellvalue = firstsheet->get_cell_content(

EXPORTING

iv_row = currentrow

iv_column = currentcolumn->*-column ).

ASSIGN COMPONENT currentcolumn->*-columnname

OF STRUCTURE <currentrow> TO FIELD-SYMBOL(<cellvalue>).

<cellvalue> = cellvalue.

ENDLOOP.

currentrow = currentrow + 1.

ENDWHILE.

WHEN OTHERS.

"按照顺序获取数据

CLEAR column.

WHILE currentrow <= rowcount.

APPEND INITIAL LINE TO pt_tab ASSIGNING <currentrow>.

DO columncount TIMES.

column = column + 1.

cellvalue = firstsheet->get_cell_content(

EXPORTING iv_row = currentrow

iv_column = column ).

ASSIGN COMPONENT column

OF STRUCTURE <currentrow> TO <cellvalue>.

<cellvalue> = cellvalue.

ENDDO.

CLEAR column.

currentrow = currentrow + 1.

ENDWHILE. ENDCASE.

** 要是这些代码不够明确,点击原文链接可以去我的博客查看源代码,SE24创建方法直接使用哦。 **

结合前 2 天的随笔,一共给出 3 种 excel 导入的方法,掌握应该是第一种最容易掌握,当然第一种缺点也最大。

比较一下三种方法在效率上的区别:导入 100 条数据测试

1.ALSM_EXCEL_TO_INTERNAL 方法:用时 7 秒

建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图

2\. 客制 OLE- 突破 9999 行的限制 用时 6 秒 (其实都是 ole 和 1 差不多也是正常 )

建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图

3.CL_EHFND_XLSX 类 用时 2 秒

建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图

由以上可得,同学们可以多花心思研究下 XML 方式导入 excel ,以后就可以不用 OLE ,又快又舒服。

-Tab Zhu 不念过去 不畏将来

**不念过** **去**

**END**

**不畏将来**

建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图
建议收藏 ABAP 随笔 EXCEL4批量导入推荐 - 封面图

**SAP ABAP TAB**

微信号 : TAB_JXZHU

后台回复'ABAP'免费领取学习资料

长按二维码关注我们

SAPTAB

关于作者:SAPTAB

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

来源说明:本文内容由「建议收藏ABAP随笔EXCEL4批量导入推荐.md」整理生成,仅用于内部技术分享与学习交流。