【ABAP】ole2多sheet导入类

方便复用,实际就是ole2方式

1、SE24创建类
2、复制代码至相应位置

*----------------------------------------------------------------------*
*       CLASS ZCL_TAB_DOC  DEFINITIO
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zcl_tab_doc DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC

  GLOBAL FRIENDS cl_gui_frontend_services .

*"* public components of class ZCL_TAB_DOC
*"* do not include other source files here!!!
  PUBLIC SECTION.

    TYPE-POOLS: abap.

    TYPES:
        BEGIN OF ty_sheetname_info,
          sheetname        TYPE string,
          startrow         TYPE i,
          startcol         TYPE i,
          every_copy_lines TYPE i,
          endcol           TYPE i,
        END OF ty_sheetname_info .
    TYPES:
      tt_sheetname_info TYPE STANDARD TABLE OF ty_sheetname_info .
    TYPES:
      ty_char30000 TYPE c LENGTH 30000 .
    TYPES:
      tt_char30000 TYPE TABLE OF ty_char30000 .

    DATA:
      dt_excel_context TYPE STANDARD TABLE OF ty_char30000 .
    TYPES:
      BEGIN OF ty_tabc,
        sheetname TYPE string, "sheet名称
        context   LIKE dt_excel_context, "sheet页的数据
      END OF ty_tabc .
    TYPES:
      tt_tabc TYPE STANDARD TABLE OF ty_tabc .

    "保存文件
    CLASS-METHODS file_save_dialog_default
      IMPORTING
        value(i_window_title)      TYPE string DEFAULT 'Select Download Path'
        value(i_default_extension) TYPE string DEFAULT 'xlsx'
        value(i_default_filename)  TYPE string DEFAULT 'Download'
        !i_with_encoding           TYPE abap_bool OPTIONAL
        value(i_file_filter)       TYPE string DEFAULT 'Excel(*.xlsx)|*.xlsx|Excel(*.xlsm)|*.xlsm|Excel 97-2003(*.xls)|*.xls'
        value(i_initial_directory) TYPE string OPTIONAL
        !i_prompt_on_overwrite     TYPE abap_bool DEFAULT 'X'
      CHANGING
        !c_filename                TYPE string
        !c_path                    TYPE string
        !c_fullpath                TYPE string
        !c_user_action             TYPE i OPTIONAL
        !c_file_encoding           TYPE abap_encoding OPTIONAL
      EXCEPTIONS
        cntl_error
        error_no_gui
        not_supported_by_gui
        invalid_default_file_name .
    "读取文件
    CLASS-METHODS file_open_dialog_default
      IMPORTING
        value(i_window_title)      TYPE string DEFAULT 'Select Upload File'
        value(i_default_extension) TYPE string DEFAULT '.xlsx|.xls'
        value(i_default_filename)  TYPE string OPTIONAL
        value(i_file_filter)       TYPE string DEFAULT 'Excel(*.xlsx)|*.xlsx|Excel(*.xlsm)|*.xlsm|Excel 97-2003(*.xls)|*.xls'
        value(i_with_encoding)     TYPE abap_bool OPTIONAL
        value(i_initial_directory) TYPE string OPTIONAL
        value(i_multiselection)    TYPE abap_bool DEFAULT ''
      CHANGING
        !ct_file_table             TYPE filetable
        !c_rc                      TYPE i
        !c_user_action             TYPE i OPTIONAL
        !c_file_encoding           TYPE abap_encoding OPTIONAL
      EXCEPTIONS
        file_open_dialog_failed
        cntl_error
        error_no_gui
        not_support_by_gui .
    "导入excel到内表
    CLASS-METHODS import_excel_by_ole
      IMPORTING
        value(i_filename)   TYPE string
      CHANGING
        value(ct_sheetname) TYPE tt_sheetname_info
        value(ct_tabc)      TYPE tt_tabc
      EXCEPTIONS
        file_open_error .
    "EXCEL 内容转化为 内表-(由调用程序决定)
    METHODS excel_convert_table
      IMPORTING
        value(i_separator)       TYPE abap_char1 DEFAULT cl_abap_char_utilities=>horizontal_tab
        value(is_table)          TYPE ty_tabc
        value(i_repid)           TYPE sy-repid DEFAULT sy-repid
        value(i_special_process) TYPE string OPTIONAL"special process form
      CHANGING
        !ct_table                TYPE STANDARD TABLE
      EXCEPTIONS
        context_convert_failed .
