***********************************************************************
**----------------------------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