天天看点

ABAP中读取文本文件(TXT DOCUMENT)并用ALV显示

  在做ABAP开发时,有的时候我们需要将数据整理成文件然后上传至SAP,整理后的文件可以是文本格式或者EXCEL文件格式等,这也要看具体的业务要求了,本篇文件将以实例介绍如何读取文本文件。嘎嘎。。。

  首先要介绍一下CL_GUI_FRONTEND_SERVICES类,这个类提供了很多对操作系统文件的操作,例如拷贝,列出文件名,打开文件等。当在从客户端打开一个文件是我们要用到它的静太方法FILE_OPEN_DIALOG,将文本文件读取到内表时又要用到它的静态方法GUI_UPLOAD。GUI_UPLOAD是个比较特殊的方法,可以直接被FUNCTION直接调用类似的还有GUI_DOWNLOAD等,可能是静态方法系统中又封装了一次,当然你也可以直接通过类来调用静态方法两都都可以实现。最后将读入到内表中的数据在ALV中列出,具体程式如下。

  [FOR EXAMPLE]

  TYPE-POOLS:SLIS. "ALV要用到的类型池

  DATA:I_FIELD_CAT TYPE SLIS_T_FIELDCAT_ALV, "ALV是显示时要的属性

       FIELD_CAT TYPE SLIS_FIELDCAT_ALV,

       I_LAYOUT TYPE SLIS_LAYOUT_ALV,

       I_REPID LIKE SY-REPID.

  DATA:BEGIN OF TXT_READ_DATA OCCURS 0, "定义一个内表,用于存放从TXT上传的数据

        ZH_NAME(30) TYPE C,

        EN_NAME(30) TYPE C,

        SEX(10) TYPE C,

        DATE LIKE SY-DATUM,

       END OF TXT_READ_DATA.

  DATA:LV_FILETABLE TYPE FILETABLE, "打开文件的信息放入此列表中

       LV_FILENAME TYPE STRING.  "定义一字段用于放置上传的文件名称

  

  SELECTION-SCREEN BEGIN OF BLOCK myBlock WITH FRAME TITLE title. "創建上傳文件的屏幕

    PARAMETERS:P_FILE LIKE RLGRAP-FILENAME OBLIGATORY LOWER CASE.

  SELECTION-SCREEN END OF BLOCK myBlock.

  INITIALIZATION. "初始化屏幕时

   title = 'GUI UPLOAD'.

  AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE."按F4鍵時也可觸發該事件

    PERFORM F_OPEN_FILENAME CHANGING P_FILE.

  START-OF-SELECTION.

    PERFORM READ_DATA_IN.

    PERFORM BUILD_LAYOUT.

    PERFORM BUILD_FIELDCAT.

    PERFORM DISPLAY_ALV.

  *&---------------------------------------------

  *&F_OPEN_FILENAME  FOR OPEN FILE

  FORM F_OPEN_FILENAME CHANGING P_FILE.

    DATA:  LV_RC TYPE I.

    "调用METHOD 打开对话框

    CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG  "OPEN FILE DIALOG 打开上传文件的对话框

      EXPORTING

        WINDOW_TITLE = '選擇上傳文件'

 FILE_FILTER = 'All Files (*.*)|*.*|NotePad Files(*.txt)|*.txt|Excel Files(*.xls)|*.xls|Word files(*.doc)|*.doc' "过滤上传文件的类型

        DEFAULT_EXTENSION = '*.txt'

        DEFAULT_FilENAME = '1.txt'  "默认打开的文件  "d:\Users\wei.sunqing\Desktop\1.txt

        "INITIAL_DIRECTORY = 'C:/'  "初始化的目录

        "MULTISELECTION = 'X' "是否可以同时打开多个文件

      CHANGING

        FILE_TABLE = LV_FILETABLE "你打开文件名的列表

        RC = LV_RC  "返回打开文件的数量

      .

    IF SY-SUBRC <> 0.

      MESSAGE 'FILE DOES NOT EXIST!' TYPE 'E'.

    ELSEIF LV_FILETABLE[] IS NOT INITIAL.  "不為空

      READ TABLE LV_FILETABLE INDEX 1 INTO LV_FILENAME.  "读取打開文件内表的第一个文件信息

      P_FILE = LV_FILENAME.

    ENDIF.

  ENDFORM.

  *& READ DATA IN

  FORM READ_DATA_IN .

   IF P_FILE CS '.TXT' ."判断文件名称是否包含.txt EXCEL:OR P_FILE CS '.XLS'

     CALL FUNCTION 'GUI_UPLOAD'

       EXPORTING

         FILENAME                      = LV_FILENAME  "要讀取的文件

         FILETYPE                      = 'ASC'

         HAS_FIELD_SEPARATOR           =  CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB "字段間按TAB鍵分隔開來

  *      HEADER_LENGTH                 = 0

  *      READ_BY_LINE                  = 'X'

  *      DAT_MODE                      = ' '

  *      CODEPAGE                      = '8400'  "如果在不能正常显示中文的情况下设置此项

  *      IGNORE_CERR                   = ABAP_TRUE

  *      REPLACEMENT                   = '#'

  *      CHECK_BOM                     = ' '

  *      VIRUS_SCAN_PROFILE            =

  *      NO_AUTH_CHECK                 = ' '

  *    IMPORTING

  *      FILELENGTH                    =

  *      HEADER                        =

       TABLES

         DATA_TAB                      = TXT_READ_DATA  "寫入相應的內表中

      EXCEPTIONS

        FILE_OPEN_ERROR               = 1

        FILE_READ_ERROR               = 2

  *      NO_BATCH                      = 3

  *      GUI_REFUSE_FILETRANSFER       = 4

  *      INVALID_TYPE                  = 5

  *      NO_AUTHORITY                  = 6

  *      UNKNOWN_ERROR                 = 7

  *      BAD_DATA_FORMAT               = 8

  *      HEADER_NOT_ALLOWED            = 9

  *      SEPARATOR_NOT_ALLOWED         = 10

  *      HEADER_TOO_LONG               = 11

  *      UNKNOWN_DP_ERROR              = 12

  *      ACCESS_DENIED                 = 13

  *      DP_OUT_OF_MEMORY              = 14

  *      DISK_FULL                     = 15

  *      DP_TIMEOUT                    = 16

  *      OTHERS                        = 17

             .

     IF SY-SUBRC <> 0.

       IF SY-SUBRC = 1.

         MESSAGE 'IMPORT FILE OPEN ERROR' TYPE 'I'.

         EXIT.

       ENDIF.

        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

     ENDIF.

   ELSE.

     MESSAGE 'IMPORT FILE SHOULD BE A TEXT FILE' TYPE 'I'.

   ENDIF.

  *& BUILD ALV LAYOUT

  FORM BUILD_LAYOUT.

    I_REPID = SY-REPID.

    I_LAYOUT-ZEBRA = 'X'.

    I_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

  *& BUILD ALV FIELDCAT

  FORM BUILD_FIELDCAT.

    CLEAR I_FIELD_CAT[].

    CLEAR FIELD_CAT.

    FIELD_CAT-FIELDNAME = 'ZH_NAME'.

    FIELD_CAT-SELTEXT_L = '中文名'.

    APPEND FIELD_CAT TO I_FIELD_CAT.

    FIELD_CAT-FIELDNAME = 'EN_NAME'.

    FIELD_CAT-SELTEXT_L = '英文名'.

    FIELD_CAT-FIELDNAME = 'SEX'.

    FIELD_CAT-SELTEXT_L = '姓别'.

    FIELD_CAT-FIELDNAME = 'DATE'.

    FIELD_CAT-SELTEXT_L = '时间'.

    CLEAR FIELD_CAT.

  *& DISPLAY DATA WITH ALV

  FORM DISPLAY_ALV.

    DATA I_LINE TYPE I.

    DESCRIBE TABLE TXT_READ_DATA LINES I_LINE. "将内表数据行数写入变量I_LINE中

    "IF IT_FILEDATA[] IS NOT INITIAL.

    IF I_LINE > 0.

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "调用函数用ALV显示出数据

  *       I_INTERFACE_CHECK                 = ' '

  *       I_BYPASSING_BUFFER                = ' '

  *       I_BUFFER_ACTIVE                   = ' '

         I_CALLBACK_PROGRAM                = I_REPID

  *       I_CALLBACK_PF_STATUS_SET          = ' '

  *       I_CALLBACK_USER_COMMAND           = ' '

  *       I_CALLBACK_TOP_OF_PAGE            = ' '

  *       I_CALLBACK_HTML_TOP_OF_PAGE       = ' '

  *       I_CALLBACK_HTML_END_OF_LIST       = ' '

  *       I_STRUCTURE_NAME                  =

  *       I_BACKGROUND_ID                   = ' '

  *       I_GRID_TITLE                      =

  *       I_GRID_SETTINGS                   =

         IS_LAYOUT                         = I_LAYOUT

         IT_FIELDCAT                       = I_FIELD_CAT

  *       IT_EXCLUDING                      =

  *       IT_SPECIAL_GROUPS                 =

  *       IT_SORT                           =

  *       IT_FILTER                         =

  *       IS_SEL_HIDE                       =

  *       I_DEFAULT                         = 'X'

  *       I_SAVE                            = ' '

  *       IS_VARIANT                        =

  *       IT_EVENTS                         =

  *       IT_EVENT_EXIT                     =

  *       IS_PRINT                          =

  *       IS_REPREP_ID                      =

  *       I_SCREEN_START_COLUMN             = 0

  *       I_SCREEN_START_LINE               = 0

  *       I_SCREEN_END_COLUMN               = 0

  *       I_SCREEN_END_LINE                 = 0

  *       I_HTML_HEIGHT_TOP                 = 0

  *       I_HTML_HEIGHT_END                 = 0

  *       IT_ALV_GRAPHICS                   =

  *       IT_HYPERLINK                      =

  *       IT_ADD_FIELDCAT                   =

  *       IT_EXCEPT_QINFO                   =

  *       IR_SALV_FULLSCREEN_ADAPTER        =

  *     IMPORTING

  *       E_EXIT_CAUSED_BY_CALLER           =

  *       ES_EXIT_CAUSED_BY_USER            =

        TABLES

          T_OUTTAB                          = TXT_READ_DATA

       EXCEPTIONS

         PROGRAM_ERROR                     = 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.

  运行界面如下:

   在ALV中显示出的数据:

  最后符上上面程式中测试用的数据(中间以TAB符分隔):

  巴门尼德    Parmenides    Male    20120812

  赫利克里特    Heractitus    Male    20120812

  马可·奥勒留    Marcus Aurelius    Male    20120812

  柏拉图    Plato    Male    20120812

  亚里士多德    Aristotle    Male    20120812

  苏格拉底    Socrates    Male    20120812

  笛卡尔    Descartes    Male    20120812

      GUI_UPLOAD也可以将EXCEL读取入内表中,上面代码中加入判断是否是EXCEL文件后上传即可读取。