&——————————————————————————————————-
    *& Include
    &——————————————————————————————————-

    SELECTION-SCREEN: FUNCTION KEY 1. “激活下载模板按钮

    ———————————————————————————————————
    * INITIALIZATION 当执行时,程序首先执行的事件。
    ———————————————————————————————————
    INITIALIZATION. sscrfields-functxt_01 = ‘下载模板’.

    ———————————————————————————————————
    * at selection-screen
    ———————————————————————————————————
    AT SELECTION-SCREEN. PERFORM frmdownload_template.“下载模板_

    ———————————————————————————————————
    * at selection-screen ON VALUE-REQUEST FOR 调用选择文件
    ———————————————————————————————————
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR pfile.
    PERFORM frm_upload_filename_data.
    “选择文件_

    ———————————————————————————————————
    * start-of-selection 当以上的事件处理完没有问题的时候,才执行此事件。
    * 此事件处理的主要是对数据的获取与处理等
    ———————————————————————————————————
    START-OF-SELECTION.
    PERFORM frmread_upload. “将文件内容读取到内表中_

    DATA: lcfile TYPE rlgrap-filename. DATA: lc_wwwdatatab TYPE wwwdatatab VALUE ‘MIZ程序名’.
    CASE sscrfields-ucomm. WHEN’FC01’.
    “下载模板 “获取要下载的文件路径 CALL FUNCTION ‘WS_FILENAME_GET’ EXPORTING def_filename = ‘*.xls’ def_path = ‘C:\’
    MASK = lcmask mode = ‘S’
    _
    TITLE = text-005 IMPORTING filename = lc_file RC = EXCEPTIONS inv_winsys = 1 no_batch = 2 selection_cancel = 3 selection_error = 4 OTHERS = 5. IF sy-subrc = 0. “下载模板到指定路径 CALL FUNCTION ‘DOWNLOAD_WEB_OBJECT’ EXPORTING key = lc_wwwdatatab
    destination = lc_file
    IMPORTING
    RC =
    CHANGING
    * TEMP =_ . ENDIF. WHEN OTHERS. ENDCASE.

    —————————————————————————————————
    DATA lcmask TYPE char30. lc_mask = ‘ Excel files,.xls;.xlsx,all files,..’.
    CALL FUNCTION ‘WS_FILENAME_GET’
    “获取文件路径函数 EXPORTING
    deffilename = ‘’ “ 设置前文件名
    _
    defpath = ‘’ “ 设置前路径 mask = lcmask “ 选择屏蔽 mode = ‘O’ “ S = 保存,O = 打开 title = ‘上传文件’ “ 选择窗口的标题_ IMPORTING filename = p_file
    EXCEPTIONS inv_winsys = 1 no_batch = 2 selection_cancel = 3 selection_error = 4 OTHERS = 5.
    IF p_file IS INITIAL. MESSAGE s001(00) WITH ‘请选择上传文件’ DISPLAY LIKE ‘E’. STOP. ENDIF.

    DATA: ltabix TYPE i. DATA: lv_year(4) TYPE c, lv_month(2) TYPE c, lv_day(2) TYPE c.
    * FIELD-SYMBOLS:.
    CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’ EXPORTING percentage = 5 text = ‘数据读取中…’.
    CHECK p_file IS NOT INITIAL.
    PERFORM zalsm_excel_to_internal_table
    TABLES itab
    “接收内表 USING p_file “路径 1 “起始列 2 “起始行 100 “结束列 9999. “结束行_ SORT itab BY row col.
    IF itab[] IS INITIAL. MESSAGE s001(00) WITH ‘上传文件无数据’ DISPLAY LIKE ‘E’. ENDIF.

    CHECK itab[] IS NOT INITIAL.
    LOOP AT itab.
    l_tabix = itab-col. ASSIGN COMPONENT l_tabix OF STRUCTURE wa_file TO .
    = itab-value. AT END OF row. APPEND wa_file TO it_file. CLEAR:wa_file. ENDAT. ENDLOOP. CLEAR:itab[].

    —————————————————————————————————
    FORM zalsmexcel_to_internal_table TABLES intern LIKE itab[]
    “插入正确名称 <…> USING value(filename) LIKE rlgrap-filename
    value(i_begin_col) TYPE i value(i_begin_row) TYPE i value(i_end_col) TYPE i value(i_end_row) TYPE i.
    DATA: excel_tab TYPE ty_t_sender. 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 “clipboardexport “
    Makro für Fehlerbehandlung der Methods
    check parameters IF ibegin_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. 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
    =
    ERRORNO_GUI = 2
    =
    * NOT_SUPPORTED_BY_GUI = 3 OTHERS = 4.
    IF sy-subrc <> 0. MESSAGE a037(alsmex). ENDIF.
    PERFORM separatedto_intern_convert TABLES excel_tab
    intern
    USING ld_separator.
    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
    =
    ERRORNO_GUI = 2
    _
    =
    NOTSUPPORTED_BY_GUI = 3 OTHERS = 4.
    quit Excel and free ABAP Object - unfortunately, this does not kill
    the Excel process CALL METHOD OF application
    ‘QUIT’. mmessage.
    >>>>> 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
    ENDFORM.
    “ ZALSMEXCEL_TO_INTERNAL_TABLE

    —————————————————————————————————
    FORM separatedto_intern_convert TABLES i_tab TYPE ty_t_sender
    i_intern TYPE ty_t_itab
    USING i_separator TYPE c.
    DATA: l_sic_tabix LIKE sy-tabix, l_sic_col TYPE kcd_ex_col. DATA: l_fdpos LIKE sy-fdpos.
    REFRESH i_intern.
    LOOP AT i_tab. l_sic_tabix = sy-tabix. l_sic_col = 0. WHILE i_tab CA i_separator. l_fdpos = sy-fdpos. l_sic_col = l_sic_col + 1. PERFORM line_to_cell_separat TABLES i_intern
    USING i_tab l_sic_tabix l_sic_col
    i_separator l_fdpos. ENDWHILE.
    IF i_tab <> space. CLEAR i_intern. i_intern-row = l_sic_tabix. i_intern-col = l_sic_col + 1. i_intern-value = i_tab. APPEND i_intern. ENDIF.
    ENDLOOP.
    ENDFORM.
    “ SEPARATEDTO_INTERN_CONVERT

    —————————————————————————————————
    FORM lineto_cell_separat TABLES i_intern TYPE ty_t_itab
    USING i_line
    i_row LIKE sy-tabix
    ch_cell_col TYPE kcd_ex_col
    i_separator TYPE c i_fdpos LIKE sy-fdpos. DATA: l_string TYPE ty_s_senderline. DATA l_sic_int TYPE i.
    CLEAR i_intern. l_sic_int = i_fdpos. i_intern-row = i_row. l_string = i_line. i_intern-col = ch_cell_col.
    * csv Dateien mit separator in Zelle: —> ;”abc;cd”;
    IF ( i_separator = ‘;’ OR i_separator = ‘,’ ) AND l_string(1) = gc_esc.
    PERFORM line_to_cell_esc_sep USING l_string
    l_sic_int
    i_separator
    i_intern-value. ELSE. IF l_sic_int > 0. i_intern-value = i_line(l_sic_int). ENDIF. ENDIF. IF l_sic_int > 0. APPEND i_intern. ENDIF.
    l_sic_int = l_sic_int + 1. i_line = i_line+l_sic_int.
    ENDFORM.
    “ LINETO_CELL_SEPARAT

    —————————————————————————————————
    FORM lineto_cell_esc_sep USING i_string
    i_sic_int TYPE i i_separator TYPE c i_intern_value TYPE ty_d_itabvalue. DATA: l_int TYPE i, l_cell_end(2). FIELD-SYMBOLS: . l_cell_end = gc_esc. l_cell_end+1 = i_separator .
    IF i_string CS gc_esc. i_string = i_string+1. IF i_string CS l_cell_end. l_int = sy-fdpos. ASSIGN i_string(l_int) TO . i_intern_value = . l_int = l_int + 2. i_sic_int = l_int. i_string = i_string+l_int. ELSEIF i_string CS gc_esc.
    letzte Celle l_int = sy-fdpos. ASSIGN i_string(l_int) TO . i_intern_value = . l_int = l_int + 1. i_sic_int = l_int. i_string = i_string+l_int. l_int = strlen( i_string ). IF l_int > 0 . MESSAGE x001(kx) . ENDIF. ELSE. MESSAGE x001(kx) . “was ist mit csv-Format ENDIF. ENDIF.
    ENDFORM.
    “ LINETO_CELL_ESC_SEP


    程序_TOP
    TYPES: BEGIN OF zlsmextabline, row TYPE char8, col TYPE char8, value(6000), END OF zlsmex_tabline.
    DATA itab TYPE STANDARD TABLE OF zlsmex_tabline WITH HEADER LINE.
    TYPES: ty_d_itabvalue TYPE zlsmex_tabline-value, ty_t_itab TYPE zlsmex_tabline OCCURS 0, BEGIN OF ty_s_senderline, line(4096) TYPE c, END OF ty_s_senderline, ty_t_sender TYPE ty_s_senderline OCCURS 0.
    *常量_
    CONSTANTS: gc_esc VALUE ‘“‘.