*"* protected components of class ZCL_TAB_DOC
*"* do not include other source files here!!!
protected section.
  "单元格的特殊处理
    METHODS excel_convert_special_process
      IMPORTING
        !is_componet TYPE abap_compdescr OPTIONAL
        !i_row       TYPE i
        !i_col       TYPE i
      CHANGING
        !c_cell      TYPE string
      EXCEPTIONS
        convert_error .
*"* private components of class ZCL_TAB_DOC
*"* do not include other source files here!!!
private section.
  DATA m_special_process_form TYPE string.
    DATA m_repid TYPE sy-repid VALUE sy-repid.

下面是4个方法

method FILE_SAVE_DIALOG_DEFAULT.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
      EXPORTING
        window_title              = i_window_title
        default_extension         = i_default_extension
        default_file_name         = i_default_filename
        with_encoding             = i_with_encoding
        file_filter               = i_file_filter
        initial_directory         = i_initial_directory
        prompt_on_overwrite       = i_prompt_on_overwrite
      CHANGING
        filename                  = c_filename
        path                      = c_path
        fullpath                  = c_fullpath
        user_action               = c_user_action
        file_encoding             = c_file_encoding
      EXCEPTIONS
        cntl_error                = 1
        error_no_gui              = 2
        not_supported_by_gui      = 3
        invalid_default_file_name = 4
        OTHERS                    = 5.
    IF sy-subrc <> 0.
      CASE sy-subrc.
        WHEN 1.
          RAISE cntl_error.
        WHEN 2.
          RAISE error_no_gui.
        WHEN 3.
          RAISE not_supported_by_gui.
        WHEN 4.
          RAISE invalid_default_file_name.
        WHEN OTHERS.
      ENDCASE.
    ENDIF.
endmethod.
method FILE_OPEN_DIALOG_DEFAULT.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
      EXPORTING
        window_title            = i_window_title
        default_extension       = i_default_extension
        default_filename        = i_default_filename
        file_filter             = i_file_filter
        with_encoding           = i_with_encoding
        initial_directory       = i_initial_directory
        multiselection          = i_multiselection
      CHANGING
        file_table              = ct_file_table
        rc                      = c_rc
        user_action             = c_user_action
        file_encoding           = c_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.
      CASE sy-subrc.
        WHEN 1.
          RAISE file_open_dialog_failed.
        WHEN 2.
          RAISE cntl_error.
        WHEN 3.
          RAISE error_no_gui.
        WHEN 4.
          RAISE not_support_by_gui.
        WHEN OTHERS.
      ENDCASE.
    ENDIF.
endmethod.

这个方法比较灵活,未传入sheet名也可以全部读取

METHOD import_excel_by_ole.
  DATA lw_tabc TYPE ty_tabc.
  DATA lt_tabc LIKE TABLE OF lw_tabc.

  DATA:
    lv_column_num TYPE i,
    lv_column_skp TYPE i,
    lw_tab_ref    TYPE REF TO data.

  TYPE-POOLS:
    ole2.

  DATA:
    ole_excel      TYPE ole2_object,
    ole_workbooks  TYPE ole2_object,
    ole_workbook   TYPE ole2_object,
    ole_worksheets TYPE ole2_object,
    ole_worksheet  TYPE ole2_object,
    ole_cell_begin TYPE ole2_object,
    ole_cell_end   TYPE ole2_object,
    ole_range      TYPE ole2_object.
  DATA:
    lv_subrc     TYPE sy-subrc,
    lv_begin_col TYPE i,
    lv_end_col   TYPE i,
    lv_begin_row TYPE i,
    lv_end_row   TYPE i,
    lv_add_rows  TYPE i VALUE 3000. "默认,每次COPY3000行

  DATA:
    lt_excel_tab     TYPE STANDARD TABLE OF ty_char30000,
    lw_excel_tab     TYPE ty_char30000,
    lw_excel_tab_tmp TYPE ty_char30000.

