原创 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)
下面看我的程序:
_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 columnfromfileASSIGNING 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 ASSIGNINGFIELD-SYMBOL(<currentrow>).
LOOP AT columnfromfileREFERENCE 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 条数据测试
2\. 客制 OLE- 突破 9999 行的限制 用时 6 秒 (其实都是 ole 和 1 差不多也是正常 )
由以上可得,同学们可以多花心思研究下 XML 方式导入 excel ,以后就可以不用 OLE ,又快又舒服。
-Tab Zhu 不念过去 不畏将来
**不念过** **去**
**END**
**不畏将来**
**SAP ABAP TAB**
微信号 : TAB_JXZHU
后台回复'ABAP'免费领取学习资料
长按二维码关注我们