ABAP DOI 下载SMW0的EXCEL和WORD模板

FUNCTION 'SAP_OI_LOAD_MIME_DATA' 下载SMW0的模板,用METHOD LR_PROXY->OPEN_DOCUMENT_FROM_TABLE 打开模板

没找到和ole一样先下载,在打开的方法

SMWO上载模板用二进制,注意先维护模板类型

EXCEL可以在模板设置格式,例如前导零

WORD模板

ABAP DOI 下载SMW0的EXCEL和WORD模板

导出效果:

ABAP DOI 下载SMW0的EXCEL和WORD模板

ABAP DOI 下载SMW0的EXCEL和WORD模板

REPORT  ZTEST035.

TABLES:MARA.

TYPE-POOLS:SLIS.

DATA: GW_LAYOUT TYPE LVC_S_LAYO,
      GW_FIELD TYPE LVC_S_FCAT,
      GT_FIELD TYPE LVC_T_FCAT.

TYPES:BEGIN OF GS_PERNR,
      MARK(1),
      PERNR           TYPE PERSNO,
      NAME1           TYPE NAME1,
      CARDTYPE(50),
      CARDNUM(50),
      COUNTRY(50),
      SEX(2),
      BIRTHDAY        TYPE DATUM,
      END OF GS_PERNR.

TYPES:BEGIN OF GS_MATNR,
      MARK(1),
      MATNR           TYPE MATNR,
      ERSDA           TYPE ERSDA,
      ERNAM           TYPE ERNAM,
      LAEDA           TYPE LAEDA,
      AENAM           TYPE AENAM,
      VPSTA           TYPE VPSTA,
      PSTAT           TYPE PSTAT_D,
      END OF GS_MATNR.

DATA: GW_PERNR TYPE GS_PERNR,
      GT_PERNR TYPE GS_PERNR OCCURS 0,
      GT_PERNR2 TYPE GS_PERNR OCCURS 0,
      GW_MATNR TYPE GS_MATNR,
      GT_MATNR TYPE GS_MATNR OCCURS 0.

DEFINE ALV_FIELD.
  GW_FIELD-key = &1.
  GW_FIELD-FIELDNAME = &2.
  GW_FIELD-COLTEXT = &3.
  IF GW_FIELD-FIELDNAME = 'MARK'.

  ENDIF.

  IF GW_FIELD-FIELDNAME = 'PERNR'.
    GW_FIELD-LZERO = 'X'.
  ENDIF.
  APPEND GW_FIELD TO GT_FIELD.
  CLEAR GW_FIELD.
END-OF-DEFINITION.

  "路径
  DATA: L_FILENAME   TYPE STRING,
        L_PATH       TYPE STRING,
        L_FULLPATH   TYPE STRING.
  "模板
  DATA: LS_WWWDATA   LIKE WWWDATATAB,
        P_OBJID      LIKE WWWDATATAB-OBJID VALUE 'ZTEST035_1',
*        L_DES        LIKE RLGRAP-FILENAME,
*        L_RC         TYPE SY-SUBRC.
        L_MESSAGE    TYPE STRING.
"<----开始DOI
  DATA: LR_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
        LR_CONTROL   TYPE REF TO I_OI_CONTAINER_CONTROL,
        LR_ERROR     TYPE REF TO I_OI_ERROR,
        L_RETCODE    TYPE SOI_RET_STRING,
        LR_PROXY     TYPE REF TO I_OI_DOCUMENT_PROXY,
        G_DOCUMENT_TYPE(50) TYPE C VALUE 'Word.Document.8'.
"<--------下载模板
  DATA: LT_MIMETAB   TYPE W3MIME OCCURS 0,
        L_LENGTH     TYPE I,
        L_DOC_FORMAT TYPE C,
        L_DOC_TYPE   TYPE C.

SELECTION-SCREEN BEGIN OF SCREEN 500 AS SUBSCREEN .
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: S_MATNR FOR MARA-MATNR.
SELECTION-SCREEN END OF BLOCK B1 .
SELECTION-SCREEN END OF SCREEN 500.

SELECTION-SCREEN BEGIN OF SCREEN 600 AS SUBSCREEN .
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
  SELECT-OPTIONS: S_PERNR FOR MARA-MATNR.
