(原创)带模板的DOI输出EXCEL

      与OLE一样,模板的作用就是将一些类似标题和表头行这种值固定,格式固定的单元格填充好数据和设置好格式后存储为模板上传到系统中。然后需要时根据上传模板的在SAP系统中的URL打开模板,再进行下一步的操作。

      DOI上传模板的事务码是OAOR,下面阐述上传的具体步骤:

1.输入T-CODE:OAOR,进入界面后填入类名称,分类类型,对象代码后点击执行。

2.右键“表模板”->输入文件

3.打开自己保存好的模板文件,设置文件描述。

4.展开HRFPM_EXCEL_STANDARD文件夹,发现文件已上传完毕

      模板文件上传之后,我们需要在程序中获取它的URL,主要是使用类CL_BDS_DOCUMENT_SET 的GET_WITH_URL 方法,具体用法见下面的DEMO示例。

      DEMO示例:

输出目标:

模板:

创建的屏幕100:

源代码:

*&---------------------------------------------------------------------*
*& Report Z15540_DOI1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z15540_DOI2.
TYPE-POOLS:SOI.
"数据定义
DATA:BEGIN OF GS_DATA,
       WERKS TYPE MARD-WERKS,
       LGORT TYPE MARD-LGORT,
       MATNR TYPE MARD-MATNR,
       MAKTX TYPE MAKT-MAKTX,
       LABST TYPE MARD-LABST,
       MEINS TYPE MARA-MEINS,
     END OF GS_DATA.
DATA GT_DATA LIKE TABLE OF GS_DATA.
"DOI相关定义
DATA:LCL_CONTAINER TYPE REF TO CL_GUI_CONTAINER, "容器引用对象
     LCL_CONTROL   TYPE REF TO I_OI_CONTAINER_CONTROL, "容器控制器引用对象
     LCL_DOCUMENT  TYPE REF TO I_OI_DOCUMENT_PROXY, "对应EXCEL文档层次引用对象
     LCL_SHEET     TYPE REF TO I_OI_SPREADSHEET. "对应SHEET层次操作的接口引用对象
DATA:GV_URL TYPE BDS_URI."存放将要打开模板的URL

START-OF-SELECTION.
  CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Form FRM_CONTAINER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CONTAINER .
  "将CL_GUI_CONTAINER的静态属性SCREEN0付给LCL_CONTAINER
  LCL_CONTAINER = CL_GUI_CONTAINER=>SCREEN0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CONTAINER_CONTROL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CONTAINER_CONTROL .
  "实例化容器控制器
  CALL METHOD C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROL
    IMPORTING
      CONTROL = LCL_CONTROL.
  "绑定容器与容器控制器,并初始化控制器设定
  CALL METHOD LCL_CONTROL->INIT_CONTROL
    EXPORTING
*     DYNPRO_NR                = SY-DYNNR
*     GUI_CONTAINER            = ' '
      INPLACE_ENABLED          = 'X' "EXCEL可嵌入容器
*     INPLACE_MODE             = 0
*     INPLACE_RESIZE_DOCUMENTS = ' '
      INPLACE_SCROLL_DOCUMENTS = 'X' "可滚动
*     INPLACE_SHOW_TOOLBARS    = 'X' "是否展示工具栏以上
*     NO_FLUSH                 = 'X'
*     PARENT_ID                = cl_gui_cfw=>dynpro_0
      R3_APPLICATION_NAME      = 'DOI TEST'
      REGISTER_ON_CLOSE_EVENT  = 'X' "注册关闭事件
      REGISTER_ON_CUSTOM_EVENT = 'X' "注册定制事件
*     REP_ID                   = SY-REPID
*     SHELL_STYLE              = 1384185856
      PARENT                   = LCL_CONTAINER
*     NAME                     =
*     AUTOALIGN                = 'x'
*  IMPORTING
*     ERROR                    =
*     RETCODE                  =
    EXCEPTIONS
      JAVABEANNOTSUPPORTED     = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CREATE_EXCEL .
  "实例化LCL_DOCUMENT
  CALL METHOD LCL_CONTROL->GET_DOCUMENT_PROXY
    EXPORTING
*     DOCUMENT_FORMAT    = 'NATIVE'
      DOCUMENT_TYPE  = 'EXCEL.SHEET' "应用类型
      NO_FLUSH       = 'X'
*     REGISTER_CONTAINER = ' '
    IMPORTING
      DOCUMENT_PROXY = LCL_DOCUMENT
*     ERROR          =
*     RETCODE        =
    .
  "打开XCEL文件
CALL METHOD LCL_DOCUMENT->OPEN_DOCUMENT
  EXPORTING
*    DOCUMENT_TITLE   = ' '
    DOCUMENT_URL     = gv_url
