ABAP导入xls --> 创建动态内表--->ALV动态数据显示
REPORT ZJ_TE9. TYPE-POOLS:SLIS,ABAP. DATA: BEGIN OF IEXCEL OCCURS 0. INCLUDE STRUCTURE ALSMEX_TABLINE. DATA: END OF IEXCEL. DATA: I_INDEX TYPE I. FIELD-SYMBOLS: <FS>. *----------- DATA: D_REF TYPE REF TO DATA, LT_ALV_CAT TYPE TABLE OF LVC_S_FCAT, LS_ALV_CAT LIKE LINE OF LT_ALV_CAT. DATA: LT_TABLE LIKE TABLE OF DNTAB. DATA: LS_TABLE TYPE DNTAB. DATA: DYN_TABLE TYPE REF TO DATA. DATA: DYN_WA TYPE REF TO DATA. FIELD-SYMBOLS : <DYN_TABLE> TYPE TABLE, <DYN_WA> TYPE ANY, <DYN_FIELD> TYPE ANY, <FS_STR> TYPE ANY. *------------------------------------------- PARAMETERS: P_FNAME LIKE RLGRAP-FILENAME MEMORY ID M01. " 获取文件路径 PARAMETERS P_TABLE TYPE TABNAME. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME. PERFORM GET_FIELD. START-OF-SELECTION. PERFORM GET_TABLE. PERFORM UPLOAD. PERFORM ALV_SHOW. " PERFORM GT_TEST. *&---------------------------------------------------------------------* *& Form get_field *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM GET_FIELD. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING * DEF_FILENAME = ' ' * DEF_PATH = ' ' MASK = 'Excel Files,*.xls,All Files,*.csv,*.*.' * MODE = ' ' TITLE = '请选择要导入的格式' IMPORTING FILENAME = P_FNAME * RC = EXCEPTIONS INV_WINSYS = 1 NO_BATCH = 2 SELECTION_CANCEL = 3 SELECTION_ERROR = 4 OTHERS = 5. IF SY-SUBRC <> 0. WRITE: '导入数据出错'. ENDIF. ENDFORM. "get_field *&---------------------------------------------------------------------* *& Form upLOAD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM UPLOAD. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = P_FNAME I_BEGIN_COL = 1 I_BEGIN_ROW = 1 I_END_COL = 100 I_END_ROW = 100 TABLES INTERN = IEXCEL EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. IF SY-SUBRC <> 0. WRITE:SY-SUBRC. ELSE. LOOP AT IEXCEL. IF IEXCEL-COL = 1. CONTINUE. ENDIF. " WRITE:IEXCEL-COL. MOVE IEXCEL-COL TO I_INDEX. ASSIGN COMPONENT I_INDEX OF STRUCTURE <DYN_WA> TO <FS> . MOVE IEXCEL-VALUE TO <FS>. AT END OF ROW. IF IEXCEL-COL <> 1. APPEND <DYN_WA> TO <DYN_TABLE>. CLEAR: <DYN_WA> . ENDIF. " APPEND IM_TAB. "在每一行结束时 " CLEAR IM_TAB. ENDAT. ENDLOOP. ENDIF. ENDFORM. "upLOAD *&---------------------------------------------------------------------* *& Form get_table *&---------------------------------------------------------------------* * text 获取内表结构 *----------------------------------------------------------------------* FORM GET_TABLE. *取出表结构的字段目录 CALL FUNCTION 'NAMETAB_GET' EXPORTING LANGU = SY-LANGU TABNAME = P_TABLE TABLES NAMETAB = LT_TABLE EXCEPTIONS NO_TEXTS_FOUND = 1. *根据取出的字段目录生成参考字段目录 LOOP AT LT_TABLE INTO LS_TABLE. LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME. LS_ALV_CAT-REF_TABLE = P_TABLE. LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME. APPEND LS_ALV_CAT TO LT_ALV_CAT. CLEAR LS_ALV_CAT. ENDLOOP. * 内表创建 CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE EXPORTING IT_FIELDCATALOG = LT_ALV_CAT IMPORTING EP_TABLE = D_REF. * 指定生成的内表到字段符号 ASSIGN D_REF->* TO <DYN_TABLE>. * 创建动态工作区结构 CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>. * 创建动态工作区 ASSIGN DYN_WA->* TO <DYN_WA>. ENDFORM. "get_table *&---------------------------------------------------------------------* *& Form ALV_SHOW *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM ALV_SHOW. *显示内表中的数据 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_STRUCTURE_NAME = P_TABLE TABLES T_OUTTAB = <DYN_TABLE> 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. ENDFORM. "ALV_SHOW *&---------------------------------------------------------------------* *& Form GT_TEST *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM GT_TEST. ENDFORM. "GT_TEST