前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP随笔-关于ECC后台server读取Excel方案的想法

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

作者头像
Tab Zhu
发布2022-06-27 19:01:38
1.2K1
发布2022-06-27 19:01:38
举报
文章被收录于专栏:TAB的coding生活TAB的coding生活

ECC系统后台读取Excel方案的想法


我之前在文章(Excel批量导入)中提到过使用CL_XLSX_DOCUMENT来处理excel,此时EXCEL文件被当作多个xml文件来出了,速度和效率上有了很大的提升。但是需要使用cl_ehfnd_xlsx这个类来得到EXCEL的单元格的值,发现很多客户还在使用ERP ECC6.0 ON HANA 的架构,所以系统里面没有这个类。我们可以看到这个类是属于该S4的组件


想到如果从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类我们能够得出答案

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

同时还包括了3个STRANS:

  • ehfnd_exp_xlsx_get_sheet_names
  • ehfnd_exp_xlsx_get_strings
  • ehfnd_exp_xlsx_read_sheet

我们先来了解下,从MS2007开始,微软采用了支持open xml的格式来管理excelJerry大神的文章也有提到,所以我们将excel扩展名从xlsx改为zip,然后打开

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

  1. ehfnd_exp_xlsx_get_sheet_names 解析workbook.xml,来获取sheet的name,id,rID
  1. ehfnd_exp_xlsx_get_strings 解析sharedStrings.xml
  1. ehfnd_exp_xlsx_read_sheet 解析sheet.xml

调用程序demo

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

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

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

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

代码语言:javascript
复制
*前后台处理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 ).

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

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

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

ABAP随笔-EXCEL笔记 7-批量导出CL_XLSX_DOCUMENT

Excel高效输出工具-XLSX Workbench

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAP TAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ECC系统后台读取Excel方案的想法
    • 调用程序demo
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档