SELECTION-SCREEN END OF BLOCK B2 .
SELECTION-SCREEN END OF SCREEN 600.

SELECTION-SCREEN: BEGIN OF TABBED BLOCK MYTAB FOR 30 LINES,
                  TAB (18) TEXT1 USER-COMMAND BUT1 DEFAULT SCREEN 500,
                  TAB (18) TEXT2 USER-COMMAND BUT2 DEFAULT SCREEN 600,
                  END OF BLOCK MYTAB.





INITIALIZATION.
  TEXT1 = '物料查询FOR WORD'.
  TEXT2 = 'FOR EXCEL'.

*&-------------------------------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&-------------------------------------------------------------------------------------------*
AT SELECTION-SCREEN.
  CASE  SY-DYNNR .
    WHEN 1000 .
      CASE SY-UCOMM .
        WHEN 'BUT1'.
          MYTAB-DYNNR = 500 .
          P_OBJID = 'ZTEST035_1'.
          G_DOCUMENT_TYPE = 'Word.Document.8'.
        WHEN 'BUT2'.
          MYTAB-DYNNR = 600.
          P_OBJID = 'ZTEST035_2'.
          G_DOCUMENT_TYPE = 'Excel.Sheet'.
        WHEN OTHERS .
      ENDCASE.

  ENDCASE.

START-OF-SELECTION.
  CASE  MYTAB-DYNNR .
    WHEN 500.
      PERFORM GET_MATNR.
      PERFORM MATNR_ALV_DISPLAY.
    WHEN 600.
      PERFORM GET_PERNR.
      PERFORM PERNR_ALV_DISPLAY.
    WHEN OTHERS.
  ENDCASE.
*&---------------------------------------------------------------------*
*&      Form  GET_MATNR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_MATNR .
  SELECT
    MATNR
    ERSDA
    ERNAM
    LAEDA
    AENAM
    VPSTA
    PSTAT
    FROM MARA
    INTO CORRESPONDING FIELDS OF TABLE GT_MATNR
    WHERE MATNR IN S_MATNR.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  GET_PERNR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_PERNR .
  GW_PERNR-MARK     = ''.
  GW_PERNR-PERNR     = '00012345'.
  GW_PERNR-NAME1     = '王一'.
  GW_PERNR-CARDTYPE  = '居民身份证'.
  GW_PERNR-CARDNUM   = '1111111'.
  GW_PERNR-COUNTRY   = '波黑'.
  GW_PERNR-SEX       = ''.
  GW_PERNR-BIRTHDAY  = '19900101'.
  APPEND GW_PERNR TO GT_PERNR.
  GW_PERNR-MARK     = ''.
  GW_PERNR-PERNR     = '00067890'.
  GW_PERNR-NAME1     = '李三'.
  GW_PERNR-CARDTYPE  = '港澳居民来往内地通行证'.
  GW_PERNR-CARDNUM   = '2222222'.
  GW_PERNR-COUNTRY   = '波兰'.
  GW_PERNR-SEX       = ''.
  GW_PERNR-BIRTHDAY  = '19900202'.
  APPEND GW_PERNR TO GT_PERNR.
ENDFORM.                    " GET_PERNR
*&---------------------------------------------------------------------*
*&      Form  MATNR_ALV_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MATNR_ALV_DISPLAY .
  PERFORM GET_FIELD.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM                = SY-REPID
      I_CALLBACK_PF_STATUS_SET          = 'FRM_PF_STATUS_SET'
      I_CALLBACK_USER_COMMAND           = 'FRM_USER_COMMAND'
      IS_LAYOUT_LVC                     = GW_LAYOUT
      IT_FIELDCAT_LVC                   = GT_FIELD[]
    TABLES
      T_OUTTAB                          = GT_MATNR[]
    EXCEPTIONS
      PROGRAM_ERROR                     = 1
      OTHERS                            = 2
            .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " ALV_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  PERNR_ALV_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PERNR_ALV_DISPLAY .
  PERFORM GET_FIELD.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM                = SY-REPID
      I_CALLBACK_PF_STATUS_SET          = 'FRM_PF_STATUS_SET'
      I_CALLBACK_USER_COMMAND           = 'FRM_USER_COMMAND'
      IS_LAYOUT_LVC                     = GW_LAYOUT
      IT_FIELDCAT_LVC                   = GT_FIELD[]
    TABLES
      T_OUTTAB                          = GT_PERNR[]
    EXCEPTIONS
      PROGRAM_ERROR                     = 1
      OTHERS                            = 2
            .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " PERNR_ALV_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  GET_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_FIELD .

  IF MYTAB-DYNNR = 500.
