OLE 导出类

发布时间 2023-05-29 11:16:41作者: ABAP-武汉-寒夜
class ZCL_EXCEL_DOWNLOAD definition
  public
  final
  create public .

public section.

  data G_FILEPATH type RLGRAP-FILENAME .

  methods CONSTRUCTOR
    importing
      value(I_DEFAULT_FILENAME) type STRING optional
      value(I_OBJID) type W3OBJID optional
      value(I_FILEPATH) type RLGRAP-FILENAME optional .
  class-methods DOWNLOAD_TEMPLATE
    importing
      value(I_DEFAULT_FILENAME) type STRING optional
      value(I_OBJID) type WWWPARAMS-OBJID optional
    exporting
      value(E_PATH) type RLGRAP-FILENAME .
  methods OPEN_EXCEL
    importing
      value(I_SHEET_NAME) type STRING optional .
  methods SET_SINGLE_CELL
    importing
      value(I_ROW) type I
      value(I_COL) type I
      value(I_VALUE) type ANY default 3
      value(I_HA) type I optional .
  methods SET_ROW_CELL
    importing
      !LT_ITAB type STANDARD TABLE
      value(I_ROW) type I
      value(I_COL) type I .
  methods SET_RANGE_CELL
    importing
      !LT_ITAB type STANDARD TABLE
      value(I_ROW) type I
      value(I_COL) type I .
  methods CLOSE_EXCEL
    importing
      !I_CLOSE type C default 'X' .
  methods INS_ROW
    importing
      value(COPY) type I
      value(ROW) type I
      value(COUNT) type I .
protected section.
private section.

  data G_EXCEL type OLE2_OBJECT .
  data G_WORKBOOKS type OLE2_OBJECT .
  data G_WORKBOOK type OLE2_OBJECT .
  data G_SHEET type OLE2_OBJECT .
ENDCLASS.



