数据文件的读取与写入

*相关函数
*WS_FILENAME_GET:读取文件路径对话框
*ALSM_EXCEL_TO_INTERNAL_TABLE:读取Excel文件数据到指定内表
*WS_UPLOAD:读取文本文件数据到指定内表
*WS_DOWNLOAD:将内表数据写入到文本文件
*WS_EXCEL:将内表数据写入到Excel文件

DATA:filename TYPE localfile,
      filetype(10TYPE c.

DATA:BEGIN OF record OCCURS 0,
  col1(20),
  col2(20),
  col3(20),
  col4(20),
  col5(20),
  END OF record.

DATA:forecast_itabt LIKE STANDARD TABLE OF alsmex_tabline WITH HEADER LINE.

START-OF-SELECTION.
*调用函数打开文件对话框,MASK参数表示预设开启文件类型,若需要定义多个参数类型可采用
*MASK = ',*.txt,*.txt;,*dat,*dat;,*.xls,*,xls,*.'
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     ' '
      def_path         'C:\EXAMPLE\DIR'
      mask             ',*.*,*.*. '
      mode             'O '
      title            'Choose Input file '
    IMPORTING
      filename         = filename
    EXCEPTIONS
      inv_winsys       1
      no_batch         2
      selection_cancel 3
      selection_error  4
      OTHERS           5.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

**自定义子程序从字符串分拆文件类型
  PERFORM getfiletype USING filename filetype.

  IF filetype 'XLS'.
*当为Excel类型时调用此参数,所抓取的文件数据在内表中为每个单元格为一行
    CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
        filename                = filename
        i_begin_col             1
        i_begin_row             1
        i_end_col               5
        i_end_row               1000
      TABLES
        intern                  = forecast_itabt
      EXCEPTIONS
        inconsistent_parameters 1
        upload_ole              2
        OTHERS                  3.
**重新整理从Excel中抓取数据整理到所应用的内表
    IF NOT forecast_itabt[] IS INITIAL.
      LOOP AT forecast_itabt.
        CASE forecast_itabt.
          WHEN '0001'.
            record-col1 = forecast_itabt-value.
          WHEN '0002'.
            record-col2 = forecast_itabt-value.
          WHEN '0003'.
            record-col3 = forecast_itabt-value.
          WHEN '0004'.
            record-col4 = forecast_itabt-value.
          WHEN '0005'.
            record-col5 = forecast_itabt-value.
        ENDCASE.
**当表示某一行的数据读取完成时,在应用内表个字段填充值并新增一行,内表首行不做APPEND
        ON CHANGE OF forecast_itabt-row.
          IF sy-tabix <> 1.
            APPEND record.
          ENDIF.
        ENDON.
      ENDLOOP.
    ENDIF.
**当为文本类型时调用此参数,所抓取的文件按制表位在内表填充
  ELSEIF filetype 'TXT' OR filetype 'DAT'.
    CALL FUNCTION 'WS_UPLOAD'
      EXPORTING
        filename = filename
        filetype 'DAT'
      TABLES
        data_tab = record.
  ELSE.
    MESSAGE i001(00WITH 'Not support this format files!'.
    EXIT.
  ENDIF.

**根据内表类型将表数据写入到本地文件
  CONCATENATE 'C:\BACK\' sy-datum sy-uzeit '.' filetype INTO filename.
  IF filetype 'TXT' OR filetype 'DAT'.
**写入到文本文件
    CALL FUNCTION 'WS_DOWNLOAD'
      EXPORTING
        filename            = filename
        filetype            'DAT'
      TABLES
        data_tab            = record
      EXCEPTIONS
        file_open_error     1
        file_write_error    2
        invalid_filesize    3
        invalid_table_width 4
        invalid_type        5.
  ELSEIF filetype 'XLS'.
    CALL FUNCTION 'WS_EXCEL'
      EXPORTING
        filename = filename
      TABLES
        data     = record.
  ENDIF.

**输出所读取文件类型
  LOOP AT record.
    WRITE: / record.
  ENDLOOP.

**自定义获取文本类型,从文件名最后一位判断直到首次出现’.‘ 符号
FORM getfiletype USING filename TYPE localfile filetype TYPE c.
  DATA:len TYPE i,
        pos TYPE i,
        char TYPE c.
  len STRLEN( filename ).
  pos = len.
  DO len TIMES.
    pos = pos 1.
    char = filename+pos(1).
    IF char '.'.
      len = len - pos.
      pos = pos + 1.
      filetype = filename+pos(len).
      TRANSLATE filetype TO UPPER CASE.
      EXIT.
    ENDIF.
  ENDDO.
ENDFORM.                    "getfiletype

posted @ 2017-09-24 10:20  独吊东南枝  阅读(401)  评论(0编辑  收藏  举报