在报表程序中会遇到很多的批导数据问题,BDC、LSMW这些是常用数据维护工具,需要录屏,操作比较复杂而且比较固定。要是能把数据批量读取到内表中,然后对内表中数据进行操作将会显得更加方便和容易,也更加让ABAPER 容易接受一些。
下面我将介绍一种使用函数将excel表中的批量数据读取到内表中的方法:
1.声明模板需要显示的内表如下图:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPJRVT3lkeaVnRXFGesdUY2w2RiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOxUDN1EDN2EDMzQDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.选择屏幕的编写(P_PATH为文件路径)
3.调用函数实现能够进行文档的选择和下载路径的确定。
AT SELECTION-SCREEN ON VALUE-REQUEST FORP_PATH.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
MASK = ',文本文件(制表符分隔),*.xls'
STATIC = 'X'
CHANGING
FILE_NAME = P_PATH.
4.调用函数 WS_DOWNLOAD进行模板的下载。
调用函数之前注意记得给第1步中的内表字段进行赋值,此处赋值是指定每一个字段的名称。
5.模板下载好后进行数据填写,然后上传。
6.上传基本逻辑:获取excel中数据的行数,从第2行开始进行数据读取,截止行数为之前获取的行数,列数为65535.
实现代码(可通用)2个PERFORM来实现:
PERFORM SUB_GET_MAX_COL USING ITAB_POWER "获取excel中的行数
CHANGING G_MAX_COL.
PERFORM SUB_IMPORT_XLS_TO_ITAB TABLES ITAB_P_PWOER "将excel中的数据读取到内表itab_p_power中
USING WA_P_POWER
F_PATH.
最后的数据全部读取到了ITAB_P_POWER内表中。(这个内表和第1步中的内表结构字段一样)
FORM SUB_GET_MAX_COL USING P_TABLE TYPE STANDARD TABLE
CHANGING P_MAX_COL.
DATA: LO_ABAP_TABLEDESCR TYPE REF TO CL_ABAP_TABLEDESCR,
LO_ABAP_STRUCTDESCR TYPE REF TO CL_ABAP_STRUCTDESCR.
DATA LS_ABAP_COMPDESCR TYPE ABAP_COMPDESCR.
DATA L_LINES TYPE I.
LO_ABAP_TABLEDESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( P_TABLE ).
LO_ABAP_STRUCTDESCR ?= LO_ABAP_TABLEDESCR->GET_TABLE_LINE_TYPE( ).
DESCRIBE TABLE LO_ABAP_STRUCTDESCR->COMPONENTS LINES L_LINES.
P_MAX_COL = L_LINES .
ENDFORM. " SUB_GET_MAX_COL
FORM SUB_IMPORT_XLS_TO_ITAB TABLES P_TABLE
USING P_TAB_WA
P_FPATCH.
DATA LT_XLS TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
DATA L_ITAB_COL TYPE I.
FIELD-SYMBOLS <FS_FIELD>.
IF P_FPATCH IS NOT INITIAL.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = P_FPATCH
I_BEGIN_COL = 1
I_BEGIN_ROW = 2
I_END_COL = G_MAX_COL
I_END_ROW = 65535
TABLES
INTERN = LT_XLS
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE '上传文件失败!' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ELSE.
LOOP AT LT_XLS.
L_ITAB_COL = LT_XLS-COL.
ASSIGN COMPONENT L_ITAB_COL OF STRUCTURE P_TAB_WA TO <FS_FIELD>.
<FS_FIELD> = LT_XLS-VALUE.
AT END OF ROW.
APPEND P_TAB_WA TO P_TABLE.
CLEAR: L_ITAB_COL, P_TAB_WA.
ENDAT.
CLEAR LT_XLS.
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM. " SUB_IMPORT_XLS_TO_ITAB