Z表数据EXCEL导入详解编程语言

很多项目都有这种需求,虽然别人用的各有不同,不过闲来无事,还是自己搞了一个出来。基于EXCEL的导入。

*&---------------------------------------------------------------------* 
*& Report  ZLY_UPLOAD_TABLE 
*& 
*&---------------------------------------------------------------------* 
*& 
*& 
*&---------------------------------------------------------------------* 
REPORT ZUPLOAD_TABLE. 
TABLES:RSRD1. 
TYPE-POOLS:ABAP. 
FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE, 
<DYN_WA>, 
<DYN_FIELD>. 
DATA: DY_TABLE TYPE REF TO DATA, 
DY_LINE  TYPE REF TO DATA, 
XFC      TYPE        LVC_S_FCAT, 
IFC      TYPE        LVC_T_FCAT. 
DATA : GT_EXCEL_T TYPE         ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE, 
GS_EXCEL_T LIKE LINE OF GT_EXCEL_T. 
DATA: GC_FIELDVALUE TYPE FIELDVALUE,  "字符值 
GC_FLDNAME    TYPE FIELDNAME.   "字段名 
SELECTION-SCREEN:BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001. 
PARAMETERS:P_TBMA TYPE RSRD1-TBMA_VAL, 
P_FILE LIKE RLGRAP-FILENAME. 
SELECTION-SCREEN END OF BLOCK BLK01. 
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. 
PERFORM FRM_GET_FILEPATH. 
START-OF-SELECTION. 
CHECK P_TBMA IS NOT INITIAL. 
CHECK P_FILE IS NOT INITIAL. 
PERFORM PRM_GET_TAB_STRC. 
PERFORM PRM_GET_EXCEL. 
PERFORM PRM_UPDATA_TAB. 
*&---------------------------------------------------------------------* 
*&      Form  FRM_GET_FILEPATH 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
*  -->  p1        text 
*  <--  p2        text 
*----------------------------------------------------------------------* 
FORM FRM_GET_FILEPATH . 
CALL FUNCTION 'WS_FILENAME_GET' 
EXPORTING 
MASK             = ',Excel(*.xls),*.XLS,*.XLSX,' 
TITLE            = '选择文件'(100) 
IMPORTING 
FILENAME         = P_FILE 
EXCEPTIONS 
INV_WINSYS       = 1 
NO_BATCH         = 2 
SELECTION_CANCEL = 3 
SELECTION_ERROR  = 4 
OTHERS           = 5. 
IF SY-SUBRC <> 0. 
"      MESSAGE e100(zdev) WITH '选择文件出错!'(007). 
ENDIF. 
ENDFORM.                    " FRM_GET_FILEPATH 
*&---------------------------------------------------------------------* 
*&      Form  PRM_GET_TAB_STRC 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
*  -->  p1        text 
*  <--  p2        text 
*----------------------------------------------------------------------* 
FORM PRM_GET_TAB_STRC . 
DATA:GT_TABLE TYPE DDFIELDS, 
GS_TABLE TYPE DFIES. 
CALL FUNCTION 'CATSXT_GET_DDIC_FIELDINFO' 
EXPORTING 
IM_STRUCTURE_NAME = P_TBMA 
IMPORTING 
EX_DDIC_INFO      = GT_TABLE 
EXCEPTIONS 
FAILED            = 1 
OTHERS            = 2. 
IF SY-SUBRC <> 0. 
ENDIF. 
LOOP AT GT_TABLE INTO GS_TABLE. 
CLEAR XFC. 
XFC-FIELDNAME = GS_TABLE-FIELDNAME . 
XFC-INTTYPE = GS_TABLE-INTTYPE. 
XFC-INTLEN = GS_TABLE-LENG. 
XFC-DECIMALS = GS_TABLE-DECIMALS. 
APPEND XFC TO IFC. 
ENDLOOP. 
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE 
EXPORTING 
IT_FIELDCATALOG = IFC 
IMPORTING 
EP_TABLE        = DY_TABLE. 
ASSIGN DY_TABLE->* TO <DYN_TABLE>. 
CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>. 
ASSIGN DY_LINE->* TO <DYN_WA>. 
ENDFORM.                    " PRM_GET_TAB_STRC 
*&---------------------------------------------------------------------* 
*&      Form  PRM_GET_EXCEL 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
*  -->  p1        text 
*  <--  p2        text 
*----------------------------------------------------------------------* 
FORM PRM_GET_EXCEL . 
IF P_FILE IS NOT INITIAL. 
*将excel数据传入内表 
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' 
EXPORTING 
FILENAME    = P_FILE 
I_BEGIN_COL = '1' 
I_BEGIN_ROW = '2' 
I_END_COL   = '300' 
I_END_ROW   = '50000' 
TABLES 
INTERN      = GT_EXCEL_T. 
ENDIF. 
IF GT_EXCEL_T[] IS NOT INITIAL. 
LOOP AT GT_EXCEL_T INTO GS_EXCEL_T. 
AT NEW ROW. 
CLEAR <DYN_WA>. 
ENDAT. 
IF <DYN_WA> IS INITIAL. 
ASSIGN COMPONENT GS_EXCEL_T-COL OF STRUCTURE <DYN_WA> TO <DYN_FIELD>. 
IF SY-SUBRC = 0. 
<DYN_FIELD> = SY-MANDT. 
ENDIF. 
ENDIF. 
GS_EXCEL_T-COL = GS_EXCEL_T-COL + 1. 
GC_FIELDVALUE = GS_EXCEL_T-VALUE. 
CONDENSE GC_FIELDVALUE. 
ASSIGN COMPONENT GS_EXCEL_T-COL OF STRUCTURE <DYN_WA> TO <DYN_FIELD>. 
IF SY-SUBRC = 0. 
<DYN_FIELD> = GC_FIELDVALUE. 
ENDIF. 
AT END OF ROW. 
APPEND <DYN_WA> TO <DYN_TABLE>. 
ENDAT. 
ENDLOOP. 
ENDIF. 
ENDFORM.                    " PRM_GET_EXCEL 
*&---------------------------------------------------------------------* 
*&      Form  PRM_UPDATA_TAB 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
*  -->  p1        text 
*  <--  p2        text 
*----------------------------------------------------------------------* 
FORM PRM_UPDATA_TAB . 
MODIFY (P_TBMA) FROM TABLE <DYN_TABLE>. 
IF SY-SUBRC = 0. 
MESSAGE '导入成功' TYPE 'S'. 
ELSE. 
MESSAGE '导入失败' TYPE 'S' DISPLAY LIKE 'E'. 
EXIT. 
ENDIF. 
ENDFORM.                    " PRM_UPDATA_TAB

最简单的一种方式,输入参数:表名,EXXCEL(EXCEL里数据按表的数据元素顺序,可不加客户端)

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18651.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论