*    NO_FLUSH         = ' '
    OPEN_INPLACE     = 'X'
*    OPEN_READONLY    = ' '
*    PROTECT_DOCUMENT = ' '
*    ONSAVE_MACRO     = ' '
*    STARTUP_MACRO    = ''
*    USER_INFO        =
*  IMPORTING
*    ERROR            =
*    RETCODE          =
    .



ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_DATA .
  DATA LV_ROW TYPE I."填充数据的行数
  DATA:LS_RANGE       TYPE SOI_RANGE_ITEM,
       LT_RANGE       TYPE TABLE OF SOI_RANGE_ITEM, "为SET_RANGE_DATA方法标明填充数据的范围名及其行列数
       LS_CONTENT     TYPE SOI_GENERIC_ITEM,
       LT_CONTENT     TYPE TABLE OF SOI_GENERIC_ITEM, "为SET_RANGE_DATA方法提供填充数据
       LS_FORMATTABLE TYPE  SOI_FORMAT_ITEM, "设置范围格式
       LT_FORMATTABLE TYPE TABLE OF SOI_FORMAT_ITEM. "设置范围格式

  DATA LV_COUNT_ROW TYPE I."当前行
  DATA LV_LABST TYPE C LENGTH 18.
  FIELD-SYMBOLS:<FS_DATA_FILED>,
                <FS_CONTENT_FIELD>.
  SELECT MARD~WERKS,
         MARD~LGORT,
         MARD~MATNR,
         MAKT~MAKTX,
         MARD~LABST,
         MARA~MEINS
  INTO TABLE @GT_DATA UP TO 200 ROWS
  FROM MARD INNER JOIN MARA
  ON MARD~MATNR = MARA~MATNR
  LEFT OUTER JOIN MAKT
  ON MARD~MATNR = MAKT~MATNR
  WHERE MAKT~SPRAS = @SY-LANGU.
  DESCRIBE TABLE GT_DATA LINES LV_ROW."填充数据行数

  DATA A1 TYPE I.
  CALL METHOD LCL_DOCUMENT->HAS_SPREADSHEET_INTERFACE
    EXPORTING
      NO_FLUSH     = 'X'
    IMPORTING
*     ERROR        =
      IS_AVAILABLE = A1
*     RETCODE      =
    .
  "实例化SHEET对象
  CALL METHOD LCL_DOCUMENT->GET_SPREADSHEET_INTERFACE
    EXPORTING
      NO_FLUSH        = 'X'
    IMPORTING
*     ERROR           =
      SHEET_INTERFACE = LCL_SHEET
*     RETCODE         =
    .
  "选中SHEET1
  CALL METHOD LCL_SHEET->SELECT_SHEET
    EXPORTING
      NAME     = 'Sheet1'
      NO_FLUSH = 'X'
*  IMPORTING
*     ERROR    =
*     RETCODE  =
    .
*CALL METHOD LCL_SHEET->GET_ACTIVE_SHEET
*  EXPORTING
*    NO_FLUSH  = 'X'
**  IMPORTING
**    SHEETNAME =
**    ERROR     =
**    RETCODE   =
*    .
  "创建一个左上角为第一行第一列,共计6列200行,名叫RANGE1的范围对象
  CALL METHOD LCL_SHEET->INSERT_RANGE_DIM
    EXPORTING
      NO_FLUSH = 'X'
      NAME     = 'RANGE1'
      LEFT     = 1
      TOP      = 4
      ROWS     = LV_ROW
      COLUMNS  = 6
*     UPDATING = -1
*     SHEETNAME = ''
*  IMPORTING
*     ERROR    =
*     RETCODE  =
    .
  LT_RANGE = VALUE #( ( NAME = 'RANGE1' ROWS = LV_ROW COLUMNS = '6' ) ).
  LOOP AT GT_DATA INTO GS_DATA.
    LV_COUNT_ROW = SY-TABIX.
    DO 6 TIMES.
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE GS_DATA TO <FS_DATA_FILED>.
      LS_CONTENT-ROW = LV_COUNT_ROW.
      LS_CONTENT-COLUMN = SY-INDEX.
      IF SY-INDEX = 5.
        LV_LABST = <FS_DATA_FILED>.
        CONDENSE LV_LABST NO-GAPS.
        LS_CONTENT-VALUE = LV_LABST.
      ELSE.
        LS_CONTENT-VALUE = <FS_DATA_FILED>.
      ENDIF.
      APPEND LS_CONTENT TO LT_CONTENT.
      CLEAR LS_CONTENT.
    ENDDO.
    CLEAR GS_DATA.
  ENDLOOP.
  "填充数据
  CALL METHOD LCL_SHEET->SET_RANGES_DATA
    EXPORTING
      NO_FLUSH = 'X'
      RANGES   = LT_RANGE
      CONTENTS = LT_CONTENT
