ABAP报表数据处理:本地文件upload && download

无论是upload还是download,首先要确定文件的路径和名字。再将文件数据upload到内表或是将内表数据download到本地文件。

一、 打开文件选择框,确定文件的路径和名字(以下几种方法皆可)
  • 使用FM: WS_FILENAME_GET,已过时可使用TB_LIMIT_WS_FILENAME_GET替代,区别其他是可以打开 /保存,可指定默认路径和文件名称
  CONCATENATE '总公司年终奖基数计算_' sy-datum '_' sy-uzeit '.xls' INTO lv_filename.
  CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
    EXPORTING
   DEF_FILENAME           = lv_filename
   DEF_PATH               = 'D:\HR\ '
   "MASK                   = '.XLS'
   MODE                   = 'S'
*   TITLE                  = ' '
 IMPORTING
   FILENAME               = lv_filename
*   PATH                   =
*   FILE                   =
* EXCEPTIONS
*   SELECTION_CANCEL       = 1
*   SELECTION_ERROR        = 2
*   OTHERS                 = 3
    .
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等其他参数的影响。
'DAT'——具有单元格形式的文本文件,但直接用excel打开的话,文本内容会受单元格格式影响(如自动会去前导零等)。这种文件可直接再用gui_upload上传到SAP程序中。     
'BIN'——二进制格式文件,没有格式和字体集的限制。一般配合参数codepage = '8400' 
'IBM'——ASCII文件,但只能包含IBM字符集的字符(CODEPAGE = '1103'),这种格式的文件通常用在软盘上。    
'DBF'——dBase格式,对于要用excel打开的数据,此种格式更能保持数据原型,不受excel单元格格式的影响。  
'WK1'——Lotus 1-2-3格式。  
4)APPEND:'X'以追加模式写文件,SPACE 当文件已存在时,以覆盖模式写文件。
5)CODEPAGE 指定写文件时用的字符集DATA_TAB 内表,包含要下载成文件的数据


你可能感兴趣的:(ABAP报表数据处理:本地文件upload && download)