*    ALV_FIELD 'MARK' '选择'.
    ALV_FIELD '' 'MATNR' '物料号'.
    ALV_FIELD '' 'ERSDA' '选择1'.
    ALV_FIELD '' 'ERNAM' '选择2'.
    ALV_FIELD '' 'LAEDA' '选择4'.
    ALV_FIELD '' 'AENAM' '选择5'.
    ALV_FIELD '' 'VPSTA' '选择6'.
    ALV_FIELD '' 'PSTAT' '选择7'.
  ELSEIF MYTAB-DYNNR = 600.
*    ALV_FIELD '' 'MARK' '选择'.
    ALV_FIELD '' 'PERNR' '员工号'.
    ALV_FIELD '' 'NAME1' '姓名'.
    ALV_FIELD '' 'CARDTYPE' '证件类型'.
    ALV_FIELD '' 'CARDNUM' '证件号码'.
    ALV_FIELD '' 'SEX' '性别'.
    ALV_FIELD '' 'BIRTHDAY' '生日'.
  ENDIF.
  GW_LAYOUT-SEL_MODE     = 'D'.
  GW_LAYOUT-BOX_FNAME     = 'MARK'.
"默认设置  等同于B
"'A'行和列的选择,无法选择单元格  用户可以使用最左边的选择按钮来选择多行
"'B'单选,不可以多选行,不可以多选单元格
"'C'多选,可以多选行,不可以多选单元格
"'D'单元格的选择,可以多选单元格   用户可以使用最左边的选择按钮来选择多行
  GW_LAYOUT-CWIDTH_OPT   = 'X'.

ENDFORM.                    " GET_FIELD
*&---------------------------------------------------------------------*
*&      Form  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       button define
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM FRM_PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STATUS035'  EXCLUDING RT_EXTAB.
ENDFORM.                    "SET_PF_STATUS
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING    L_UCOMM    TYPE SY-UCOMM"未生成发票号
                      CHANGING is_selfield TYPE slis_selfield.
  DATA: LV_ANSWER.
*is_selfield-refresh    = 'X'.
*
*  DATA: g_grid TYPE REF TO cl_gui_alv_grid.
*  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*    IMPORTING
*      e_grid = g_grid.
*  CALL METHOD g_grid->refresh_table_display.

  CASE L_UCOMM .
    WHEN 'ZOUT'.
      IF MYTAB-DYNNR = 500.

        READ TABLE GT_MATNR INTO GW_MATNR WITH KEY MARK = 'X'.
        IF SY-SUBRC <> 0.
          MESSAGE '请选择其中一行!' TYPE 'E'.
        ENDIF.
        "保存前弹出提示消息
        CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
          EXPORTING
            TEXTLINE1 = TEXT-T01
            TITEL     = TEXT-T02
          IMPORTING
            ANSWER    = LV_ANSWER.
        CHECK LV_ANSWER = 'J'.

        "<----选择路径
        PERFORM SELECT_PATH.

        LOOP AT GT_MATNR INTO GW_MATNR.
          CLEAR L_FULLPATH.
          CONCATENATE L_PATH GW_MATNR-MATNR '.DOC' INTO L_FULLPATH.
          perform FRM_DOWNLOAD_WORD.
          CLEAR:GW_MATNR.
        ENDLOOP.

      ELSEIF MYTAB-DYNNR = 600.

        READ TABLE GT_PERNR INTO GW_PERNR WITH KEY MARK = 'X'.
        IF SY-SUBRC <> 0.
          MESSAGE '请选择其中一行!' TYPE 'E'.
        ENDIF.

                "保存前弹出提示消息
        CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
          EXPORTING
            TEXTLINE1 = TEXT-T01
            TITEL     = TEXT-T02
          IMPORTING
            ANSWER    = LV_ANSWER.
        CHECK LV_ANSWER = 'J'.

        "<----选择路径
        PERFORM SELECT_PATH.

        perform FRM_DOWNLOAD_EXCEL.

      ENDIF.

  ENDCASE.
