*************************************************************************----------------------------T Y P E S------------------------------*************************************************************************TYPES: BEGIN OF TY_ALV, SEL TYPE C, ICON TYPE ICON_D, MSG TYPE CHAR255, END OF TY_ALV.*************************************************************************---------------------------T A B L E S-----------------------------*************************************************************************TABLES: SSCRFIELDS.*************************************************************************------------------------V A R I A B L E S--------------------------*************************************************************************DATA: GT_FIELDCAT TYPE LVC_T_FCAT, GS_FIELDCAT TYPE LVC_S_FCAT, GS_LAYOUT TYPE LVC_S_LAYO, G_OBJID LIKE WWWDATA-OBJID VALUE SY-REPID, GS_ALV TYPE TY_ALV, GT_ALV TYPE TABLE OF TY_ALV.FIELD-SYMBOLS: <FS_ALV> TYPE TY_ALV.*************************************************************************--------------------------D E F I N E------------------------------*************************************************************************DEFINE D_BUILD_FIELDCAT. GS_FIELDCAT-FIELDNAME = &1. GS_FIELDCAT-QFIELDNAME = &2. GS_FIELDCAT-CFIELDNAME = &3. GS_FIELDCAT-REF_TABLE = &4. GS_FIELDCAT-REF_FIELD = &5. GS_FIELDCAT-CONVEXIT = &6. GS_FIELDCAT-EMPHASIZE = &7. GS_FIELDCAT-SCRTEXT_L = &8. GS_FIELDCAT-COLDDICTXT = 'L'. APPEND GS_FIELDCAT TO GT_FIELDCAT. CLEAR: GS_FIELDCAT.END-OF-DEFINITION.*************************************************************************-----------------S E L E C T I O N---S C R E E N-------------------*************************************************************************SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE TITLE1. PARAMETERS P_FILE TYPE RLGRAP-FILENAME LOWER CASE. PARAMETERS P_ROW TYPE N LENGTH 2 DEFAULT '2' OBLIGATORY. PARAMETERS P_COL TYPE N LENGTH 2 DEFAULT '1' OBLIGATORY.SELECTION-SCREEN END OF BLOCK 001.SELECTION-SCREEN FUNCTION KEY 1.*************************************************************************-------------------I N I T I A L I Z A T I O N---------------------*************************************************************************INITIALIZATION. TITLE1 = '选择条件'. %_P_FILE_%_APP_%-TEXT = '选择文件'. %_P_ROW_%_APP_%-TEXT = '开始行'. %_P_COL_%_APP_%-TEXT = '开始列'. SSCRFIELDS-FUNCTXT_01 = '@49@下载模板'.*************************************************************************---------------A T S E L E C T I O N-S C R E E N-------------------*************************************************************************AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM SELECT_EXCEL_FILE CHANGING P_FILE.AT SELECTION-SCREEN. CASE SSCRFIELDS-UCOMM. WHEN 'FC01'. PERFORM DOWNLOAD_TEMPLATE USING G_OBJID 'XLS' '批量导入模板.xls'. ENDCASE.*************************************************************************-----------------S T A R T-O F-S E L E C T I O N-------------------*************************************************************************START-OF-SELECTION. IF P_FILE IS INITIAL. MESSAGE '请选择文件' TYPE 'S'. LEAVE LIST-PROCESSING. ENDIF. "读取文件 PERFORM UPLOAD_DATA USING P_ROW P_COL. "数据开始的单元格行、列数,可根据实际情况更改 PERFORM CHECK_DATA. PERFORM DISPLAY_DATA.*&---------------------------------------------------------------------**& FORM UPLOAD_DATA*&---------------------------------------------------------------------** 读取EXCEL数据*----------------------------------------------------------------------*FORM UPLOAD_DATA USING UV_ROW UV_COL . DATA:LS_STRUCTURE TYPE REF TO DATA. DATA:LT_EXCEL LIKE ZALSMEX_TABLINE OCCURS 0 WITH HEADER LINE. FIELD-SYMBOLS:<L_FS_INTERN> TYPE ZALSMEX_TABLINE."表头行 FIELD-SYMBOLS:<L_FS_ITEM> TYPE TY_ALV. FIELD-SYMBOLS:<FIELD>. DATA:LV_ROW TYPE I, LV_COL TYPE I. LV_ROW = UV_ROW. LV_COL = UV_COL. CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = P_FILE I_BEGIN_COL = LV_COL I_BEGIN_ROW = LV_ROW I_END_COL = 50 I_END_ROW = 60000 TABLES INTERN = LT_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数据到内表 CREATE DATA LS_STRUCTURE LIKE GS_ALV. LOOP AT LT_EXCEL ASSIGNING <L_FS_INTERN>. AT NEW ROW. ASSIGN LS_STRUCTURE->* TO <L_FS_ITEM>. INSERT GS_ALV INTO TABLE GT_ALV ASSIGNING <L_FS_ITEM>. ENDAT. ASSIGN COMPONENT <L_FS_INTERN>-COL OF STRUCTURE <L_FS_ITEM> TO <FIELD>. CHECK SY-SUBRC EQ 0. <FIELD> = <L_FS_INTERN>-VALUE. ENDLOOP.ENDFORM. "UPLOAD_DATA*&---------------------------------------------------------------------**& FORM CHECK_DATA*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------*FORM CHECK_DATA. DATA: L_FLAG TYPE C, L_TABIX TYPE I, L_MSG TYPE STRING, L_VALUE TYPE STRING, L_INDEX TYPE I VALUE 1. DEFINE D_STORE_MESSAGE. L_FLAG = 'X'. CALL FUNCTION 'MESSAGE_STORE' EXPORTING ARBGB = &1 MSGTY = &2 TXTNR = &3 MSGV1 = &4 MSGV2 = &5 MSGV3 = &6 MSGV4 = &7 ZEILE = L_INDEX. L_INDEX = L_INDEX + 1. END-OF-DEFINITION. CALL FUNCTION 'MESSAGES_INITIALIZE'. LOOP AT GT_ALV ASSIGNING <FS_ALV>.** 示例* IF GS_EXCEL-FLTYPE = ''.* L_MSG = '第' && L_TABIX && '行的XX不能为空'.* D_STORE_MESSAGE: '00' 'E' '001' L_MSG '' '' ''.* ENDIF.** MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.* APPEND GS_ALV TO GT_ALV.* CLEAR GS_ALV. ENDLOOP. IF L_FLAG = 'X'. CALL FUNCTION 'MESSAGES_SHOW'. LEAVE LIST-PROCESSING. ENDIF.ENDFORM. "CHECK_DATA*&---------------------------------------------------------------------**& FORM SELECT_EXCEL_FILE*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------*FORM SELECT_EXCEL_FILE CHANGING P_FILE. DATA: LT_FILETABLE TYPE FILETABLE WITH HEADER LINE, L_RC TYPE I, L_ACTION TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING DEFAULT_EXTENSION = 'XLSX' DEFAULT_FILENAME = '*.XLS;*.XLSX' FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL MULTISELECTION = '' CHANGING FILE_TABLE = LT_FILETABLE[] RC = L_RC USER_ACTION = L_ACTION EXCEPTIONS OTHERS = 1. IF L_ACTION NE 0. EXIT. ENDIF. READ TABLE LT_FILETABLE INDEX 1. P_FILE = LT_FILETABLE-FILENAME.ENDFORM. "SELECT_EXCEL_FILE*&---------------------------------------------------------------------**& FORM SET_STATUS_BAR*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------*FORM SET_STATUS_BAR USING P_PERCENT P_MESSAGE. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING PERCENTAGE = P_PERCENT TEXT = P_MESSAGE.ENDFORM. "SET_STATUS_BAR*&---------------------------------------------------------------------**& FORM DOWNLOAD_TEMPLATE*&---------------------------------------------------------------------** 下载模板用* P_OBJID: SMW0中的文件ID* P_EXTENSION: 文件扩展名,如XLS、DOC* P_DEFAULT_FILENAME: 默认文件名*----------------------------------------------------------------------*FORM DOWNLOAD_TEMPLATE USING P_OBJID P_EXTENSION P_DEFAULT_FILENAME. DATA: L_FILENAME TYPE STRING, L_FULLPATH TYPE STRING, L_PATH TYPE STRING, LS_OBJDATA TYPE WWWDATATAB, L_DESTINATION TYPE RLGRAP-FILENAME, L_RC TYPE I. SELECT SINGLE RELID OBJID INTO CORRESPONDING FIELDS OF LS_OBJDATA FROM WWWDATA WHERE SRTF2 = 0 AND RELID = 'MI' AND OBJID = P_OBJID. IF SY-SUBRC <> 0. MESSAGE '模板文件不存在' TYPE 'E'. ENDIF. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG EXPORTING DEFAULT_EXTENSION = P_EXTENSION DEFAULT_FILE_NAME = P_DEFAULT_FILENAME CHANGING FILENAME = L_FILENAME PATH = L_PATH FULLPATH = L_FULLPATH EXCEPTIONS OTHERS = 1. IF L_FULLPATH = ''. MESSAGE '没有选择文件' TYPE 'E'. ENDIF. IF STRLEN( L_FULLPATH ) > 128. MESSAGE '文件名长度超出128,请重新选择文件' TYPE 'S' DISPLAY LIKE 'E'. STOP. ENDIF. L_DESTINATION = L_FULLPATH. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING KEY = LS_OBJDATA DESTINATION = L_DESTINATION IMPORTING RC = L_RC. IF L_RC <> 0. MESSAGE '导入模板下载失败' TYPE 'E'. ENDIF.ENDFORM. "DOWNLOAD_TEMPLATE*&---------------------------------------------------------------------**& FORM DISPLAY_DATA*&---------------------------------------------------------------------** 显示数据*----------------------------------------------------------------------*FORM DISPLAY_DATA. D_BUILD_FIELDCAT:* 字段 单位字段 金额字段 参照表 参照字段 转码 列颜色 描述 'ICON' '' '' '' '' '' '' '', 'MSG' '' '' '' '' '' '' '消息文本'. GS_LAYOUT-CWIDTH_OPT = 'X'. GS_LAYOUT-BOX_FNAME = 'SEL'. GS_LAYOUT-ZEBRA = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = SY-REPID I_CALLBACK_PF_STATUS_SET = 'PF_STATUS' I_CALLBACK_USER_COMMAND = 'USER_COMMAND' IT_FIELDCAT_LVC = GT_FIELDCAT IS_LAYOUT_LVC = GS_LAYOUT I_DEFAULT = 'X' I_SAVE = 'A' TABLES T_OUTTAB = GT_ALV EXCEPTIONS OTHERS = 1.ENDFORM. "DISPLAY_DATA*&---------------------------------------------------------------------**& FORM PF_STATUS*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------*FORM PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB . SET PF-STATUS 'STATUS_ALV' EXCLUDING RT_EXTAB.ENDFORM. "PF_STATUS*&---------------------------------------------------------------------**& FORM USER_COMMAND*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------*FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'IMPORT'. READ TABLE GT_ALV WITH KEY SEL = 'X' TRANSPORTING NO FIELDS. IF SY-SUBRC <> 0. MESSAGE '请至少选择一个行项目' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. CALL FUNCTION 'MESSAGES_INITIALIZE'. "准备数据进行批导 LOOP AT GT_ALV INTO GS_ALV WHERE SEL = 'X'. ENDLOOP. ENDCASE.ENDFORM. "USER_COMMAND