APO 读取Excel数据:ABAP - Upload data from Excel to Sap using OO

最近在做APO的一些开发,Ecc里有一些函数在APO里是没有的,比如说Excel读取函数,在APO里就找不到,使用不了,下面是用OO的方式,读取Excel,希望对用到的兄弟有帮助。

REPORT y_excel_to_itab.

* Define Screen Container
DATA: obj_container TYPE REF TO cl_gui_custom_container.
DATA: o_error       TYPE REF TO i_oi_error,
      o_control     TYPE REF TO i_oi_container_control,
      o_document    TYPE REF TO i_oi_document_proxy,
      o_spreadsheet TYPE REF TO i_oi_spreadsheet.

* Data declarations.
DATA: t_files       TYPE filetable,
      s_files       TYPE file_table,
      v_doc_name    TYPE char256,
      v_changed     TYPE int4,
      v_rcode       TYPE int4,
      t_ranges      TYPE soi_range_list,
      s_ranges      TYPE soi_range_item,
      t_data        TYPE soi_generic_table,
      s_data        TYPE soi_generic_item,
      v_action      TYPE int4.

* Initialization event.
INITIALIZATION.

CLASS c_oi_errors DEFINITION LOAD.

* Create Instance control for container
  CALL METHOD c_oi_container_control_creator=>get_container_control
       IMPORTING control = o_control
                 error   = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Create generic container linked to container in screen 100
  CREATE OBJECT obj_container
    EXPORTING
     container_name               = 'CONTAINER'
    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 e208(00) WITH 'Error creating container'.
  ENDIF.

* Establish connection to GUI Control
  CALL METHOD o_control->init_control
      EXPORTING r3_application_name = 'Excel Document Container'
                 inplace_enabled     = 'X'
                 parent              = obj_container
       IMPORTING error               = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Create Document Proxy
  CALL METHOD o_control->get_document_proxy
       EXPORTING document_type   = soi_doctype_excel_sheet
       IMPORTING document_proxy  = o_document
                 error           = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Start-of-selection.
START-OF-SELECTION.

* Call dialog to navigate to file
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
     EXPORTING
       default_extension       = '.xls'
       file_filter             = '*.xls'
       initial_directory       = 'C:\'
    CHANGING
       file_table              = t_files
       rc                      = v_rcode
       user_action             = v_action
    EXCEPTIONS
       file_open_dialog_failed = 1
       cntl_error              = 2
       error_no_gui            = 3
       OTHERS                  = 4.
  IF sy-subrc <> 0.
    MESSAGE e208(00) WITH 'FILE_OPEN_DIALOG'.
  ENDIF.

* Only continue if User hasn't cancelled
  CHECK: v_action = 0.

* Determine filename to open Excel document
  READ TABLE t_files INDEX 1 INTO s_files.
  IF sy-subrc = 0.
    CONCATENATE 'FILE://' s_files-filename INTO v_doc_name.
  ELSE.
    MESSAGE e208(00).
  ENDIF.  "sy-subrc = 0

* Open Spreadsheet in SAPWORKDIR
  CALL METHOD o_document->open_document
       EXPORTING open_inplace     = 'X'
                 document_title   = 'Excel'
                 document_url     = v_doc_name
                 no_flush         = ''
       IMPORTING error            = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Open Spreadsheet interface
  CALL METHOD o_document->get_spreadsheet_interface
       EXPORTING no_flush        = ''
       IMPORTING sheet_interface = o_spreadsheet
                 error           = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Set selection for 1000 rows
  CALL METHOD o_spreadsheet->set_selection
               EXPORTING top   = 1
                         left  = 1
                         rows  = '5'
                         columns = '2'.

* Define Range in spreadsheet
  CALL METHOD o_spreadsheet->insert_range
         EXPORTING name      = 'Test'
                   rows      = '5'
                   columns   = '2'
                   no_flush  = ''
         IMPORTING error     = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

  s_ranges-name    = 'Test'.
  s_ranges-rows    = '5'.
  s_ranges-columns = '2'.
  APPEND s_ranges TO t_ranges.

* Get data
  CALL METHOD o_spreadsheet->get_ranges_data
         EXPORTING all       = ''
                   no_flush  = ''
         IMPORTING contents  = t_data
                   error     = o_error
         CHANGING  ranges    = t_ranges.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.
* close document

* Close the document
  CALL METHOD o_document->close_document
         EXPORTING do_save     = ''
                   no_flush    = ''
         IMPORTING has_changed = v_changed
                   error       = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Clear Document Resources
  CALL METHOD o_document->release_document
         EXPORTING no_flush = ''
         IMPORTING error    = o_error.

  IF o_error->has_failed = 'X'.
    CALL METHOD o_error->raise_message
         EXPORTING type = 'E'.
  ENDIF.

* Clear table of file names
  FREE: t_files,
        o_control.

* Display the data
  LOOP AT t_data INTO s_data.
    AT NEW row.
      SKIP.
    ENDAT.
    WRITE:(10) s_data-value.
  ENDLOOP.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值