CLASS ZCL_EXCEL_DOWNLOAD IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->CLOSE_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_CLOSE                        TYPE        C (default ='X')
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD close_excel.
    SET PROPERTY OF g_excel 'DisplayAlerts' = 'false'.  "关闭保存提示。
    CALL METHOD OF
      g_workbook
      'SAVEAS'
      EXPORTING
        #1 = g_filepath. " #2 = 1.
    IF i_close = 'X'.
      CALL METHOD OF g_workbook 'CLOSE'. "关闭工作区
      CALL METHOD OF g_excel 'QUIT'."退出excel
    ENDIF .
    FREE OBJECT g_excel .
    FREE OBJECT g_workbooks .
    FREE OBJECT g_workbook .
    FREE OBJECT g_sheet .
    CLEAR:g_filepath .
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_DEFAULT_FILENAME             TYPE        STRING(optional)
* | [--->] I_OBJID                        TYPE        W3OBJID(optional)
* | [--->] I_FILEPATH                     TYPE        RLGRAP-FILENAME(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD constructor.
    DATA:
      l_filename  TYPE string,     " 文件名
      l_extension TYPE string ,   "文件后缀
      l_path      TYPE string,     " 路径
      l_fullpath  TYPE string.     " 全路径
    DATA:lv_title    TYPE string,
         lv_filename TYPE string.
    DATA:ls_template TYPE wwwdatatab."WEB资源库文件信息
    DATA:lv_subrc TYPE sysubrc .
    DATA:lv_file_filter TYPE string .
    IF i_filepath IS NOT INITIAL .
      g_filepath = i_filepath .
      RETURN .
    ENDIF .

    CHECK i_objid IS NOT INITIAL .

    CALL METHOD download_template
      EXPORTING
        i_default_filename = i_default_filename
        i_objid            = i_objid
      IMPORTING
        e_path             = g_filepath.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_EXCEL_DOWNLOAD=>DOWNLOAD_TEMPLATE
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_DEFAULT_FILENAME             TYPE        STRING(optional)
* | [--->] I_OBJID                        TYPE        WWWPARAMS-OBJID(optional)
* | [<---] E_PATH                         TYPE        RLGRAP-FILENAME
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD download_template.
    DATA:
      l_filename  TYPE string,     " 文件名
      l_extension TYPE string ,   "文件后缀
      l_path      TYPE string,     " 路径
      l_fullpath  TYPE string.     " 全路径
    DATA:lv_title    TYPE string,
         lv_filename TYPE string.
    DATA:ls_template TYPE wwwdatatab."WEB资源库文件信息
    DATA:lv_subrc TYPE sysubrc .
    DATA:lv_file_filter TYPE string .

    DATA: lv_directory TYPE string,
          lv_result    TYPE abap_bool.
    DATA:lv_extension(64).
    CALL FUNCTION 'WWWPARAMS_READ'
      EXPORTING
        relid            = 'MI'
        objid            = i_objid
        name             = 'fileextension'
      IMPORTING
        value            = lv_extension
      EXCEPTIONS
        entry_not_exists = 1
        OTHERS           = 2.
    IF sy-subrc <> 0.
*      实例不存在!
      MESSAGE s139(zmsg) DISPLAY LIKE 'E'.
      RETURN.
    ENDIF.


    IF lv_extension = '.xlsx' OR lv_extension = '.XLSX'.
      lv_file_filter = '*.xlsx|*.xlsx|*.xls|*.xls' .
    ELSEIF lv_extension = '.xls' OR   lv_extension = '.XLS' .
      lv_file_filter = '*.xls|*.xls|*.xlsx|*.xlsx' .
    ENDIF .
    l_extension = lv_extension.

    lv_directory =   'D:\' .
*    call method cl_gui_frontend_services=>directory_exist
*      exporting
*        directory            = lv_directory
*      receiving
*        result               = lv_result
*      exceptions
*        cntl_error           = 1
*        error_no_gui         = 2
*        wrong_parameter      = 3
*        not_supported_by_gui = 4
*        others               = 5.
*    if lv_result = abap_false.
*      clear:lv_directory.
*    endif.

    CALL METHOD cl_gui_frontend_services=>file_save_dialog   "保存文件路径对话框
      EXPORTING
        window_title         = 'Download Template'
        default_extension    = l_extension
        default_file_name    = i_default_filename
        file_filter          = lv_file_filter
        initial_directory    = lv_directory
      CHANGING
        filename             = l_filename
        path                 = l_path
        fullpath             = l_fullpath
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.

    CHECK l_fullpath IS NOT INITIAL.

    CLEAR ls_template.
    ls_template-relid = 'MI'.
    ls_template-objid = i_objid.
    DATA:lv_filepath TYPE rlgrap-filename.
    e_path = lv_filepath = l_fullpath .

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = ls_template
        destination = lv_filepath
      IMPORTING
        rc          = lv_subrc.

    IF lv_subrc NE  0 .
*      下载模板失败!
      MESSAGE s140(zmsg) DISPLAY LIKE 'E'.
    ENDIF .
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->INS_ROW
* +-------------------------------------------------------------------------------------------------+
* | [--->] COPY                           TYPE        I
* | [--->] ROW                            TYPE        I
* | [--->] COUNT                          TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD ins_row.
    DATA: lc_range TYPE ole2_object.

    DO count TIMES.
      CALL METHOD OF g_sheet 'Rows' = lc_range
       EXPORTING #1 = copy.

      CALL METHOD OF lc_range 'Copy'.

      CALL METHOD OF g_sheet 'Rows' = lc_range
       EXPORTING #1 = row.

      CALL METHOD OF lc_range 'Insert'.

      CALL METHOD OF lc_range 'ClearContents'.
    ENDDO.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->OPEN_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_SHEET_NAME                   TYPE        STRING(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD open_excel.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
*       PERCENTAGE = 0
        text = 'Data Loading.....'.
    CREATE OBJECT g_excel 'EXCEL.APPLICATION'.
    SET PROPERTY OF g_excel 'VISIBLE' = 0.

    CALL METHOD OF
      g_excel
        'WORKBOOKS' = g_workbooks.
    CALL METHOD OF
        g_workbooks
        'OPEN'      = g_workbook
      EXPORTING
        #1          = g_filepath.

    "有多个sheet页时。
    IF i_sheet_name IS NOT INITIAL .
      CALL METHOD OF
          g_workbook
          'WORKSHEETS' = g_sheet
        EXPORTING
          #1           = i_sheet_name.
      CALL METHOD OF
        g_sheet
        'Activate'.
    ELSE.
      CALL METHOD OF
        g_workbook
          'ActiveSheet' = g_sheet.
    ENDIF .
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->SET_RANGE_CELL
* +-------------------------------------------------------------------------------------------------+
* | [--->] LT_ITAB                        TYPE        STANDARD TABLE
* | [--->] I_ROW                          TYPE        I
* | [--->] I_COL                          TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_range_cell.
    CONSTANTS:
   lv_seperator TYPE c VALUE cl_abap_char_utilities=>horizontal_tab. " 值:#
*接口数据表相关
    DATA:wa_itab      TYPE REF TO data,                 "接口内表工作区,
         descr_wa     TYPE REF TO cl_abap_structdescr,  "接口内表工作区结构信息
         field_no     TYPE i,                           "接口内表工作区组件数量
         field_string TYPE string.                      "行结构组件的值

    FIELD-SYMBOLS:
      <wa_itab> TYPE any,  "接口内表工作区
      <field>   TYPE any.  "接口内表工作区中的组件
*粘贴内表
    DATA: BEGIN OF ls_data ,
            record(4096) TYPE c,
          END OF ls_data.

    DATA: lt_data LIKE TABLE OF ls_data,
          l_rc    TYPE i.
*EXCEL 对象
    DATA: excel_cell TYPE ole2_object.

    CHECK lt_itab[]   IS NOT INITIAL.
*创建接口数据表工作区
    CREATE DATA wa_itab LIKE LINE OF lt_itab.
    ASSIGN wa_itab->* TO <wa_itab>.
*获取内表工作区的组件数量
    descr_wa ?= cl_abap_typedescr=>describe_by_data( <wa_itab> ).
    DESCRIBE TABLE descr_wa->components LINES field_no.

*将接口表数据转存到粘贴内表中
    LOOP AT lt_itab INTO <wa_itab> .
      CLEAR:ls_data.
      IF field_no = 1.
*      ls_data-record = <wa_itab>.
        ASSIGN COMPONENT 1 OF STRUCTURE <wa_itab> TO <field>.
        field_string = <field>.
        ls_data-record = field_string.
      ELSE.
        DO field_no TIMES.
          ASSIGN COMPONENT sy-index OF STRUCTURE <wa_itab> TO <field>.
*        IF sy-subrc <> 0.
*          RAISE field_not_assigned.
*        ENDIF.
          field_string = <field>.
          IF sy-index = 1.
            ls_data-record = field_string.
          ELSE.
            CONCATENATE ls_data-record field_string  INTO ls_data-record SEPARATED BY lv_seperator.
          ENDIF.
        ENDDO.
      ENDIF.
      APPEND ls_data TO  lt_data.
    ENDLOOP.


    cl_gui_frontend_services=>clipboard_export( IMPORTING data = lt_data
                              CHANGING rc = l_rc ).
*设定单元格
    CALL METHOD OF
        g_sheet
        'Cells'         = excel_cell
      EXPORTING
        #1              = i_row
        #2              = i_col.
*选中单元格操作
    CALL METHOD OF
      excel_cell
      'Select'.
*粘贴操作
    CALL METHOD OF
      g_sheet
      'Paste'.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->SET_ROW_CELL
* +-------------------------------------------------------------------------------------------------+
* | [--->] LT_ITAB                        TYPE        STANDARD TABLE
* | [--->] I_ROW                          TYPE        I
* | [--->] I_COL                          TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_row_cell.
    CONSTANTS:
   lv_seperator TYPE c VALUE cl_abap_char_utilities=>horizontal_tab. " 值:#
*接口数据表相关
    DATA:wa_itab      TYPE REF TO data,                 "接口内表工作区,
         descr_wa     TYPE REF TO cl_abap_structdescr,  "接口内表工作区结构信息
         field_no     TYPE i,                           "接口内表工作区组件数量
         field_string TYPE string.                      "行结构组件的值

    FIELD-SYMBOLS:
      <wa_itab> TYPE any,  "接口内表工作区
      <field>   TYPE any.  "接口内表工作区中的组件
*粘贴内表
    DATA: BEGIN OF ls_data ,
            record(4096) TYPE c,
          END OF ls_data.

    DATA: lt_data LIKE TABLE OF ls_data,
          l_rc    TYPE i.
*EXCEL 对象
    DATA: excel_cell TYPE ole2_object.

    CHECK lt_itab[]   IS NOT INITIAL.
*创建接口数据表工作区
    CREATE DATA wa_itab LIKE LINE OF lt_itab.
    ASSIGN wa_itab->* TO <wa_itab>.

*将接口表数据转存到粘贴内表中
    LOOP AT lt_itab INTO <wa_itab> .
      IF sy-tabix = 1 .
        ls_data-record = <wa_itab>.
      ELSE.
        field_string = <wa_itab>.
        CONCATENATE ls_data-record field_string  INTO ls_data-record SEPARATED BY lv_seperator.
      ENDIF.
    ENDLOOP.

    APPEND ls_data TO  lt_data.
    cl_gui_frontend_services=>clipboard_export( IMPORTING data = lt_data
                              CHANGING rc = l_rc ).
*设定单元格
    CALL METHOD OF
        g_sheet
        'Cells' = excel_cell
      EXPORTING
        #1      = i_row
        #2      = i_col.
*选中单元格操作
    CALL METHOD OF
      excel_cell
      'Select'.
*粘贴操作
    CALL METHOD OF
      g_sheet
      'Paste'.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_DOWNLOAD->SET_SINGLE_CELL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_ROW                          TYPE        I
* | [--->] I_COL                          TYPE        I
* | [--->] I_VALUE                        TYPE        ANY (default =3)
* | [--->] I_HA                           TYPE        I(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_single_cell.
    DATA:lo_cell TYPE ole2_object,
         lo_font TYPE ole2_object.
    CHECK i_value IS NOT INITIAL.

    CALL METHOD OF
        g_excel
        'CELLS' = lo_cell
      EXPORTING
        #1      = i_row
        #2      = i_col.

    SET PROPERTY OF lo_cell 'VALUE' = i_value.

* 设置列宽
*  SET PROPERTY OF lo_cell 'COLUMNWIDTH' = 0.
* 对齐方式  3为居中
*    SET PROPERTY OF lo_cell 'HORIZONTALALIGNMENT' = i_ha.
** 水平对齐方式
*    SET PROPERTY OF lo_cell 'VERTICALALIGNMENT' = 2.
*
*    SET PROPERTY OF lo_cell 'WRAPTEXT' = 0.
*
*    GET PROPERTY OF lo_cell 'FONT' = lo_font.
** 字体加粗
*    SET PROPERTY OF lo_font 'BOLD' = 0.
**字体大小
*    SET PROPERTY OF lo_font 'SIZE' = 11.

    FREE lo_font.
    FREE lo_cell.
  ENDMETHOD.
ENDCLASS.