ENDFORM.                    "frm_user_command
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_MATNR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_WORD .

  DATA: LR_WORD TYPE REF TO I_OI_WORD_PROCESSOR_DOCUMENT.
  "<---------替换 宏
  DATA: ROW_INDEX    TYPE I.
  DATA: L_WORD(250),
        L_FILE_NAME(250).
*"<----选择路径
*  PERFORM SELECT_PATH.

"<----检查模板是否存在
  PERFORM CHECK_MODEL.

"<----模板下载;如果还要编辑模板,则不先下载,先创建实例和代理,
"<----用'SAP_OI_LOAD_MIME_DATA'获取服务器模板信息,打开编辑
*  L_DES = L_FULLPATH.
*  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
*    EXPORTING
*      KEY               = LS_WWWDATA
*      DESTINATION       = L_DES
*    IMPORTING
*      RC                = L_RC
*            .
*  IF L_RC <> 0.
*    CLEAR:L_MESSAGE.
*    CONCATENATE '模板' P_OBJID '下载失败!' INTO L_MESSAGE.
*    MESSAGE L_MESSAGE TYPE 'E'.
*  ENDIF.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
       TEXT = '正在初始化 OI 控制, 请稍候......'.

"<----开始DOI
  PERFORM GET_DOI.


  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
       TEXT = '正在下载, 请稍候......'.

"<--------下载模板并用代理代开
  PERFORM DOWNLOAD_MODEL.

  "打开模板
  CLEAR: LR_ERROR,L_RETCODE.
  CALL METHOD LR_PROXY->OPEN_DOCUMENT_FROM_TABLE
    EXPORTING
      DOCUMENT_SIZE  = L_LENGTH
      DOCUMENT_TABLE = LT_MIMETAB
      OPEN_INPLACE   = 'X'
    IMPORTING
      ERROR           = LR_ERROR
      RETCODE         = L_RETCODE.
  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
    EXPORTING
      TYPE = 'E'.
    "获取WORD
  CLEAR: LR_ERROR,L_RETCODE.
  CALL METHOD LR_PROXY->GET_WORDPROCESSOR_INTERFACE
    EXPORTING
      NO_FLUSH        = 'X'
    IMPORTING
      WP_INTERFACE    = LR_WORD
      ERROR           = LR_ERROR
      RETCODE         = L_RETCODE.
  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
    EXPORTING
      TYPE = 'E'.
  "替换的宏
  DEFINE REPLACE_WORD.
    CLEAR: LR_ERROR,L_RETCODE,L_WORD.
    L_WORD = &1.
    CALL METHOD LR_WORD->REPLACE
      EXPORTING
        FLAG           = ''
*        FLAG           = 'WORD'
        POS            = 'global'
        REPLACE_STRING = L_WORD
        SEARCH_STRING  = &2
      IMPORTING
        ERROR           = LR_ERROR
        RETCODE         = L_RETCODE.
    CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
      EXPORTING
        TYPE = 'E'.
  END-OF-DEFINITION.

  "调用宏替换
  REPLACE_WORD GW_MATNR-MATNR '&01'.
  REPLACE_WORD GW_MATNR-ERSDA '&02'.
  REPLACE_WORD GW_MATNR-ERNAM '&03'.
  REPLACE_WORD GW_MATNR-LAEDA '&04'.
  REPLACE_WORD GW_MATNR-AENAM '&05'.
  REPLACE_WORD GW_MATNR-VPSTA '&06'.
  REPLACE_WORD GW_MATNR-PSTAT '&07'.

  "保存
  L_FILE_NAME = L_FULLPATH.
  CALL METHOD LR_PROXY->SAVE_COPY_AS
    EXPORTING
      FILE_NAME = L_FILE_NAME.
  "释放
  CALL METHOD LR_PROXY->CLOSE_DOCUMENT.
  CALL METHOD LR_PROXY->RELEASE_DOCUMENT.
  CALL METHOD LR_CONTROL->DESTROY_CONTROL.
  FREE LR_CONTROL.
  IF LR_CONTAINER IS NOT INITIAL.
    CALL METHOD LR_CONTAINER->FREE.
  ENDIF.
  FREE LR_CONTAINER .
  FREE LR_CONTROL   .
  FREE LR_ERROR     .
  FREE L_RETCODE    .
  FREE LR_PROXY     .
