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 内表,包含要下载成文件的数据


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 作者: 惟湛 如何调整ABAP程序的性能(copy) 7、两个内表添加使用批量增加代替逐行不推荐Loop at i...
    SmalltalkVoice阅读 7,435评论 7 18
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,021评论 3 53
  • Simple Excel Export 简单的Excel导出推荐http://www.cnblogs.com/hy...
    地狱咆哮Zzzzz阅读 15,610评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 曾经 分隔两地的爱人望穿秋水等待一次相聚;如今,同处一室的夫妻各看各的手机。我可以承认,我真的很想念以前的样子,但...
    Cathy乐阅读 206评论 0 2