无论是upload还是download,首先要确定文件的路径和名字。
首先介绍获取文件路径方法(这里仅介绍一种作为参考)
PARAMETERS:P_PATH(80) OBLIGATORY.
AT SELECTION-SCREEN OUTPUT. " pbo
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH.
"调用选择文件函数"
PERFORM FRM_OPEN_DIALOG.
*&---------------------------------------------------------------------*
*& Form FRM_OPEN_DIALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_OPEN_DIALOG .
DATA:LT_FILE_TABLE TYPE FILETABLE.
DATA:LW_FILE_TABLE TYPE FILE_TABLE ##NEEDED.
DATA:LV_RC TYPE I.
DATA:LC_FILE_FILTER TYPE STRING VALUE 'Excel(*.xlsx)' ##NO_TEXT,
LC_DEFAULT_FILENAME TYPE STRING VALUE '*.XLSX'.
DATA:LC_WINDOW_TITLE TYPE STRING .
LC_WINDOW_TITLE = TEXT-002.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = LC_WINDOW_TITLE " 文件打开对话框的标题
DEFAULT_FILENAME = LC_DEFAULT_FILENAME " 默认excel文件"
INITIAL_DIRECTORY = '' " 默认打开D盘,也可以默认空"D:\
MULTISELECTION = '' " 文件单选"
FILE_FILTER = LC_FILE_FILTER " 文件扩展名过滤字符串
CHANGING
FILE_TABLE = LT_FILE_TABLE
RC = LV_RC
EXCEPTIONS ##SUBRC_OK
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF LV_RC EQ 1."因为文件单选,所以这里判断一下选择的数量为1"
READ TABLE LT_FILE_TABLE INDEX 1 INTO P_PATH.
ELSEIF LV_RC EQ 0.
ELSE.
MESSAGE S009(ZFI09).
ENDIF.
一、上载(转内表)
(一)、最常用FM的是:GUI_UPLOAD
有同等作用的是CLASS cl_gui_frontend_services的静态方法gui_upload,文件可以按二进制或文本格式上传,数值和日期等依赖于用户的设置。
上传二进制文件时,内表通常定义为只含一个数据类型为X的field,如:
data:begin of itab occurs 0,
raw(255) type X,
end fo itab.
CALL FUNCTION 'GUI_UPLOAD'
exporting
filetype = 'BIN'
filename = 'C:/DOWNLOAD.BIN'
tables
data_tab = itab.
主要参数:输入有filename 要上传文件的完成路径, filetype 包括’BIN’ ‘DAT’ 'ASC’等,codepage 以数字编号的字符集,如8400是简体中文
输出有data_tab 储存文件中数据的内表
(二)、对上传excel数据可用FM TEXT_CONVERT_XLS_TO_SAP
因为输出的I_TAB_CONVERTED_DATA类型为任意的standard table,所以此FM能方便的把excel中内容转化成格式相同的内表中。
field-symbols: type standard table.
call function 'TEXT_CONVERT_XLS_TO_SAP'
exporting
* I_FIELD_SEPERATOR =
* I_LINE_HEADER =
i_tab_raw_data = raw_data
i_filename = excel_file
tables
i_tab_converted_data =
exceptions
conversion_failed = 1
others = 2.
参数i_tab_raw_data虽为改办field,但好像没什么作用,传入一个空数据也可正常使用。
(三)、ALSM_EXCEL_TO_INTERNAL_TABLE
call function 'ALSM_EXCEL_TO_INTERNAL_TABLE'
exporting
filename = p_file
i_begin_col = p_scol
i_begin_row = p_srow
i_end_col = p_ecol
i_end_row = p_erow
tables
intern = i_intern
exceptions
inconsistent_parameters = 1
upload_ole = 2
others = 3.
此FM可以限制从excel文件中第几行第几列开始,一次上传多少行多少列,但一次上传的最大行数为9999,是由接收数据的内表intern的定义来限制的。所以如果要上传多于9999行的数据,要编码分批上传实现的。而intern不是直接与excel数据格式相符的内表,是系统定义好的,包含了行号、列号、数据值等,具体的请参照系统定义,因此要想转成自己定义符合格式的内表,可用下面代码实现:
field-symbols : <$fs>.
data exception type ref to cx_root.
sort i_intern by row col.
try.
loop at i_intern.
move i_intern-col to index.
assign component index of structure i_table to <$fs>.
move i_intern-value to <$fs>.
at end of row.
append i_table. "user defined internal table to store excel data
clear i_table.
endat.
endloop.
catch cx_root into exception.
message 'Excel data format is wrong,please check' type 'E'.
endtry.
PS:sheet数据被截取解决方法
复制:函数ALSM_EXCEL_TO_INTERNAL_TABLE
-> ZALSM_EXCEL_TO_INTERNAL_TABLE
修改 zalsmex_tabline-value 的长度
TOP中要添加如下代码:
二、下载模板