操作 EXCEL 文件方式

使用类操作文件

CL_GUI_FRONTEND_SERVICES:该类提供了大量对操作系统文件的操作,如拷贝、列出文件名、打开文件、下载文件等。

  • FILE_OPEN_DIALOG:显示文件打开对话框

  • FILE_SAVE_DIALOG:显示文件保存对话框

  • GUI_DOWNLOAD:下载文本文件到本地PC

  • GUI_UPLOAD:从本地文本文件读取数据

使用 BAPI 操作文件

F4 获取文件路径

  • KD_GET_FILENAME_ON_F4:打开选择框,并获取本地文件路径
  • WS_FILENAME_GET:打开选择框,并获取本地文件路径
  • F4_FILENAME:最简洁的方式

判断文件是否存在

  • CALL FUNCTION ‘WS_QUERY’:判断本地文件是否存在,并返回文件名
  • CALL FUNCTION ‘WWWDATA_IMPORT’:判断服务器是否存在该模板,并返回模板数据

内表数据下载到文件

  • CALL FUNCTION ‘DOWNLOAD’:提示保存
  • CALL FUNCTION ‘WS_DOWNLOAD’:不提示直接保存

文件数据读取到内表

  • CALL FUNCTION ‘UPLOAD’:提示读入内表
  • CALL FUNCTION ‘WS_UPLOAD’:不提示直接读入内表
  • CALL FUNCTION ‘GUI_UPLOAD’:读取 txt 模板文件

读取本地文件并转换为内表

GUI 输入框选择文件 (F4)

TABLES: sscrfields.
TYPE-POOLS: slis.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) text-001 FOR FIELD p_file.
PARAMETERS: p_file LIKE rlgrap-filename .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK blk1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_get_filename CHANGING p_file.
  IF cv_file IS INITIAL.
    MESSAGE 'Please input file!' TYPE 'I'.
    STOP.
    SET CURSOR FIELD p_file.
  ENDIF.
" Method"
FORM frm_get_filename  CHANGING cv_file.
  DATA: lt_file TYPE filetable,
        lv_rc   TYPE i.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG  
    EXPORTING
      window_title            = '选择上传文件'
      default_extension       = '*.XLS,*.XLSX'
      file_filter             = 'All Files (*.*)|*.*|NotePad Files(*.txt)|*.txt
                                |Excel Files(*.xls)|*.xls|Excel Files(*.xlsx)|*.xlsx
                                |Word files(*.doc)|*.doc'
      "INITIAL_DIRECTORY = 'C:/'  "初始化的目录"
      "MULTISELECTION = 'X'       "是否可以同时打开多个文件"
    CHANGING
      file_table              = lt_file  "打开文件名的列表"
      rc                      = lv_rc    "返回打开文件的数量"
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc EQ 0 AND lv_rc EQ 1.
    READ TABLE lt_file INDEX 1 INTO cv_file.
  ENDIF.
ENDFORM.                    " FRM_GET_FILENAME "

判断本地文件是否存在

DATA l_file_exist TYPE c.
CLEAR l_file_exist.
CALL FUNCTION 'WS_QUERY'
  EXPORTING
    filename = p_file
    query    = 'FE'
  IMPORTING
    return   = l_file_exist.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF l_file_exist <> 1 OR l_file_exist IS INITIAL.
  MESSAGE 'File not found' TYPE 'E'.
ENDIF.

调用 METHOD 读取文件内容到内表

CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    FILENAME            = p_file  "要读取的文件"
    FILETYPE            = 'ASC'
    HAS_FIELD_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB "字段间按TAB键分隔开來"
  TABLES
    DATA_TAB            = TXT_READ_DATA  "写入相应的內表中"
  EXCEPTIONS
    FILE_OPEN_ERROR     = 1
    FILE_READ_ERROR     = 2.

获取 Excel 数据并转换成内表

获取EXCEL内容

DATA: g_it_excel TYPE TABLE OF alsmex_tabline.
CLEAR:g_it_excel,g_it_excel[].
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
  EXPORTING
    filename                = p_file
    i_begin_col             = '1'
    i_begin_row             = '2'
    i_end_col               = '100'
    i_end_row               = '65535'
  TABLES
    intern                  = g_it_excel.
  EXCEPTIONS
    inconsistent_parameters = 1
    upload_ole              = 2
    OTHERS                  = 3.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

获取EXCEL行、列,值进行数据处理

LOOP AT GT_EXCEL_T INTO GS_EXCEL_T.
  AT NEW ROW.
    CLEAR:GW_EXCEL.
  ENDAT.
  CASE GS_EXCEL_T-COL.
    WHEN 1.
      GW_EXCEL-LIFNR = GS_EXCEL_T-VALUE.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GW_EXCEL-LIFNR
        IMPORTING
          OUTPUT = GW_EXCEL-LIFNR.
    WHEN 2.
      GW_EXCEL-MATNR = GS_EXCEL_T-VALUE.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GW_EXCEL-MATNR
          IMPORTING
             OUTPUT = GW_EXCEL-MATNR.
    WHEN 3.
      GW_EXCEL-EKORG = GS_EXCEL_T-VALUE.
    WHEN 4.
      GW_EXCEL-WERKS = GS_EXCEL_T-VALUE.
    WHEN 5.
      GW_EXCEL-NETPR = GS_EXCEL_T-VALUE.
    WHEN 6.
      GW_EXCEL-KPEIN = GS_EXCEL_T-VALUE.
    WHEN 7.
      GW_EXCEL-LIFAB = GS_EXCEL_T-VALUE.
    WHEN 8.
   *  GW_EXCEL-NORBM = GS_EXCEL_T-VALUE.
      GW_EXCEL-LIFBI = GS_EXCEL_T-VALUE.
    WHEN 9.
      GW_EXCEL-MWSKZ = GS_EXCEL_T-VALUE.
    WHEN OTHERS.
  ENDCASE.
  AT END OF ROW.
    APPEND GW_EXCEL TO GT_EXCEL.
  ENDAT.
ENDLOOP.

获取 Excel 数据函数

TEXT_CONVERT_XLS_TO_SAP :这个函数直接可以把 execl 的内容原原本本的写入到内表,不用格式转化那么麻烦。如果该内表 ITAB 的数据最后要写入你的自建表里,那么还得迂回一下,因为透明表里有个 MANDT 客户端字段。所以得再建一个内表来迂回。

注意事项

  • EXCEL 中第一行是标题,调用 FM 时,参数 I_LINE_HEADER=’X’;读第一条数据时,会把标题放入 “值是空的字段”

  • 模板中前两行是标题,调用 FM 时,参数 I_LINE_HEADER=‘’,然后再把前两行数据删除;100*N+1 行,有把标题放入 “值是空的字段” 的情况

* 定义一个内表来存储数据,内表的列数和要传得数据的列数要相同,其按照列来匹配传值
DATA: BEGIN OF gt_data OCCURS 0,
     col1 TYPE char10,
     col2 TYPE char10,
  END OF gt_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'  
  EXPORTING  
*   I_FIELD_SEPERATOR          =  
    I_LINE_HEADER               = 'X'  
    i_tab_raw_data             = IT_RAW  
    i_filename                 = fname1  
  tables  
    i_tab_converted_data       = gt_data  
  EXCEPTIONS  
    CONVERSION_FAILED          = 1  
    OTHERS                     = 2  .  
IF sy-subrc <> 0.  
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
      WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
ENDIF.  

程序实例