zoukankan      html  css  js  c++  java
  • (原创)带模板的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.
  • 相关阅读:
    Json操作(汇总)
    Jersey实现Client端:GET/PUT/POST/DELETE
    tomcat配置文件server.xml详解
    DB2 Catalog浅析&学习笔记
    《学习笔记》Maven
    【58沈剑架构系列】单点系统架构的可用性与性能优化
    JavaScript(获取或设置html元素的宽,高,坐标),确定和判断鼠标是否在元素内部,二级导航菜单鼠标离开样式问题解决
    纯CSS绘制三角形(各种角度)
    css3 box-sizing属性值详解
    css字体图标的使用方法
  • 原文地址:https://www.cnblogs.com/jianglaizhen/p/8780433.html
Copyright © 2011-2022 走看看