ENDFORM.                    " FRM_DOWNLOAD_MATNR
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_PERNR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_EXCEL .
"<--------EXCEL相关
  DATA: LR_SHEET     TYPE REF TO I_OI_SPREADSHEET,
        LT_SHEETS    TYPE SOI_SHEETS_TABLE.

"<---------填数 宏
  DATA: ROW_INDEX    TYPE I.
  DATA: LT_RANGES    TYPE SOI_RANGE_LIST,
        LS_RANGE     TYPE SOI_RANGE_ITEM,
        LT_CONTENTS  TYPE SOI_GENERIC_TABLE,
        LS_CONTENT   TYPE SOI_GENERIC_ITEM,
        L_FILE_NAME(250).

"<----检查模板是否存在
  PERFORM CHECK_MODEL.

"<----模板下载;如果还要编辑模板,则不先下载,先创建实例和代理,
"<----用'SAP_OI_LOAD_MIME_DATA'获取服务器模板信息,打开编辑
*  L_DES = L_FULLPATH.
*  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
*    EXPORTING
*      KEY               = LS_WWWDATA
*      DESTINATION       = L_DES
*    IMPORTING
*      RC                = L_RC
*            .
*  IF L_RC <> 0.
*    CLEAR:L_MESSAGE.
*    CONCATENATE '模板' P_OBJID '下载失败!' INTO L_MESSAGE.
*    MESSAGE L_MESSAGE TYPE 'E'.
*  ENDIF.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
       TEXT = '正在初始化 OI 控制, 请稍候......'.

"<----开始DOI
  PERFORM GET_DOI.


  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
       TEXT = '正在下载, 请稍候......'.

"<--------下载模板并用代理代开
  PERFORM DOWNLOAD_MODEL.

  "打开模板
  CLEAR: LR_ERROR,L_RETCODE.
  CALL METHOD LR_PROXY->OPEN_DOCUMENT_FROM_TABLE
    EXPORTING
      DOCUMENT_SIZE  = L_LENGTH
      DOCUMENT_TABLE = LT_MIMETAB
      OPEN_INPLACE   = 'X'
    IMPORTING
      ERROR           = LR_ERROR
      RETCODE         = L_RETCODE.
  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
    EXPORTING
      TYPE = 'E'.

  "获取sheet
  CLEAR: LR_ERROR,L_RETCODE.
  CALL METHOD LR_PROXY->GET_SPREADSHEET_INTERFACE
    EXPORTING
      NO_FLUSH        = 'X'
    IMPORTING
      SHEET_INTERFACE = LR_SHEET
      ERROR           = LR_ERROR
      RETCODE         = L_RETCODE.
  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
    EXPORTING
      TYPE = 'E'.
"获取sheet名
*  CALL METHOD LR_SHEET->GET_SHEETS
*    EXPORTING
*      NO_FLUSH        = 'X'
*    IMPORTING
*      SHEETS          = LT_SHEETS
*      ERROR           = LR_ERROR
*      RETCODE         = L_RETCODE.
  "选择sheet
  CLEAR: LR_ERROR,L_RETCODE.
  CALL METHOD LR_SHEET->SELECT_SHEET
    EXPORTING
      NAME            = '人员信息'
      NO_FLUSH        = 'X'
    IMPORTING
      ERROR           = LR_ERROR
      RETCODE         = L_RETCODE.
  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
    EXPORTING
      TYPE = 'E'.
