ABAP EXCEL檔案上傳與下載
阿新 • • 發佈:2018-12-31
*----------------------- 上傳 Example 1 ----------------------------------
假設有資料在excel中如下:
sname sno sex
孫曉磊 001 男
周杰倫 002 男
阿貓 003 女
阿狗 004 男
DATA: gt_data TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE.
TYPES: BEGIN OF ty_itab,
sname(10),
sno(10),
sex( 3),
END OF ty_itab.
DATA: wa TYPE ty_itab,
itab TYPE TABLE OF ty_itab."定義的這個內表結構要與excel表完全一樣
PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',Excel Files,*.xls,All Files,*.*.' (101)
title = '選擇檔案'(100)
IMPORTING
filename = p_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0 AND sy-subrc <> 3.
MESSAGE e100( zdev) WITH '選擇檔案出錯!'(007).
ENDIF.
START-OF-SELECTION.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' "讀取excel檔案中的內容
EXPORTING
filename = p_file
i_begin_col = '1'
i_begin_row = '1'
i_end_col = '50'
i_end_row = '5000'
TABLES
intern = gt_data.
SORT gt_data BY row col value.
*---整理到內表資料
LOOP AT gt_data.
CASE gt_data-col.
WHEN 1.
wa-sname = gt_data-value.
WHEN 2.
wa-sno = gt_data-value.
WHEN 3.
wa-sex = gt_data-value.
APPEND wa TO itab."對於這個例子,excel表有3列,append要加在最後一列.
CLEAR wa.
ENDCASE.
ENDLOOP.
LOOP AT itab INTO wa.
WRITE:/ wa-sname,wa-sno,wa-sex.
ULINE.
ENDLOOP.
*----------------------- 上傳 Example 2 ----------------------------------
TYPE-POOLS: truxs.
TYPES: BEGIN OF t_datatab,"只記錄excel檔案的前四列
col1(30) TYPE c,
col2(30) TYPE c,
col3(30) TYPE c,
col4(30) TYPE c,
END OF t_datatab.
DATA: it_datatab TYPE STANDARD TABLE OF t_datatab,
wa_datatab TYPE t_datatab.
DATA: it_raw TYPE truxs_t_text_data.
PARAMETERS: p_file TYPE rlgrap-filename.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE'
IMPORTING
file_name = p_file.
START-OF-SELECTION.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X' "帶表頭的,佔一行,這一行不會讀到內表
i_tab_raw_data = it_raw "WORK TABLE
i_filename = p_file "讀這個檔案時要保證它沒有被開啟
TABLES
i_tab_converted_data = it_datatab[] "ACTUAL DATA
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT it_datatab INTO wa_datatab.
CONDENSE wa_datatab.
WRITE:/ wa_datatab-col1,
wa_datatab-col2,
wa_datatab-col3,
wa_datatab-col4.
ENDLOOP.
*----------------------- 下載 Example ----------------------------------
TYPE-POOLS: abap.
DATA: fullpath TYPE string,
filename TYPE string,
path TYPE string,
user_action TYPE i,
encoding TYPE abap_encoding.
PARAMETERS: p_file TYPE string DEFAULT 'C:\ABC.xls'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = '下載到本地檔案'
default_extension = 'XLS' "預設檔案型別
default_file_name = '預設檔名稱'
file_filter = '文字檔案(*.TXT)|*.TXT|Excel 檔案 (*.XLS)|*.XLS;*.XLSX|所有檔案 (*.*)|*.*|'
with_encoding = 'X'
initial_directory = 'C:\'
CHANGING
filename = filename "獲得使用者輸入檔名
path = path "獲得使用者所選路徑
fullpath = fullpath "路徑加檔名
user_action = user_action
file_encoding = encoding.
IF sy-subrc <> 0 OR user_action <> cl_gui_frontend_services=>action_ok.
EXIT.
ENDIF.
DATA: itab TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.
SELECT * FROM spfli INTO TABLE itab.
DATA filename2 TYPE rlgrap-filename.
filename2 = fullpath.
CALL FUNCTION 'SAP_CONVERT_TO_XLS_FORMAT'
EXPORTING
i_field_seperator = 'X' "欄位分隔開
i_filename = filename2
TABLES
i_tab_sap_data = itab.
假設有資料在excel中如下:
sname sno sex
孫曉磊 001 男
周杰倫 002 男
阿貓 003 女
阿狗 004 男
DATA: gt_data TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE.
TYPES: BEGIN OF ty_itab,
sname(10),
sno(10),
sex(
END OF ty_itab.
DATA: wa TYPE ty_itab,
itab TYPE TABLE OF ty_itab."定義的這個內表結構要與excel表完全一樣
PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',Excel Files,*.xls,All Files,*.*.'
title = '選擇檔案'(100)
IMPORTING
filename = p_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0 AND sy-subrc <> 3.
MESSAGE e100(
ENDIF.
START-OF-SELECTION.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' "讀取excel檔案中的內容
EXPORTING
filename = p_file
i_begin_col = '1'
i_begin_row = '1'
i_end_col = '50'
i_end_row = '5000'
TABLES
intern = gt_data.
SORT gt_data BY row col value.
*---整理到內表資料
LOOP AT gt_data.
CASE gt_data-col.
WHEN 1.
wa-sname = gt_data-value.
WHEN 2.
wa-sno = gt_data-value.
WHEN 3.
wa-sex = gt_data-value.
APPEND wa TO itab."對於這個例子,excel表有3列,append要加在最後一列.
CLEAR wa.
ENDCASE.
ENDLOOP.
LOOP AT itab INTO wa.
WRITE:/ wa-sname,wa-sno,wa-sex.
ULINE.
ENDLOOP.
*----------------------- 上傳 Example 2 ----------------------------------
TYPE-POOLS: truxs.
TYPES: BEGIN OF t_datatab,"只記錄excel檔案的前四列
col1(30) TYPE c,
col2(30) TYPE c,
col3(30) TYPE c,
col4(30) TYPE c,
END OF t_datatab.
DATA: it_datatab TYPE STANDARD TABLE OF t_datatab,
wa_datatab TYPE t_datatab.
DATA: it_raw TYPE truxs_t_text_data.
PARAMETERS: p_file TYPE rlgrap-filename.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE'
IMPORTING
file_name = p_file.
START-OF-SELECTION.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X' "帶表頭的,佔一行,這一行不會讀到內表
i_tab_raw_data = it_raw "WORK TABLE
i_filename = p_file "讀這個檔案時要保證它沒有被開啟
TABLES
i_tab_converted_data = it_datatab[] "ACTUAL DATA
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT it_datatab INTO wa_datatab.
CONDENSE wa_datatab.
WRITE:/ wa_datatab-col1,
wa_datatab-col2,
wa_datatab-col3,
wa_datatab-col4.
ENDLOOP.
*----------------------- 下載 Example ----------------------------------
TYPE-POOLS: abap.
DATA: fullpath TYPE string,
filename TYPE string,
path TYPE string,
user_action TYPE i,
encoding TYPE abap_encoding.
PARAMETERS: p_file TYPE string DEFAULT 'C:\ABC.xls'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = '下載到本地檔案'
default_extension = 'XLS' "預設檔案型別
default_file_name = '預設檔名稱'
file_filter = '文字檔案(*.TXT)|*.TXT|Excel 檔案 (*.XLS)|*.XLS;*.XLSX|所有檔案 (*.*)|*.*|'
with_encoding = 'X'
initial_directory = 'C:\'
CHANGING
filename = filename "獲得使用者輸入檔名
path = path "獲得使用者所選路徑
fullpath = fullpath "路徑加檔名
user_action = user_action
file_encoding = encoding.
IF sy-subrc <> 0 OR user_action <> cl_gui_frontend_services=>action_ok.
EXIT.
ENDIF.
DATA: itab TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.
SELECT * FROM spfli INTO TABLE itab.
DATA filename2 TYPE rlgrap-filename.
filename2 = fullpath.
CALL FUNCTION 'SAP_CONVERT_TO_XLS_FORMAT'
EXPORTING
i_field_seperator = 'X' "欄位分隔開
i_filename = filename2
TABLES
i_tab_sap_data = itab.