(1)先在屏幕上增加上传文件的按钮
"屏幕选择条件"
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_source LIKE rlgrap-filename .
SELECTION-SCREEN END OF BLOCK b1.
你会发现,上面的代码只是简单的单文本框,没有可以让我们选择的界面
(2)为单文本框增添搜索帮助(PARAMETERS自定义搜索帮助)
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_source.
"防止数据复用"
CLEAR p_source.
"获取文件名称"
PERFORM get_filename.
START-OF-SELECTION."屏幕选择结束标志/处理数据程序开始执行"
get_filename 的四种方法
① 获取文件名称方法一(不推荐)
FORM GET_FILENAME1.
TRY.
CALL FUNCTION 'WS_FILENAME_GET' "虽然该函数仍然可以使用 , 但是该函数已经过时了"
EXPORTING
DEF_FILENAME = '' "默认文件名称"
DEF_PATH = '' "路径"
" 格式 : (空格不可少) 名称1 , *.xls (格式1),名称2 , *.xlsx(格式2) ,名称3 ,*.*.(格式3 , 注意 : . 号不可缺) "
""MASK = ' XLS,*.xls,XLSX,*.xlsx,All Files,*.*.'
MASK = ''
" 弹出框的模式 S -- 用来保存文件 O -- 用来打开文件 "
MODE = '0'
TITLE = '请选择文件 '
IMPORTING
FILENAME = p_source
" RC = "
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3 "如果用户取消了对话框"
SELECTION_ERROR = 4
OTHERS = 5 .
ENDTRY.
ENDFORM.
② 获取文件名称方法二
FORM GET_FILENAME2.
DATA : G_RC TYPE I.
DATA : L_OBJ TYPE REF TO CL_GUI_FRONTEND_SERVICES.
DATA : IT_FILE TYPE FILETABLE WITH HEADER LINE.
CREATE OBJECT L_OBJ.
CALL METHOD L_OBJ->FILE_OPEN_DIALOG
EXPORTING
FILE_FILTER = ''
INITIAL_DIRECTORY = ''
CHANGING
FILE_TABLE = IT_FILE[]
RC = G_RC
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
READ TABLE IT_FILE INDEX 1.
P_SOURCE = IT_FILE-FILENAME.
ENDFORM.
③ 获取文件名称方法三
FORM GET_FILENAME3.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
PROGRAM_NAME = SYST-CPROG "程序名"
DYNPRO_NUMBER = SYST-DYNNR "当前屏幕号"
FIELD_NAME = ' ' "文件类型 , 默认为空"
IMPORTING
FILE_NAME = P_SOURCE. "文件名称"
ENDFORM.
④ 获取文件名称方法四
FORM GET_FILENAME4.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
PROGRAM_NAME = SYST-REPID
DYNPRO_NUMBER = SYST-DYNNR
FIELD_NAME = ' '
STATIC = ' '
MASK = ' '
FILEOPERATION = 'R'
PATH = ' '
CHANGING
FILE_NAME = P_SOURCE
"LOCATION_FLAG = 'P'
EXCEPTIONS
MASK_TOO_LONG = 1
OTHERS = 2.
ENDFORM.
这时候就能获取文件的路径了
(3)将excel数据读取到内表
① 定义内表(推荐全局定义)
"接收EXCEL报表数据的内表 (承接excel数据的内表格式一般都是string类型,内表定义多少列,就会读取EXCEL 前几列)"
DATA :
BEGIN OF gt_excel OCCURS 0,
aufnr(12), " 工單號碼"
gstrs(10), " 工單開始日期"
gltrs(10), " 工單結束日期"
info(50),"信息提示"
END OF gt_excel.
② 将excel数据读取到内表
FORM get_excel .
"如果为空,表示没有选中文件"
IF p_source EQ ''.
MESSAGE s000(1) WITH '未选择文件!' DISPLAY LIKE 'E'.
STOP.
ENDIF."文件选中后 , 将文件信息读取到内表 , 注意 : 文件信息的排版 , 必须与获取数据内表的数据结构 , 排版要一致 , 不然会报错"
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' "可以是Excel文件,也可以是Txt文件"
EXPORTING
"* I_FIELD_SEPERATOR = 分隔符,默认为TAB"
i_line_header = 'X' "文本中的第一行是否是标题头,如果是则不会读取"
i_tab_raw_data = il_raw "该参数实际上没有使用到,但为必输参数"
i_filename = p_source
TABLES
i_tab_converted_data = gt_excel "会自动的将Excel、Txt文件中的数据一行行读取到数据内表中"
EXCEPTIONS
conversion_failed = 1
OTHERS = 2."如果excel 数据格式不正确 或 excel 数据为空 , 提示重新选择文件"
IF gt_excel[] IS INITIAL .
MESSAGE s000(1) WITH '文件无数据或文件格式出错,请重新选择文件!' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
*----------------------------------------------------------------------*
* LEAVE LIST-PROCESSING.
*
* 如果写在at selection-screen 就返回到输出界面
* 如果写在start-of-selection. 就返回到initialization事件
*
*----------------------------------------------------------------------*
ENDFORM.