*执行EXCEL里的宏
*  CALL METHOD DOCUMENT->EXECUTE_MACRO
*    EXPORTING
*      g_macro = g_macro
**    SCRIPT_NAME  = 'Open_text'
**    NO_FLUSH     = ' '
*    IMPORTING
*      cl_error        = cl_errorS.
**  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
**    EXPORTING
**      TYPE = 'E'.
"<---------填数 宏
  DEFINE SET_CELL."一次选中一个单元格

    CLEAR:LT_RANGES[],LS_RANGE ,LT_CONTENTS[],LS_CONTENT.
    LS_RANGE-NAME = 'CELL'.
    LS_RANGE-ROWS = 1.
    LS_RANGE-COLUMNS = 1.
    LS_RANGE-CODE = 4.
    APPEND LS_RANGE TO LT_RANGES.

    LS_CONTENT-ROW = &1.
    LS_CONTENT-COLUMN = &2.
    LS_CONTENT-VALUE = &3.
    APPEND LS_CONTENT TO LT_CONTENTS.

   "选择插入区域
   CLEAR: LR_ERROR,L_RETCODE.
    CALL METHOD LR_SHEET->INSERT_RANGE_DIM
      EXPORTING
        NAME    = 'cell'
        LEFT    = &2
        TOP     = &1
        ROWS    = 1
        COLUMNS = 1
      IMPORTING
        ERROR           = LR_ERROR
        RETCODE         = L_RETCODE.
    CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
      EXPORTING
        TYPE = 'E'.

    "为选择区域赋值
    CLEAR: LR_ERROR,L_RETCODE.
    CALL METHOD LR_SHEET->SET_RANGES_DATA
      EXPORTING
        NO_FLUSH        = 'X'
        RANGES          = LT_RANGES[]
        CONTENTS        = LT_CONTENTS[]
      IMPORTING
        ERROR           = LR_ERROR
        RETCODE         = L_RETCODE.
    CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
      EXPORTING
        TYPE = 'E'.

  END-OF-DEFINITION.

  "循环调用宏填数据
  LOOP AT GT_PERNR INTO GW_PERNR WHERE MARK = 'X'.
    APPEND GW_PERNR TO GT_PERNR2.
    CLEAR GW_PERNR.
  ENDLOOP.
  LOOP AT GT_PERNR2 INTO GW_PERNR WHERE MARK = 'X'.
    CLEAR ROW_INDEX.
    ROW_INDEX = SY-TABIX + 1.
    SET_CELL ROW_INDEX 1 GW_PERNR-PERNR.
    SET_CELL ROW_INDEX 2 GW_PERNR-NAME1.
    SET_CELL ROW_INDEX 3 GW_PERNR-CARDTYPE.
    SET_CELL ROW_INDEX 4 GW_PERNR-CARDNUM.
    SET_CELL ROW_INDEX 5 GW_PERNR-COUNTRY.
    SET_CELL ROW_INDEX 6 GW_PERNR-SEX.
    SET_CELL ROW_INDEX 7 GW_PERNR-BIRTHDAY.
  ENDLOOP.

  "保存
  L_FILE_NAME = L_FULLPATH.
  CALL METHOD LR_PROXY->SAVE_COPY_AS
    EXPORTING
      FILE_NAME = L_FILE_NAME.
  "释放
  CALL METHOD LR_PROXY->CLOSE_DOCUMENT.
  CALL METHOD LR_PROXY->RELEASE_DOCUMENT.
  CALL METHOD LR_CONTROL->DESTROY_CONTROL.
  FREE LR_CONTROL.
  IF LR_CONTAINER IS NOT INITIAL.
    CALL METHOD LR_CONTAINER->FREE.
  ENDIF.
  FREE LR_CONTAINER .
  FREE LR_CONTROL   .
  FREE LR_ERROR     .
  FREE L_RETCODE    .
  FREE LR_PROXY     .
  FREE LR_SHEET     .
  FREE LT_SHEETS    .
ENDFORM.                    " FRM_DOWNLOAD_PERNR
*&---------------------------------------------------------------------*
*&      Form  SELECT_PATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SELECT_PATH .
  "<----选择路径
"FUNCTION:GUI_FILE_SAVE_DIALOG
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE         = '下载文件'
      FILE_FILTER          = ''
    CHANGING
      FILENAME             = L_FILENAME
      PATH                 = L_PATH
      FULLPATH             = L_FULLPATH
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.





  IF L_PATH IS INITIAL OR L_FILENAME IS INITIAL."未选择路径,则返回
    RETURN.
  ELSE.
    IF MYTAB-DYNNR = 500."重写文件名,不需要检查
