ABAP报表数据处理:本地文件upload &&
无论是upload还是download,首先要确定文件的路径和名字。再将文件数据upload到内表或是将内表数据download到本地文件。
一、 打开文件选择框,确定文件的路径和名字(以下几种方法皆可)
- 使用FM: WS_FILENAME_GET
DATA s_file LIKE rlgrap-filename.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = '工资单.XLS ' "默认文件名
DEF_PATH = 'd: ' "当前路径
MASK = ',*.TXT. ' "文件格式:All Files (*.*)|*.*|Excel Files (*.xls)|*.xls|Word files(*.doc)|*.doc
MODE = 'O ' "S = 保存,O = 打开
" TITLE = ' ' "设置对话框名称
IMPORTING
FILENAME = s_file
" RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5 .
- 使用FM: F4_FILENAME
CALL FUNCTION 'F4_FILENAME'
EXPORTING
PROGRAM_NAME = SYST-CPROG "当前程序名
DYNPRO_NUMBER = SYST-DYNNR "当前屏幕编号
FIELD_NAME = ' ' "指定字段帮助
IMPORTING
FILE_NAME = s_file "获取到的文件名
- 使用FM: KD_GET_FILENAME_ON_F4
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
CHANGING
file_name = s_file
EXCEPTIONS
MASK_TOO_LONG = 1
OTHERS = 2.
- 使用Class cl_gui_frontend_services的静态方法file_open_dialog
此方法功能强大,可以修饰文件选择框,指定默认选择路径,设置文件类型过滤,同时打开多个文件,返回用户操作等
DATA: it_tab TYPE filetable,
gb_rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select File'
default_extension = '*.xls'
default_filename = ' '
file_filter = cl_gui_frontend_services=>filetype_excel "文件过滤:或者All Files (*.*)|*.*|Excel Files (*.xls)|*.xls|Word files(*.doc)|*.doc'
initial_directory = 'C:'
multiselection = 'X' "是否可以同时打开多个文件
CHANGING
file_table = it_tab
rc = gb_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
others = 5 .
二、 文件upload方法(转成内表)
- 最常用FM:GUI_UPLOAD
有同等作用的是CLASS METHOD:* cl_gui_frontend_services=>gui_upload*,文件可以按二进制或文本格式上传,数值和日期等依赖于用户的设置。上传二进制文件时,内表通常定义为只含一个数据类型为X的field。
DATA: BEGIN OF itab OCCURS 0,
raw(255) TYPE x,
END OF itab.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = 'E:\02 sap文档自建 ' "要上载文件的完整路径
filetype = 'ASC' "ASC/BIN/DAT
CODEPAGE = ' ' "以数字编号的字符集,如8400是简体中文
TABLES
data_tab = itab " 储存文件中数据的内表
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6 .```
- 上传excel数据可用FM: TEXT_CONVERT_XLS_TO_SAP
因为输出的I_TAB_CONVERTED_DATA类型为任意的standard table,所以此FM能方便的把excel中内容转化成格式相同的内表中,还可以去掉首行。
TYPE-POOLS truxs.
DATA:it_raw TYPE truxs_t_text_data.
DATA: BEGIN OF gt_data OCCURS 0,
col1 TYPE char10,
col2 TYPE char10,
END OF gt_data.
PARAMETERS:p_file TYPE rlgrap-filename.
*在p_file上点击F4时触发,获取文件名
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CLEAR p_file.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file. "返回文件名
Excel传值
START-OF-SELECTION.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_tab_raw_data = it_row
i_filename = p_file
TABLES
i_tab_converted_data = gt_data "存储数据的内表,内表列数和要上传的数据列数相同,其按照列来匹配传值
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
- 使用FM:ALSM_EXCEL_TO_INTERNAL_TABLE
1)此FM可以限制从excel文件中第几行第几列开始,一次上传多少行多少列,但一次上传的最大行数为9999,,是由接收数据的内表intern的定义来限制的。如果要上传多于9999行的数据,要编码分批上传实现的。
2)而intern不是直接与excel数据格式相符的内表,是系统定义好的,包含了行号、列号、数据值等。要先loop这个intern内表,再一条一条传到自定义格式内表中去
DATA lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
DATA l_index LIKE sy-tabix.
PARAMETERS:p_file TYPE rlgrap-filename.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = '1'
i_begin_row = '2'
i_end_col = '50'
i_end_row = '50000'
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
*将EXCEL格式中的数据导入到内表itab中
LOOP AT lt_excel.
MOVE lt_excel-col TO l_index.
CASE l_index.
WHEN'1'.
MOVE lt_excel-value TO itab-d_name.
WHEN'2'.
MOVE lt_excel-value TO itab-d_text.
WHEN'3'.
MOVE lt_excel-value TO itab-d_type.
WHEN'4'.
MOVE lt_excel-value TO itab-d_caracters.
ENDCASE.
AT END OF row.
APPEND itab.
CLEAR itab.
ENDAT.
ENDLOOP.
**********************************或者按如下方式:********************************
FIELD-SYMBOLS : <$fs>.
DATA exception TYPE REF TO cx_root.
SORT lt_excel BY row col.
TRY.
LOOP AT lt_excel.
MOVE lt_excel-col TO index.
ASSIGN COMPONENT index OF STRUCTURE i_table TO <$fs>.
MOVE lt_excel-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.
#####三、 文件download方法(内表->文件)
- 最常用FM: gui_download
等同于 cl_gui_frontend_services=>gui_download
先获取导出文件名,然后如下:
call method
cl_gui_frontend_services=>gui_download
exporting
- BIN_FILESIZE =
filename = s_file
filetype = 'DAT' " ASC,WK1 - APPEND = ' '
changing
data_tab = ot_data[]
exceptions
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5.
参数简述:
1)BIN_FILESIZE:当要创建二进制文件时,必须指定文件长度,但要下载成文本文件时,传入此参数会报 FILESIZE_NIT_ALLOWED错误。2)FILENAME:要存放文件的完整路径。要保证路径有效并且如果文件存在的话没有被打开,否则会报错。
3)FILETYPE:
** 'ASC'**——ASCII格式文件,此参数会受到CODEPAGE等其他参数的影响。
**'IBM'**——ASCII文件,但只能包含IBM字符集的字符(CODEPAGE = '1103'),这种格式的文件通常用在软盘上。
**'DAT'**——具有单元格形式的文本文件,但直接用excel打开的话,文本内容会受单元格格式影响(如自动会去前导零等)。这种文件可直接再用gui_upload上传到SAP程序中。
**'DBF'**——dBase格式,对于要用excel打开的数据,此种格式更能保持数据原型,不受excel单元格格式的影响。
**'WK1'**——Lotus 1-2-3格式。
**'BIN'**——二进制格式文件,没有格式和字体集的限制。
4)APPEND:'X'以追加模式写文件,SPACE 当文件已存在时,以覆盖模式写文件。
5)CODEPAGE 指定写文件时用的字符集DATA_TAB 内表,包含要下载成文件的数据
---