*->生成Excel object
  CREATE OBJECT ole_excel 'Excel.Application'.
  IF sy-subrc <> 0.
    MESSAGE e368(00) WITH 'file_open_failed' RAISING file_open_error.
  ENDIF.

  SET PROPERTY OF ole_excel 'Visible' = 0.

  GET PROPERTY OF ole_excel 'Workbooks' = ole_workbooks.

  CALL METHOD OF
    ole_workbooks
    'Open' = ole_workbook
    EXPORTING
    #1 = i_filename. "文件名

*->get Sheet
  DATA lv_process_text TYPE string.
  DATA l_count TYPE i.
  l_count = LINES( ct_sheetname )."Sheets 名称

  DATA ls_sheetname LIKE LINE OF ct_sheetname.
  DATA l_tabix TYPE sy-tabix.

  IF ct_sheetname[] IS NOT INITIAL.
    LOOP AT ct_sheetname INTO ls_sheetname.
      l_tabix = sy-tabix.
*      DATA(l_percentage) = l_tabix / l_count * 100.
*      ##NO_TEXT
*      lv_process_text = 'Uploading Sheet:' && ls_sheetname-sheetname.
*
*      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*        EXPORTING
*          percentage = l_percentage
*          text       = lv_process_text.

      IF ls_sheetname-sheetname IS NOT INITIAL.
        GET PROPERTY OF ole_workbook 'Worksheets' = ole_worksheets
          exporting
            #1 = ls_sheetname-sheetname.
        lw_tabc-sheetname = ls_sheetname-sheetname.
      ELSE.
        CALL METHOD OF ole_excel 'Worksheets' = ole_worksheets
          EXPORTING #1 = l_tabix.
      ENDIF.

      CALL METHOD OF ole_worksheets 'Activate'.

      IF lw_tabc-sheetname IS INITIAL.
        GET PROPERTY OF ole_workbook 'Worksheets' = ole_worksheets
         exporting
           #1 = l_tabix.

        GET PROPERTY OF ole_worksheets 'Name' = lw_tabc-sheetname.
      ENDIF.

      lv_begin_col = ls_sheetname-startcol."开始列
      lv_end_col = ls_sheetname-endcol."开始行
      lv_begin_row = 0.
      lv_end_row = 0.
      lv_add_rows = ls_sheetname-every_copy_lines.

      CLEAR lv_subrc.

      WHILE lv_subrc IS INITIAL.

        IF lv_begin_row IS INITIAL.
          lv_begin_row = ls_sheetname-startrow.
          lv_end_row   = lv_add_rows.
        ELSE.
          lv_begin_row = lv_begin_row + lv_add_rows.
          lv_end_row   = lv_end_row   + lv_add_rows.
        ENDIF.

        CALL METHOD OF
          ole_worksheets
          'Cells' = ole_cell_begin
          EXPORTING
          #1 = lv_begin_row
          #2 = lv_begin_col.

        CALL METHOD OF
          ole_worksheets
          'Cells' = ole_cell_end
          EXPORTING
          #1 = lv_end_row
          #2 = lv_end_col.

        CALL METHOD OF
          ole_worksheets
          'RANGE' = ole_range
          EXPORTING
          #1 = ole_cell_begin
          #2 = ole_cell_end.

        CALL METHOD OF
          ole_range
          'SELECT'.
        IF sy-subrc <> 0.
          EXIT.
        ENDIF.

        CALL METHOD OF
          ole_range
          'COPY'.

