&——————————————————————————————————-
*& 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
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
—————————————————————————————————
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:
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
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 ‘“‘.
