上传xls模板文件到SAP服务器

事务代码: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.
发布了249 篇原创文章 · 获赞 85 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/ot512csdn/article/details/103080360