* read clipboard into ABAP
        CALL METHOD cl_gui_frontend_services=>clipboard_import
          IMPORTING
            data                 = lt_excel_tab
          EXCEPTIONS
            cntl_error           = 1
            error_no_gui         = 2
            not_supported_by_gui = 3
            OTHERS               = 4.
        IF sy-subrc <> 0.
          CALL METHOD OF
            ole_excel
            'QUIT'.
          "##no_text
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1
        sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.

        lv_subrc = 4.
        LOOP AT lt_excel_tab INTO lw_excel_tab.
          lw_excel_tab_tmp = lw_excel_tab.
          REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN lw_excel_tab_tmp WITH space.
          IF NOT ( lw_excel_tab_tmp = space OR lw_excel_tab_tmp IS INITIAL ).
            APPEND lw_excel_tab TO lw_tabc-context[].
            CLEAR lv_subrc.
          ENDIF.
        ENDLOOP.
        CLEAR lt_excel_tab.

      ENDWHILE.

      DATA: lv_rc TYPE i.

*      clear clipboard
      CALL METHOD cl_gui_frontend_services=>clipboard_export
        IMPORTING
          data                 = lt_excel_tab
        CHANGING
          rc                   = lv_rc
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc NE 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1
        sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
      APPEND lw_tabc TO lt_tabc.
      CLEAR:lw_tabc.

      CALL METHOD OF
        ole_worksheets
        'COLSE'.

    ENDLOOP.
  ELSE.
    " 未配置sheet
    CALL METHOD OF ole_excel 'WORKSHEETS' = ole_worksheets.
    GET PROPERTY OF ole_worksheets 'COUNT' = l_count.

    l_tabix = 0.
    DO l_count TIMES.
      l_tabix = l_tabix + 1.

      CALL METHOD OF ole_excel 'Worksheets' = ole_worksheets
        EXPORTING #1 = l_tabix.

      CALL METHOD OF ole_worksheets 'Activate'.

      GET PROPERTY OF ole_workbook 'Worksheets' = ole_worksheets
          exporting
            #1 = l_tabix.

      GET PROPERTY OF ole_worksheets 'Name' = lw_tabc-sheetname.



      lv_begin_col = 1.
      lv_end_col = 999.
      lv_begin_row = 1.
      lv_end_row = 999.
      lv_add_rows = 999.
      CLEAR lv_subrc.

*        IF lv_begin_row IS INITIAL.
*          lv_begin_row = 1.
*          lv_end_row   = lv_add_rows.
*        ELSE.
*          lv_begin_row = lv_begin_row + lv_add_rows.
*          lv_end_row   = lv_end_row   + lv_add_rows.
*        ENDIF.

      CALL METHOD OF
        ole_worksheets
        'Cells' = ole_cell_begin
        EXPORTING
        #1 = lv_begin_row
        #2 = lv_begin_col.

      CALL METHOD OF
        ole_worksheets
        'Cells' = ole_cell_end
        EXPORTING
        #1 = lv_end_row
        #2 = lv_end_col.

      CALL METHOD OF
        ole_worksheets
        'RANGE' = ole_range
        EXPORTING
        #1 = ole_cell_begin
        #2 = ole_cell_end.

      CALL METHOD OF
        ole_range
        'SELECT'.
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.

      CALL METHOD OF
        ole_range
        'COPY'.

* read clipboard into ABAP
      CALL METHOD cl_gui_frontend_services=>clipboard_import
        IMPORTING
          data                 = lt_excel_tab
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc <> 0.
        CALL METHOD OF
          ole_excel
          'QUIT'.
        "##no_text
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1
      sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

      lv_subrc = 4.
      LOOP AT lt_excel_tab INTO lw_excel_tab.
        lw_excel_tab_tmp = lw_excel_tab.
        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN lw_excel_tab_tmp WITH space.
        IF NOT ( lw_excel_tab_tmp = space OR lw_excel_tab_tmp IS INITIAL ).
          APPEND lw_excel_tab TO lw_tabc-context[].
          CLEAR lv_subrc.
        ENDIF.
      ENDLOOP.
      CLEAR lt_excel_tab.