*      TRANSLATE  L_FILENAME  TO UPPER CASE .
*      FIND REGEX '.DOC' IN L_FILENAME.
*      IF SY-SUBRC <> 0.
*        MESSAGE '请填写完整路径!' TYPE 'E'.
*        RETURN.
*      ENDIF.
    ELSEIF MYTAB-DYNNR = 600.
      TRANSLATE  L_FILENAME  TO UPPER CASE .
      FIND REGEX '.XLS' IN L_FILENAME.
      IF SY-SUBRC <> 0.
        MESSAGE '请填写完整路径!' TYPE 'E'.
        RETURN.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " SELECT_PATH
*&---------------------------------------------------------------------*
*&      Form  GET_DOI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DOI .
"<--------control实例和document代理
*"获取容器
*skip 1."skip 1必须,否则不能创建屏幕。
*LR_CONTAINER = CL_GUI_CONTAINER=>SCREEN0.
*PERFORM GET_CONTAINER.
"自己创建屏幕0100和容器 'CONTAINER'
  "实例化容器实例
  CREATE OBJECT LR_CONTAINER
    EXPORTING
      CONTAINER_NAME = 'CONTAINER'.

"创建container control对象实例并初始化
*PERFORM CREATE_C0NTAINER_CONTROL.
  "创建container control对象实例
  CALL METHOD C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROL
    IMPORTING
      CONTROL = LR_CONTROL.
  "initialize control
  CALL METHOD LR_CONTROL->INIT_CONTROL
    EXPORTING
      R3_APPLICATION_NAME      = 'ZTEST035'
      INPLACE_ENABLED          = 'X'
      INPLACE_SCROLL_DOCUMENTS = 'X'
      PARENT                   = LR_CONTAINER
      REGISTER_ON_CLOSE_EVENT  = 'X'
      REGISTER_ON_CUSTOM_EVENT = 'X'
      NO_FLUSH                 = 'X'
      IMPORTING
      RETCODE                  = L_RETCODE.

  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
      EXPORTING
        TYPE = 'E'.
  CLEAR:L_RETCODE,LR_ERROR.
*创建document proxy对象的实例,告诉SAP DOI 开辟一个.XLS策略
  CALL METHOD LR_CONTROL->GET_DOCUMENT_PROXY
    EXPORTING
*      DOCUMENT_FORMAT =
      DOCUMENT_TYPE   = G_DOCUMENT_TYPE
      NO_FLUSH        = 'X'
*      REGISTER_CONTAINER =
    IMPORTING
      DOCUMENT_PROXY  = LR_PROXY
      ERROR           = LR_ERROR
      RETCODE         = L_RETCODE.
  CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
    EXPORTING
      TYPE = 'E'.

ENDFORM.                    " GET_DOI
*&---------------------------------------------------------------------*
*&      Form  CHECK_MODEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM CHECK_MODEL .
"<----检查模板是否存在
  SELECT
    SINGLE RELID OBJID
    FROM WWWDATA
    INTO CORRESPONDING FIELDS OF LS_WWWDATA
    WHERE SRTF2 = 0
    AND RELID = 'MI'
    AND OBJID = P_OBJID.
  IF SY-SUBRC <> 0.
    CLEAR:L_MESSAGE.
    CONCATENATE '模板' P_OBJID '不存在!' INTO L_MESSAGE.
    MESSAGE L_MESSAGE TYPE 'E'.
  ENDIF.
ENDFORM.                    " CHECK_MODEL
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_MODEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWNLOAD_MODEL .
  "<--------下载模板并用代理代开
  REFRESH LT_MIMETAB.
  CALL FUNCTION 'SAP_OI_LOAD_MIME_DATA'
    EXPORTING
      OBJECT_ID              = P_OBJID
    IMPORTING
      DATA_SIZE              = L_LENGTH
      DOCUMENT_TYPE          = L_DOC_TYPE
      DOCUMENT_FORMAT        = L_DOC_FORMAT
    TABLES
      DATA_TABLE             = LT_MIMETAB
    EXCEPTIONS
      OBJECT_NOT_FOUND       = 1
      INTERNAL_ERROR         = 2
      OTHERS                 = 3 .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " DOWNLOAD_MODEL

 用OAOR导入模板时,

用BDS_INSTANCE->GET_INFO

BDS_INSTANCE->GET_WITH_URL

DOI_DOCUMENT->OPEN_DOCUMENT