事务代码:SMW0
输入对应的报表名称:
新建文件对象:
导入xls文件到SAP系统中:
报表中调用文件下载:
CONSTANTS: CS_OBJID TYPE WWWDATA-OBJID VALUE 'ZCOR006'.
AT SELECTION-SCREEN. "与SELECTION-SCREEN: FUNCTION KEY <I>.配合使用
CASE SSCRFIELDS-UCOMM. "屏幕鼠标触发的功能代码
WHEN 'FC01'. "当点击第一个自定义的按钮时,鼠标触发的功能代码的值为FC01。
"调用子程序,表示要下载模板至指定路径,CS_OBJID表示模板名称,在常量定义中已默认了模板名称
PERFORM SUB_DOWNLOAD_TEMP USING CS_OBJID.
WHEN OTHERS.
ENDCASE.
文件下载相关的子函数功能代码:
*&---------------------------------------------------------------------*
*& 包含文件 ZFI_FORM
*&---------------------------------------------------------------------*
CONSTANTS: GWK_DIRECTORY TYPE STRING VALUE 'D:\' ,
GWK_EXTENSION TYPE STRING VALUE '.XLSX',
GWK_TITLE TYPE STRING VALUE '文件夹路径及文件名'.
DATA: GWK_FILENAME TYPE STRING.
DATA: GWK_EXCEL TYPE OLE2_OBJECT, "EXCEL文件名称
GWK_BOOKS TYPE OLE2_OBJECT, "EXCEL工作薄
GWK_SHEET TYPE OLE2_OBJECT, "EXCEL工作表
GWK_CELL TYPE OLE2_OBJECT. "EXCEL单元格
*&---------------------------------------------------------------------*
*& FORM SUB_BUK_CHECK
*&---------------------------------------------------------------------*
* 检查公司代码权限
*----------------------------------------------------------------------*
* -->I_BUKRS TEXT
* <--C_ERROR TEXT
*----------------------------------------------------------------------*
FORM SUB_BUK_CHECK USING I_BUKRS
CHANGING C_ERROR.
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
ID 'BUKRS' FIELD I_BUKRS
ID 'ACTVT' DUMMY.
IF SY-SUBRC <> 0.
C_ERROR = 'X'.
MESSAGE S008 WITH I_BUKRS.
ELSE.
C_ERROR = ''.
ENDIF.
ENDFORM. " SUB_BUK_CHECK
*&---------------------------------------------------------------------*
*& FORM SUB_CONGR_CHECK
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* -->I_CONGR TEXT
* -->I_DIMEN TEXT
* <--C_ERROR TEXT
*----------------------------------------------------------------------*
FORM SUB_CONGR_CHECK USING I_CONGR
I_DIMEN
CHANGING C_ERROR.
AUTHORITY-CHECK OBJECT 'E_CS_CONGR'
ID 'CONGR' FIELD I_CONGR
ID 'ACTVT' DUMMY
ID 'DIMEN' FIELD I_DIMEN.
IF SY-SUBRC <> 0.
C_ERROR = 'X'.
MESSAGE S013 WITH I_DIMEN I_CONGR.
ELSE.
C_ERROR = ''.
ENDIF.
ENDFORM. " SUB_CONGR_CHECK
*&---------------------------------------------------------------------*
*& FORM SUB_DOWNLOAD_TEMP
*&---------------------------------------------------------------------*
* 下载模板
* 根据 OBJID-- 对象名称下载EXCEL模板
*----------------------------------------------------------------------*
FORM SUB_DOWNLOAD_TEMP USING IM_OBJID.
"IM_OBJID接受来自PERFORM语句的CS_OBJID的值
DATA: LWK_OBJECT TYPE WWWDATATAB, "表WWWDATA的内容,即通过SMW0导入的模板的存储信息的表
LWK_RC TYPE SY-SUBRC, "函数返回值,ABAP报表之后返回值
LWK_UA TYPE I. "用于接收動作結果返回的值
DATA: LWK_FN TYPE RLGRAP-FILENAME. "用于装载/卸载的局部文件
DATA: LWK_FILENAME TYPE STRING.
DATA: LWK_PATH TYPE STRING.
DATA: LWK_FULLPATH TYPE STRING.
****---查询模板---***
SELECT SINGLE RELID OBJID "RELID: IMPORT/EXPORT 记录中的区域; OBJID:对象名
FROM WWWDATA "存储 WWW 对象的 INDX 类型表
INTO CORRESPONDING FIELDS OF LWK_OBJECT
WHERE SRTF2 = 0 "SRTF2表示EXPORT/IMPORT 数据表中的下个记录计数器
AND OBJID = IM_OBJID. "SMW0里对象名称
IF SY-SUBRC <> 0 OR LWK_OBJECT-OBJID = SPACE . "如果没有找到模板或者模板文件名为空
MESSAGE I004 WITH IM_OBJID. "004:模板文件&1不存在,请使用[SWM0]加载!
STOP. "停止事件
ENDIF.
*---调用SAP操作WINDOW文件的事件(CL_GUI_FRONTEND_SERVICES),描述文件存放的路经,文件名,指定打开的文件,指定写入的文件---*
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
"打开或者取得数据的文件地址的对话框
EXPORTING
WINDOW_TITLE = GWK_TITLE "对话框的标题
DEFAULT_EXTENSION = GWK_EXTENSION "默认的文件后缀名
DEFAULT_FILE_NAME = GWK_FILENAME "默认打开的文件名
INITIAL_DIRECTORY = GWK_DIRECTORY "初始化的目录
* MULTISELECTION = 'X' "是否可以同时打开多个文件
FILE_FILTER =
CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL "文件打开的FILTER:文件类型EXCEL
CHANGING
FILENAME = LWK_FILENAME "你所打开的文件名字列表
PATH = LWK_PATH "返回值,如果成功打开了,为1
FULLPATH = LWK_FULLPATH
USER_ACTION = LWK_UA "動作結果,成功返回值0.
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
INVALID_DEFAULT_FILE_NAME = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
CHECK LWK_UA = 0.
LWK_FN = LWK_FILENAME.
***---下载模板---***
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' "从服务器下载文件
EXPORTING
KEY = LWK_OBJECT
DESTINATION = LWK_FN "文件名
IMPORTING
RC = LWK_RC. "系统返回值,下载成功则返回0.
IF LWK_RC <> 0.
MESSAGE I005 WITH IM_OBJID.
STOP.
ENDIF.
ENDIF.
ENDFORM. " SUB_DOWNLOAD_TEMP
*&---------------------------------------------------------------------*
*& FORM SUB_GET_FILE
*&---------------------------------------------------------------------*
* SEARCH HELP FOR FILE 选择屏幕的文件名字段的搜索帮助文本
*----------------------------------------------------------------------*
* -->O_FNAME TEXT
*----------------------------------------------------------------------*
FORM SUB_GET_FILE CHANGING O_FNAME.
DATA: LTD_FILETABLE TYPE FILETABLE, "参照文件名表类型定义内表
LTH_FILETABLE LIKE LINE OF LTD_FILETABLE, "定义工作区
LWK_RETURN TYPE I. "定义系统返回值变量
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
"打开或者取得数据的文件地址的对话框
EXPORTING
WINDOW_TITLE = GWK_TITLE "对话框的标题
DEFAULT_EXTENSION = GWK_EXTENSION "默认的文件后缀名
DEFAULT_FILENAME = GWK_FILENAME "默认打开的文件名
FILE_FILTER =
CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL "文件打开的FILTER:文件类型EXCEL
* WITH_ENCODING =
INITIAL_DIRECTORY = GWK_DIRECTORY "初始化的目录
* MULTISELECTION =
CHANGING
FILE_TABLE = LTD_FILETABLE
"将输入的文件夹路径及文件名的信息返回写入内表LTD_FILETABLE中。
RC = LWK_RETURN "系统返回值,成功则返回0.
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC <> 0. "如果返回不成功
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE. "如果返回成功
READ TABLE LTD_FILETABLE INTO LTH_FILETABLE INDEX 1. "读取内表记录至工作区
IF NOT LTH_FILETABLE-FILENAME IS INITIAL. "如果文件名不为空
O_FNAME = LTH_FILETABLE-FILENAME.
"将工作表的文件名赋值给屏幕选择的文件名变量,并将值返回到选择屏幕界面上。
ENDIF.
ENDIF.
FREE: LTH_FILETABLE, "释放工作区
LTD_FILETABLE, "释放内表
LWK_RETURN. "释放变量
ENDFORM. " SUB_GET_FILE
*&---------------------------------------------------------------------*
*& FORM SUB_CHECK_FILE
*&---------------------------------------------------------------------*
* CHECK FILE EXIST OR NOT
*----------------------------------------------------------------------*
* -->I_FNAME
* -->C_ERROR
*----------------------------------------------------------------------*
FORM SUB_CHECK_FILE USING I_FNAME
CHANGING C_ERROR.
DATA: LWK_RC TYPE C.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST "检查物理文件是否存在
EXPORTING
FILE = I_FNAME
RECEIVING
RESULT = LWK_RC "输入检查结果,若存在,则返回X
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
WRONG_PARAMETER = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC <> 0 OR LWK_RC NE 'X' . "若系统返回值不等于0或检查结果不等于X
MESSAGE E002 WITH I_FNAME DISPLAY LIKE 'S'. "002:打开模板文件&1时出错!
C_ERROR = 'X'.
ELSE.
C_ERROR = ''.
ENDIF.
ENDFORM. " SUB_CHECK_FILE
*&---------------------------------------------------------------------*
*& FORM SUB_OPEN_FILE
*&---------------------------------------------------------------------*
* OPEN EXCEL FILE
*----------------------------------------------------------------------*
* -->I_FNAME TEXT
*----------------------------------------------------------------------*
FORM SUB_OPEN_FILE USING I_FNAME.
CREATE OBJECT GWK_EXCEL 'EXCEL.APPLICATION'.
CALL METHOD OF
GWK_EXCEL
'WORKBOOKS' = GWK_BOOKS.
CALL METHOD OF
GWK_BOOKS
'OPEN'
EXPORTING
#1 = I_FNAME.
CALL METHOD OF
GWK_EXCEL
'WORKSHEETS' = GWK_SHEET
EXPORTING
#1 = 1.
CALL METHOD OF
GWK_SHEET
'ACTIVATE'.
. "激活工作表
CALL METHOD OF
GWK_EXCEL
'CELLS' = GWK_CELL "光标所在的单元格位置
EXPORTING
#1 = 1
#2 = 1.
* SET PROPERTY OF GWK_EXCEL 'VISIBLE' = 1.
ENDFORM. " SUB_OPEN_FILE
*&---------------------------------------------------------------------*
*& FORM SUB_FILL_CELL
*&---------------------------------------------------------------------*
* SET VALUE TO CELL
*----------------------------------------------------------------------*
* -->I_LINE TEXT
* -->I_COL TEXT
* -->I_VALUE TEXT
*----------------------------------------------------------------------*
FORM SUB_FILL_CELL USING I_LINE
I_COL
I_VALUE.
CALL METHOD OF
GWK_EXCEL
'CELLS' = GWK_CELL
EXPORTING
#1 = I_LINE
#2 = I_COL.
SET PROPERTY OF GWK_CELL 'VALUE' = I_VALUE. "设置该单元格属性:单元格的值
ENDFORM. " FILL_CELL
*&---------------------------------------------------------------------*
*& FORM SUB_INSERT_ROW
*&---------------------------------------------------------------------*
* INSERT ROWS
*----------------------------------------------------------------------*
* -->I_SHEET TEXT
* -->I_ROW TEXT
* -->I_ROWS TEXT
*----------------------------------------------------------------------*
FORM SUB_INSERT_ROW USING I_SHEET
I_ROW
I_ROWS.
DATA L_RANGE TYPE OLE2_OBJECT.
DATA LWK_STR1 TYPE STRING.
DATA LWK_STR2 TYPE STRING.
LWK_STR1 = I_ROW.
LWK_STR2 = I_ROW + I_ROWS - 1.
CONDENSE:LWK_STR1,LWK_STR2.
CONCATENATE LWK_STR1 ':' LWK_STR2 INTO LWK_STR2.
CALL METHOD OF I_SHEET 'ROWS' = L_RANGE EXPORTING #1 = LWK_STR1.
CALL METHOD OF L_RANGE 'COPY'.
CALL METHOD OF I_SHEET 'ROWS' = L_RANGE EXPORTING #1 = LWK_STR2.
CALL METHOD OF L_RANGE 'INSERT'.
SET PROPERTY OF GWK_EXCEL 'CUTCOPYMODE' = 'FALSE'.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM SUB_INSERT_COL
*&---------------------------------------------------------------------*
* INSERT COLUMNS
*----------------------------------------------------------------------*
* -->I_SHEET TEXT
* -->I_COL TEXT
* -->I_COLS TEXT
*----------------------------------------------------------------------*
FORM SUB_INSERT_COL USING I_SHEET
I_COL
I_COLS.
DATA L_RANGE TYPE OLE2_OBJECT.
DATA LWK_COL TYPE I.
DATA LWK_STR1 TYPE STRING.
DATA LWK_STR2 TYPE STRING.
LWK_COL = I_COL + I_COLS - 1.
PERFORM SUB_CONVERSION USING I_COL
CHANGING LWK_STR1.
PERFORM SUB_CONVERSION USING LWK_COL
CHANGING LWK_STR2.
CONDENSE:LWK_STR1,LWK_STR2.
CONCATENATE LWK_STR1 ':' LWK_STR2 INTO LWK_STR2.
CALL METHOD OF I_SHEET 'COLUMNS' = L_RANGE EXPORTING #1 = LWK_STR1.
CALL METHOD OF L_RANGE 'COPY'.
CALL METHOD OF I_SHEET 'COLUMNS' = L_RANGE EXPORTING #1 = LWK_STR2.
CALL METHOD OF L_RANGE 'INSERT'.
SET PROPERTY OF GWK_EXCEL 'CUTCOPYMODE' = 'FALSE'.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM SUB_CONVERSION
*&---------------------------------------------------------------------*
* CONVERT A COLUMN NUMBER(EG.256) INTO AN EXCEL COLUMN (EG.IV)
*----------------------------------------------------------------------*
* -->I_INPUT TEXT
* -->O_OUTPUT TEXT
*----------------------------------------------------------------------*
FORM SUB_CONVERSION USING I_INPUT TYPE I
CHANGING O_OUTPUT TYPE STRING.
DATA LWK_DIV TYPE I.
DATA LWK_REM TYPE I.
CHECK I_INPUT > 0.
LWK_DIV = I_INPUT DIV 26.
LWK_REM = I_INPUT MOD 26.
IF LWK_REM IS INITIAL.
LWK_REM = 26.
SUBTRACT 1 FROM LWK_DIV.
ENDIF.
SUBTRACT 1 FROM LWK_REM.
CONCATENATE SY-ABCDE+LWK_REM(1) O_OUTPUT INTO O_OUTPUT.
PERFORM SUB_CONVERSION USING LWK_DIV
CHANGING O_OUTPUT.
ENDFORM.