*      clear clipboard
      CALL METHOD cl_gui_frontend_services=>clipboard_export
        IMPORTING
          data                 = lt_excel_tab
        CHANGING
          rc                   = lv_rc
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc NE 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1
        sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
      APPEND lw_tabc TO lt_tabc.
      CLEAR:lw_tabc.

      CALL METHOD OF
        ole_worksheets
        'COLSE'.

    ENDDO.

  ENDIF.

  ct_tabc = lt_tabc.


  CALL METHOD OF
    ole_excel
    'QUIT'.
  FREE OBJECT:
    ole_excel      ,
    ole_workbooks  ,
    ole_workbook   ,
    ole_worksheets ,
    ole_worksheet  ,
    ole_cell_begin ,
    ole_cell_end   ,
    ole_range      .
ENDMETHOD.
METHOD excel_convert_table.
  DATA lv_row TYPE i.
  DATA lv_col TYPE i.
  DATA lv_tabix TYPE i.
  DATA: lt_cell TYPE TABLE OF string,
        ls_cell TYPE string.
  DATA:
    lo_cx_root TYPE REF TO cx_root.
  DATA
    lr_descr TYPE REF TO cl_abap_structdescr.

  DATA lr_line TYPE REF TO data.
  FIELD-SYMBOLS: <value> TYPE ANY,
                 <line>  TYPE ANY.
  CREATE DATA lr_line LIKE LINE OF ct_table.
  ASSIGN lr_line->* TO <line>.

  lr_descr ?= cl_abap_typedescr=>describe_by_data( <line> ).

  "m_repid m_special_process
  m_repid = i_repid.
  m_special_process_form = i_special_process.
  DATA ls_context TYPE ty_char30000.
  DATA ls_component TYPE abap_compdescr.
  data lv_text TYPE char100.
  LOOP AT is_table-context INTO ls_context.
    lv_row = sy-tabix.
    SPLIT ls_context AT cl_abap_char_utilities=>horizontal_tab INTO TABLE lt_cell.
    LOOP AT lt_cell INTO ls_cell.
      lv_tabix = sy-tabix."DISPOSAL CURRENT ROW
      lv_col = lv_tabix.
      READ TABLE lr_descr->components INTO ls_component INDEX lv_tabix.
      IF sy-subrc EQ 0.

        CALL METHOD me->excel_convert_special_process
          EXPORTING
            is_componet = ls_component "字段信息
            i_row       = lv_row "行
            i_col       = lv_col "列
          CHANGING
            c_cell      = ls_cell.

        ASSIGN COMPONENT lv_col OF STRUCTURE <line> TO <value>.
        IF sy-subrc EQ 0.
          TRY.
              <value> = ls_cell.
            CATCH cx_root INTO lo_cx_root.
              "In sheet &1,the data format of Row &2 Field &3 is not right
              lv_text = 'error'."'in SHEET' && is_table-sheetname && ',the data format of row' && lv_row && 'field ' && ls_component-name && 'is not right'.
              "data(lv_text) = |in SHEET{ is_table-sheetname },the data format of row { lv_row } field { ls_component-name } is not right|.
              MESSAGE e368(00) WITH lv_text '' RAISING context_convert_failed.
          ENDTRY.
        ENDIF.
      ENDIF.
    ENDLOOP.

    APPEND <line> TO ct_table.
    CLEAR <line>.
  ENDLOOP.
ENDMETHOD.
METHOD excel_convert_special_process.
  CHECK m_special_process_form IS NOT INITIAL.
  PERFORM (m_special_process_form) IN PROGRAM (m_repid) IF FOUND
  USING is_componet i_row i_col CHANGING c_cell.
ENDMETHOD.

你可能感兴趣的:(sap,abap,abap,sap)