*     UPDATING = -1
*     RANGESDEF =
*    IMPORTING
*     ERROR    =
*     RETCODE  =
    .
  "设置范围字体格式
  LT_FORMATTABLE = VALUE #( ( NAME = 'RANGE1' SIZE = 11 ALIGN = 1 ) )."RANGE1字体大小11 水平居中
  CALL METHOD LCL_SHEET->SET_RANGES_FORMAT
    EXPORTING
      FORMATTABLE = LT_FORMATTABLE
      NO_FLUSH    = 'X'
*     UPDATING    = -1
*    IMPORTING
*     ERROR       =
*     RETCODE     =
    .
  "设置范围边框格式
  CALL METHOD LCL_SHEET->SET_FRAME
    EXPORTING
      RANGENAME = 'RANGE1'
      TYP       = '127'
      COLOR     = 1
*     NO_FLUSH  = ' '
*    IMPORTING
*     ERROR     =
*     RETCODE   =
    .
  "设置列自动优化
  CALL METHOD LCL_SHEET->FIT_WIDEST
    EXPORTING
      NO_FLUSH = 'X'
      NAME     = SPACE
*    IMPORTING
*     ERROR    =
*     RETCODE  =
    .


  "更改SHEET名称
  CALL METHOD LCL_SHEET->SET_SHEET_NAME
    EXPORTING
      NEWNAME  = '可用库存清单'
      OLDNAME  = 'Sheet1'
      NO_FLUSH = 'X'
*    IMPORTING
*     ERROR    =
*     RETCODE  =
    .
*  "保存文件(该方法会自动默认保存到c盘用户文件下的文档文件夹中)
*  CALL METHOD LCL_DOCUMENT->SAVE_AS
*    EXPORTING
*      FILE_NAME = '可用库存清单'
*      NO_FLUSH  = 'X'
**     PROMPT_USER = ' '
**     IMPORTING
**     ERROR     =
**     RETCODE   =
*    .


ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STANDARD'.
  SET TITLEBAR 'DOI TEST'.
  "获取模板的URL
  PERFORM FRM_GET_MBURL.
  "实例化容器
  PERFORM FRM_CONTAINER.
  "创建容器控制器
  PERFORM FRM_CONTAINER_CONTROL.
  "创建EXCEL文档
  PERFORM FRM_CREATE_EXCEL.
  "填充数据
  PERFORM FRM_SET_DATA.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  "退出时释放实例。
  IF LCL_DOCUMENT IS NOT INITIAL.
    CALL METHOD LCL_DOCUMENT->CLOSE_DOCUMENT.
  ENDIF.
  IF LCL_CONTAINER IS NOT INITIAL.
    CALL METHOD LCL_CONTAINER->FREE.
  ENDIF.
  IF LCL_CONTROL IS NOT INITIAL.
    CALL METHOD LCL_CONTROL->DESTROY_CONTROL.
    FREE LCL_CONTROL.
  ENDIF.
  LEAVE PROGRAM.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_GET_MBURL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_MBURL.
  DATA:LV_CLASSNAME  TYPE SBDST_CLASSNAME VALUE 'HRFPM_EXCEL_STANDARD',
       LV_CLASSTYPE  TYPE SBDST_CLASSTYPE VALUE 'OT',
       LV_OBJECT_KEY TYPE SBDST_OBJECT_KEY VALUE 'DOIMB',
       LT_URL        TYPE SBDST_URI,
       LS_URL        LIKE LINE OF LT_URL.
  CALL METHOD CL_BDS_DOCUMENT_SET=>GET_WITH_URL
    EXPORTING
*     LOGICAL_SYSTEM  =
      CLASSNAME       = LV_CLASSNAME
      CLASSTYPE       = LV_CLASSTYPE
*     CLIENT          =
      OBJECT_KEY      = LV_OBJECT_KEY
*     URL_LIFETIME    =
*     SELECTED_INDEX  =
    CHANGING
      URIS            = LT_URL
*     SIGNATURE       =
*     COMPONENTS      =
    EXCEPTIONS
      NOTHING_FOUND   = 1
      ERROR_KPRO      = 2
      INTERNAL_ERROR  = 3
      PARAMETER_ERROR = 4
      NOT_AUTHORIZED  = 5
      NOT_ALLOWED     = 6
      OTHERS          = 7.
  IF SY-SUBRC = 0.
    READ TABLE LT_URL INTO LS_URL INDEX 1.
    GV_URL = LS_URL-URI.
  ENDIF.


ENDFORM.
原文地址:https://www.cnblogs.com/jianglaizhen/p/8780433.html