美文网首页SAP
SAP 实施项目中涉及到编程方式操作 Excel 的几种场景介绍

SAP 实施项目中涉及到编程方式操作 Excel 的几种场景介绍

作者: _扫地僧_ | 来源:发表于2022-07-19 11:08 被阅读0次

    本文分享笔者在从事 SAP 项目开发工作中,涉及到的通过编程方式操作 Excel 的业务场景,希望起到抛砖引玉的作用。

    使用 Excel 导入数据到 SAP Cloud for Customer 系统

    假设要上传Account的数据到系统:
    点download metadata:

    自动download一个zip下来:

    在folder Templates里维护要上传的Account data:

    把维护好的excel重新打成zip, upload:

    稍后在monitor里会观察到成功上传的task:

    看到import成功的消息:

    UI上能搜索出这条于 2017-11-14 日创建的Account:

    如何通过 Excel import 的方式导入测试数据到 SAP Commerce Cloud 服务器

    登录 SAP Commerce Cloud Administration Cockpit,从下拉菜单里选择 Product Cockpit:

    点击这个箭头,打开 product 视图:

    点击这个 excel import 按钮:

    选择好 excel 和 media.zip 之后,点击 import:

    点击这个按钮查看 import 进度:


    进到 Backoffice 页面,根据 excel 里的 product id 查看一个 product,确保导入成功:

    使用 SAP ABAP 封装的 Office Integration class 访问本地 Excel 文件

    先看这个 report 执行的效果:打开本地 1.xlsx excel 文件:

    这个 Excel 内容如下:

    使用 get_ranges_data 方法,成功读取 Excel 的数据如下:


    本例完整代码如下:

    REPORT  Z_IMPORT.
    
    DATA:
    oref_container   TYPE REF TO cl_gui_custom_container,
    iref_control     TYPE REF TO i_oi_container_control,
    iref_document    TYPE REF TO i_oi_document_proxy,
    iref_spreadsheet TYPE REF TO i_oi_spreadsheet,
    iref_error       TYPE REF TO i_oi_error.
    
    DATA:
    v_document_url TYPE c LENGTH 256,
    i_sheets TYPE soi_sheets_table,
    wa_sheets TYPE soi_sheets,
    i_data        TYPE soi_generic_table,
    wa_data       TYPE soi_generic_item,
    i_ranges      TYPE soi_range_list,
    i_total       TYPE i,
    p_cols        TYPE i value 2.
    
    PARAMETERS:
    p_file  TYPE  localfile OBLIGATORY,
    p_rows  TYPE i DEFAULT 100 OBLIGATORY,
    p_mode TYPE c AS CHECKBOX.
    
    INITIALIZATION.
    
      CALL METHOD c_oi_container_control_creator=>get_container_control
         IMPORTING
           control = iref_control
           error   = iref_error.
    
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'E'.
      ENDIF.
    
      CREATE OBJECT oref_container
        EXPORTING
    *      parent                      =
           container_name              = 'CONTsadasda'
    *      style                       =
    *      lifetime                    = lifetime_default
    *      repid                       =
    *      dynnr                       =
    *      no_autodef_progid_dynnr     =
        EXCEPTIONS
           cntl_error                  = 1
           cntl_system_error           = 2
           create_error                = 3
           lifetime_error              = 4
           lifetime_dynpro_dynpro_link = 5
           OTHERS                      = 6.
      IF sy-subrc <> 0.
        MESSAGE e001(00) WITH 'Error while creating container'.
      ENDIF.
    
      CALL METHOD iref_control->init_control
        EXPORTING
    *      dynpro_nr                = SY-DYNNR
    *      gui_container            = ' '
           inplace_enabled          = 'X'
    *      inplace_mode             = 0
    *      inplace_resize_documents = ' '
    *      inplace_scroll_documents = ' '
    *      inplace_show_toolbars    = 'X'
    *      no_flush                 = ' '
    *      parent_id                = cl_gui_cfw=>dynpro_0
           r3_application_name      = 'EXCEL CONTAINER'
    *      register_on_close_event  = ' '
    *      register_on_custom_event = ' '
    *      rep_id                   = SY-REPID
    *      shell_style              = 1384185856
           parent                   = oref_container
    *      name                     =
    *      autoalign                = 'x'
        IMPORTING
           error                    = iref_error
    *      retcode                  =
        EXCEPTIONS
           javabeannotsupported     = 1
           OTHERS                   = 2
              .
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'E'.
      ENDIF.
    
      CALL METHOD iref_control->get_document_proxy
        EXPORTING
    *     document_format    = 'NATIVE'
          document_type      = soi_doctype_excel_sheet
    *     no_flush           = ' '
    *     register_container = ' '
         IMPORTING
           document_proxy     = iref_document
           error              = iref_error
    *    retcode            =
          .
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'E'.
      ENDIF.
    
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
    
    * To provide F4 help for the file
      PERFORM sub_file_f4.
    
    START-OF-SELECTION.
    
      CONCATENATE 'FILE://' p_file INTO v_document_url.
    
      CALL METHOD iref_document->open_document
        EXPORTING
          document_title   = 'Excel'
          document_url     = v_document_url
    *     no_flush         = ' '
          open_inplace     = 'X'
    *     open_readonly    = ' '
    *     protect_document = ' '
    *     onsave_macro     = ' '
    *     startup_macro    = ''
    *     user_info        =
        IMPORTING
          error            = iref_error
    *     retcode          =
          .
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'I'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      CALL METHOD iref_document->get_spreadsheet_interface
         EXPORTING
           no_flush        = ' '
        IMPORTING
          error           = iref_error
          sheet_interface = iref_spreadsheet
    *     retcode         =
          .
    
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'I'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      CALL METHOD iref_spreadsheet->get_sheets
          EXPORTING
           no_flush = ' '
    *      updating = -1
         IMPORTING
           sheets   = i_sheets
           error    = iref_error
    *      retcode  =
          .
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'I'.
        LEAVE LIST-PROCESSING.
      ENDIF.
      LOOP AT i_sheets INTO wa_sheets.
    
        CALL METHOD iref_spreadsheet->select_sheet
           EXPORTING
              name     = wa_sheets-sheet_name
    *         no_flush = ' '
          IMPORTING
              error    = iref_error
    *         retcode  =
                .
        IF iref_error->has_failed = 'X'.
          EXIT.
    *      call method iref_error->raise_message
    *        exporting
    *          type = 'E'.
        ENDIF.
        CALL METHOD iref_spreadsheet->set_selection
          EXPORTING
            top     = 1
            left    = 1
            rows    = p_rows
            columns = p_cols.
    
        CALL METHOD iref_spreadsheet->insert_range
          EXPORTING
            name     = 'Test'
            rows     = p_rows
            columns  = p_cols
            no_flush = ''
          IMPORTING
            error    = iref_error.
        IF iref_error->has_failed = 'X'.
          EXIT.
    *      call method iref_error->raise_message
    *        exporting
    *          type = 'E'.
        ENDIF.
    
        REFRESH i_data.
    
        CALL METHOD iref_spreadsheet->get_ranges_data
           EXPORTING
    *        no_flush  = ' '
             all       = 'X'
    *        updating  = -1
    *        rangesdef =
           IMPORTING
             contents  = i_data
             error     = iref_error
    *        retcode   =
           CHANGING
             ranges    = i_ranges
                 .
        DELETE i_data WHERE value IS INITIAL OR value = space.
        ULINE.
        WRITE:/1 wa_sheets-sheet_name COLOR 3.
        ULINE.
    
    *    LOOP AT i_data INTO wa_data.
    *      WRITE:(50) wa_data-value.
    *      AT END OF row.
    *        NEW-LINE.
    *      ENDAT.
    *    ENDLOOP.
    
      ENDLOOP.
    
      CALL METHOD iref_document->close_document
    *  EXPORTING
    *    do_save     = ' '
    *    no_flush    = ' '
         IMPORTING
           error       = iref_error
    *    has_changed =
    *    retcode     =
          .
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'I'.
        LEAVE LIST-PROCESSING.
      ENDIF.
      CALL METHOD iref_document->release_document
    *  EXPORTING
    *    no_flush = ' '
         IMPORTING
           error    = iref_error
    *    retcode  =
          .
      IF iref_error->has_failed = 'X'.
        CALL METHOD iref_error->raise_message
          EXPORTING
            type = 'I'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      IF p_mode = 'X'.
    *    DATA: ls_data TYPE ZREPORT,
    *          lt_data TYPE STANDARD TABLE OF ZREPORT,
    *          chaR_index TYPE string,
    *          msg TYPE string.
    *    LOOP AT i_data INTO wa_data.
    *
    *      IF sy-tabix MOD 2 = 1.
    *         char_index = sy-tabix.
    *         ls_data-report_name = wa_data-value.
    *         CONCATENATE 'Index' char_index ls_data-report_name INTO msg SEPARATED BY SPACE.
    *         CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    *           EXPORTING
    *             TEXT = msg.
    *      ELSE.
    *         ls_data-description = wa_data-value.
    *         APPEND ls_data TO lt_data.
    *         CLEAR: wa_data,ls_data.
    *      ENDIF.
    *    ENDLOOP.
    *    DELETE FROM zreport.
    *    INSERT zreport FROM TABLE lt_data.
    *    COMMIT WORK AND WAIT.
    *    IF sy-subrc = 0.
    *      i_total = lines( lt_data ).
    *      WRITE:/ 'User Assign Row Number:' , p_rows.
    *      WRITE:/ 'Actually Imported Row Numer:' , i_total.
    *    ENDIF.
    
      ENDIF.
    *&---------------------------------------------------------------------*
    *&      Form  SUB_FILE_F4
    *&---------------------------------------------------------------------*
    *       F4 help for file path
    *----------------------------------------------------------------------*
    FORM sub_file_f4 .
      DATA:
      l_desktop       TYPE string,
      l_i_files       TYPE filetable,
      l_wa_files      TYPE file_table,
      l_rcode         TYPE int4.
    
    * Finding desktop
      CALL METHOD cl_gui_frontend_services=>get_desktop_directory
        CHANGING
          desktop_directory    = l_desktop
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc <> 0.
        MESSAGE e001(00) WITH
            'Desktop not found'.
      ENDIF.
    
    * Update View
      CALL METHOD cl_gui_cfw=>update_view
        EXCEPTIONS
          cntl_system_error = 1
          cntl_error        = 2
          OTHERS            = 3.
    
      CALL METHOD cl_gui_frontend_services=>file_open_dialog
         EXPORTING
           window_title            = 'Select Excel file'
           default_extension       = '.xls'
    *      default_filename        =
           file_filter             = '.xls'
    *      with_encoding           =
           initial_directory       = l_desktop
    *      multiselection          =
        CHANGING
          file_table              = l_i_files
          rc                      = l_rcode
    *     user_action             =
    *     file_encoding           =
        EXCEPTIONS
          file_open_dialog_failed = 1
          cntl_error              = 2
          error_no_gui            = 3
          not_supported_by_gui    = 4
          OTHERS                  = 5
              .
      IF sy-subrc <> 0.
        MESSAGE e001(00) WITH 'Error while opening file'.
      ENDIF.
    
      READ TABLE l_i_files INDEX 1 INTO l_wa_files.
      IF sy-subrc = 0.
        p_file = l_wa_files-filename.
      ELSE.
        MESSAGE e001(00) WITH 'Error while opening file'.
      ENDIF.
    
    ENDFORM.                    " SUB_FILE_F4
    

    总结

    本文通过三个实际的业务场景,分别介绍了如何通过 Excel 作为载体,导入数据到 SAP Cloud for Customer 和 SAP Commerce Cloud 系统,以及通过 ABAP 编程语言解析 Excel 文件内容的详细技术实现。

    相关文章

      网友评论

        本文标题:SAP 实施项目中涉及到编程方式操作 Excel 的几种场景介绍

        本文链接:https://www.haomeiwen.com/subject/ktijirtx.html