修改导入本地EXCEL文件的函数(ALSM_EXCEL_TO_INTERNAL_TABLE)

ABAP原来提供的导入本地EXCEL文件的函数(ALSM_EXCEL_TO_INTERNAL_TABLE)感觉比较麻烦,所以做了相应的修改。

 

FUNCTION ZF_TEST.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(FILENAME) LIKE  RLGRAP-FILENAME
*"     REFERENCE(I_BEGIN_COL) TYPE  I
*"     REFERENCE(I_BEGIN_ROW) TYPE  I
*"     REFERENCE(I_END_COL) TYPE  I
*"     REFERENCE(I_END_ROW) TYPE  I
*"  TABLES
*"      INTERN       原来函数里面指定的内表为 INTERN LIKE ALSMEX_TABLINE,在程序中这样的结构不太适合,很麻烦,所以我把它改为未指定结构
*"  EXCEPTIONS
*"      INCONSISTENT_PARAMETERS
*"      UPLOAD_OLE
*"----------------------------------------------------------------------
  TYPE-POOLS: OLE2.

  TYPESBEGIN OF TY_S_SENDERLINE,
         LINE(4096)               TYPE C,
        END OF TY_S_SENDERLINE,
       TY_T_SENDER                TYPE TY_S_SENDERLINE  OCCURS 0.
  DATA: EXCEL_TAB       TYPE  TY_T_SENDER.
  DATA: EXCEL_WA(4096)  TYPE  C.
  DATA: LD_SEPARATOR  TYPE  C.
  DATA: APPLICATION   TYPE  OLE2_OBJECT,
        WORKBOOK      TYPE  OLE2_OBJECT,
        RANGE         TYPE  OLE2_OBJECT,
        WORKSHEET     TYPE  OLE2_OBJECT.
  DATA: H_CELL        TYPE  OLE2_OBJECT,
        H_CELL1       TYPE  OLE2_OBJECT.
  DATA:
    LD_RC             TYPE I.
*   Rückgabewert der Methode "clipboard_export     "

* Makro für Fehlerbehandlung der Methods
  DEFINE M_MESSAGE.
    CASE SY-SUBRC.
      WHEN 0.
      WHEN 1.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      WHEN OTHERSRAISE UPLOAD_OLE.
    ENDCASE.
  END-OF-DEFINITION.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 0
      text       = '正在导入EXCEL数据,请稍候......'.


* check parameters
  IF I_BEGIN_ROW > I_END_ROW. RAISE INCONSISTENT_PARAMETERS. ENDIF.
  IF I_BEGIN_COL > I_END_COL. RAISE INCONSISTENT_PARAMETERS. ENDIF.

* Get TAB-sign for separation of fields
  CLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.
  LD_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.

* open file in Excel
  IF APPLICATION-HEADER = SPACE OR APPLICATION-HANDLE = -1.
    CREATE OBJECT APPLICATION 'Excel.Application'.
    M_MESSAGE.
  ENDIF.
  CALL METHOD OF APPLICATION 'Workbooks' = WORKBOOK.
  M_MESSAGE.
  CALL METHOD OF WORKBOOK 'Open' EXPORTING #1 = FILENAME.
  M_MESSAGE.
*  set property of application 'Visible' = 1.
*  m_message.
  GET PROPERTY OF  APPLICATION 'ACTIVESHEET' = WORKSHEET.
  M_MESSAGE.

* mark whole spread sheet
  CALL METHOD OF WORKSHEET 'Cells' = H_CELL
    EXPORTING #1 = I_BEGIN_ROW #2 = I_BEGIN_COL.
  M_MESSAGE.
  CALL METHOD OF WORKSHEET 'Cells' = H_CELL1
    EXPORTING #1 = I_END_ROW #2 = I_END_COL.
  M_MESSAGE.

  CALL METHOD OF WORKSHEET 'RANGE' = RANGE
    EXPORTING #1 = H_CELL #2 = H_CELL1.
  M_MESSAGE.
  CALL METHOD OF RANGE 'SELECT'.
  M_MESSAGE.

* copy marked area (whole spread sheet) into Clippboard
  CALL METHOD OF RANGE 'COPY'.
  M_MESSAGE.

* read clipboard into ABAP
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT
    IMPORTING
      DATA                 = EXCEL_TAB
    EXCEPTIONS
      CNTL_ERROR           = 1
*      ERROR_NO_GUI         = 2
*      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4
          .
  IF SY-SUBRC <> 0.
    MESSAGE A037(ALSMEX).
  ENDIF.

"PERFORM separated_to_intern_convert TABLES excel_tab intern  USING  ld_separator.    注意:标准函数调用这个FORM转换内表数据,我觉得比较麻烦

************ BEGIN   修改为以下的代码:*********************
 FIELD-SYMBOLS:<DYN_FIELD>.
  DATA: F_WA LIKE LINE OF EXCEL_TAB,
              IT_DATA TYPE STRING OCCURS 0 WITH HEADER LINE.

  LOOP AT EXCEL_TAB INTO F_WA.
    SPLIT F_WA  AT LD_SEPARATOR INTO TABLE IT_DATA .
    LOOP AT IT_DATA .
      ASSIGN COMPONENT SY-TABIX OF STRUCTURE  INTERN  TO <DYN_FIELD>.
      <DYN_FIELD> = IT_DATA.
    ENDLOOP.
    APPEND INTERN.
  ENDLOOP.

************ END   修改为以下的代码:*********************

* clear clipboard
  REFRESH EXCEL_TAB.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT
     IMPORTING
        DATA                 = EXCEL_TAB
     CHANGING
        RC                   = LD_RC
     EXCEPTIONS
        CNTL_ERROR           = 1
*       ERROR_NO_GUI         = 2,
*       NOT_SUPPORTED_BY_GUI = 3
        OTHERS               = 4
          .

* quit Excel and free ABAP Object - unfortunately, this does not kill
* the Excel process
  CALL METHOD OF APPLICATION 'QUIT'.
  M_MESSAGE.

* >>>>> Begin of change note 575877
* to kill the Excel process it's necessary to free all used objects
  FREE OBJECT H_CELL.       M_MESSAGE.
  FREE OBJECT H_CELL1.      M_MESSAGE.
  FREE OBJECT RANGE.        M_MESSAGE.
  FREE OBJECT WORKSHEET.    M_MESSAGE.
  FREE OBJECT WORKBOOK.     M_MESSAGE.
  FREE OBJECT APPLICATION.  M_MESSAGE.
* <<<<< End of change note 575877



ENDFUNCTION.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值