• ABAP DOI 下载SMW0的EXCEL和WORD模板


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

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

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

    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

  • 相关阅读:
    编译Excel遇到的DialogBoxW宏的实参不足问题
    C# 简单连接数据库并执行SQL查询语句
    AutoCAD VBA 遍历所有对象
    VBA: 错误消息:"类未注册"插入用户窗体
    解决Qt程序发布时中文乱码问题
    Qt操作excel
    HWND_BROADCAST的一个用法——修改环境变量,立即通知系统
    VC环境使用XML解析器(TinyXML)编程
    C++ XML解析之TinyXML篇(转载)
    C/C++枚举目录中的文件或文件夹
  • 原文地址:https://www.cnblogs.com/CtrlS/p/10221723.html
Copyright © 2020-2023  润新知