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

       其实带模板的OLE输出EXCEL就是将要输出的EXCEL中一些拥有固定值(如标题,表头行等)的单元格先填充好数据和设置好格式后作为模板上传到SAP 中。这样后续在输出EXCEL时只需从SAP中将模板下载后打开,再往相应剩下的单元格中填充数据并设置格式即可。

       相比不带模板的OLE输出EXCEL来说,因为减少了对拥有固定值单元格填充数据和设置格式的操作,更加的方便快速。

       下面给出一个简单的DEMO:

       输出目标:

         模板:

       实现步骤:

      1.上传模板 T-CODE:SMW0

      如果提示不存在MIME类型,则根据路径"设置->定义MIMELE类型"先新增MIME类型之后,再按上述顺序操作。新增MIME类型截图如下:

 

 2.实现源代码

*&---------------------------------------------------------------------*
*& Report Z15540_OLE2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z15540_OLE2.
TYPE-POOLS:OLE2.
*&---------------------------------------------------------------------*
*数据定义
*&---------------------------------------------------------------------*
DATA:BEGIN OF GS_INFO,
       NAME       TYPE C LENGTH 20,
       SEX        TYPE C LENGTH 2,
       AGE        TYPE N LENGTH 3,
       DEPARTMENT TYPE C LENGTH 20,
       GROUP      TYPE N LENGTH 6,
       RZDATE     TYPE ERSDA, "入职时间
       INDEX      TYPE I, "条目
       JLDATE     TYPE ERSDA, "工作经历时间
       COMPANY    TYPE C LENGTH 20"公司
       POSITION   TYPE C LENGTH 20"职位
       JOBCONTENT TYPE C LENGTH 20"工作内容
     END OF GS_INFO.
DATA GT_INFO LIKE TABLE OF GS_INFO.
DATA GS_HEAD LIKE GS_INFO.
DATA:V_EXCEL    TYPE OLE2_OBJECT,
     V_WORKBOOK TYPE OLE2_OBJECT,
     V_SHEET    TYPE OLE2_OBJECT,
     V_RANGE    TYPE OLE2_OBJECT,
     V_CELL     TYPE OLE2_OBJECT,
     V_FONT     TYPE OLE2_OBJECT,
     V_BORDER   TYPE OLE2_OBJECT,
     V_ROW      TYPE OLE2_OBJECT,
     V_COLUMN   TYPE OLE2_OBJECT.

DATA GV_FILE TYPE LOCALFILE."文件完整路径
*&---------------------------------------------------------------------*
*选择屏幕
*&---------------------------------------------------------------------*
PARAMETERS: P_NAME   TYPE C LENGTH 20 OBLIGATORY"姓名
            P_SEX    TYPE C LENGTH 2"性别
            P_AGE    TYPE N LENGTH 3"年龄
            P_DEPART TYPE C LENGTH 20"部门
            P_GROUP  TYPE N LENGTH 6"小组
            P_RZDATE TYPE ERSDA. "入职时间
*&---------------------------------------------------------------------*
*START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM FRM_SET_DATA.
  PERFORM FRM_EXCEL.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_DATA .

  DATA LV_INDEX TYPE CHAR4.
  DO 10 TIMES.
    LV_INDEX = SY-INDEX.
    CONDENSE LV_INDEX NO-GAPS.
    IF SY-INDEX = 1.
      "表头部分
      GS_HEAD-NAME = P_NAME.
      GS_HEAD-SEX = P_SEX.
      GS_HEAD-AGE = P_AGE.
      GS_HEAD-DEPARTMENT = P_DEPART.
      GS_HEAD-GROUP = P_GROUP.
      GS_HEAD-RZDATE = P_RZDATE.
    ENDIF.
    "主体部分
    GS_INFO-INDEX = SY-INDEX.
    GS_INFO-JLDATE = SY-DATUM.
    CONCATENATE 'COMPANY' LV_INDEX INTO GS_INFO-COMPANY.
    GS_INFO-POSITION  = '点心师'.
    GS_INFO-JOBCONTENT = '做点心'.
    APPEND GS_INFO TO GT_INFO.
    CLEAR GS_INFO.
  ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_EXCEL .
  "获取模板文件路径并下载模板
  PERFORM FRM_SET_FILE.
  "打开模板文件并填充数据
  PERFORM FRM_FILL_FILE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_FILE.
  DATA: LS_WWWDATA  TYPE WWWDATATAB,
        LS_MIME     TYPE W3MIME,
        LV_FILENAME TYPE STRING VALUE '人员信息表'"默认文件名
        LV_PATH     TYPE STRING VALUE 'C:\Users\MRJIANG\Desktop\abaptest'"默认路径
        LV_FULLPATH TYPE STRING VALUE 'C:\Users\MRJIANG\Desktop\abaptest\人员信息表'"默认完全路径
        LV_MSG      TYPE CHAR100,
        LV_SUBRC    LIKE SY-SUBRC.
  DATA LV_OBJID TYPE WWWDATATAB-OBJID VALUE 'Z15540_OLE2MB'"上传的EXCEL时设置的对象名
  "打开保存文件对话框
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE              '人员信息保存' "标题
      DEFAULT_EXTENSION         = 'xls' "文件类型
      DEFAULT_FILE_NAME         = LV_FILENAME "默认文件名
*     WITH_ENCODING             =
*     FILE_FILTER               =
*     INITIAL_DIRECTORY         =
*     PROMPT_ON_OVERWRITE       = 'X'
    CHANGING
      FILENAME                  = LV_FILENAME "传出文件名
      PATH                      = LV_PATH "传出路径
      FULLPATH                  = LV_FULLPATH "传出完全路径
*     USER_ACTION               =
*     FILE_ENCODING             =
    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 '调用文件保存对话框出错' TYPE 'E'.
  ELSE.
    "赋值文件完整路径
    GV_FILE = LV_FULLPATH.
    "检查模板是否已存在SAP中
    SELECT SINGLE *
      INTO CORRESPONDING FIELDS OF LS_WWWDATA
      FROM WWWDATA
      WHERE SRTF2 = 0
      AND RELID = 'MI'"MIME类型
      AND OBJID = LV_OBJID.
    IF SY-SUBRC NE 0.
      CONCATENATE '模板' LV_OBJID '.xls不存在' INTO LV_MSG.
      MESSAGE LV_MSG TYPE 'E'.
    ELSE."模板文件存在则下载模板

      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          KEY         = LS_WWWDATA "对象
          DESTINATION = GV_FILE "完整下载路径
        IMPORTING
          RC          = LV_SUBRC
*       CHANGING
*         TEMP        = TEMP
        .
      IF LV_SUBRC NE 0.
        CONCATENATE '模板' LV_OBJID '.xls下载失败' INTO LV_MSG.
        MESSAGE LV_MSG TYPE 'E'.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_FILL_FILE .
  "创建EXCEL对象
  CREATE OBJECT V_EXCEL 'EXCEL.APPLICATION'.
  "设置前台显示
  SET PROPERTY OF V_EXCEL 'VISIBLE' = 1.
  "创建工作区对象
  CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_WORKBOOK.
  "打开模板文件
  CALL METHOD OF V_WORKBOOK 'OPEN'
    EXPORTING
      #1 = GV_FILE.
  "获取当前活动SHEET
  GET PROPERTY OF V_EXCEL 'ACTIVESHEET' = V_SHEET.
  "填充表头数据
  PERFORM FRM_HEADER.
  "填充主体部分(工作经历)
  PERFORM FRM_BODY.
  "自动优化列宽
  PERFORM FRM_COL_OPT.
  "保存文件
  PERFORM FRM_SAVE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HEADER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_HEADER .
  PERFORM FRM_CELL USING3 2 GS_HEAD-NAME       12 1,"行号 列号 单元格值 字体大小 字体颜色
                          3 4 GS_HEAD-SEX        12 1,
                          3 6 GS_HEAD-AGE        12 1,
                          4 2 GS_HEAD-DEPARTMENT 12 1,
                          4 4 GS_HEAD-GROUP      12 1,
                          4 6 GS_HEAD-RZDATE     12 1.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CELL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_3
*&      --> P_2
*&      --> GS_HEAD_NAME
*&---------------------------------------------------------------------*
FORM FRM_CELL  USING   P_ROW
                        P_COL
                        P_VALUE
                        P_SIZE
                        P_FCOLOR "字体颜色
                        .
  "创建单元格对象
  CALL METHOD OF V_EXCEL 'CELLS' = V_CELL
  EXPORTING
    #1 = P_ROW
    #2 = P_COL.
  SET PROPERTY OF V_CELL 'VALUE' = P_VALUE.
  CALL METHOD OF V_CELL 'FONT' = V_FONT.
  SET PROPERTY OF V_FONT 'SIZE' = P_SIZE.
  SET PROPERTY OF V_FONT 'COLORINDEX' = P_FCOLOR.
  "用完释放对象
  FREE OBJECT V_CELL.
  FREE OBJECT V_FONT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BODY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_BODY .
  DATA LV_ROW TYPE CHAR4.
  DATA: LV_ZS TYPE CHAR5,
        LV_YX TYPE CHAR5.
  DATA LV_COUNT TYPE I VALUE 6.
  FIELD-SYMBOLS <FS_FIELD>.

  LOOP AT GT_INFO INTO GS_INFO.
    LV_ROW = SY-TABIX + 6."6为表头部分所占行数
    IF SY-TABIX = 1.
      "先设置第7行的格式
      CONCATENATE 'E' LV_ROW INTO LV_ZS.
      CONCATENATE 'F' LV_ROW INTO LV_YX.
      CONDENSE LV_ZS NO-GAPS.
      CONDENSE LV_YX NO-GAPS.
      PERFORM FRM_RANGE USING LV_ZS LV_YX 1 -4108."合并第7行的第5列第6列 E7-F7
      CLEAR :LV_ZS,LV_YX.
      CONCATENATE 'A' LV_ROW INTO LV_ZS.
      CONCATENATE 'F' LV_ROW INTO LV_YX.
      CONDENSE LV_ZS NO-GAPS.
      CONDENSE LV_YX NO-GAPS.
      PERFORM FRM_BORDER USING LV_ZS LV_YX 1 2 1."左上列号 右下列号 边框格式 边框粗细 边框颜色 A7-F7
    ELSE.
      "填充剩余行
      PERFORM FRM_COPY USING LV_ROW."复制第7行的格式
    ENDIF.
    DO 5 TIMES.
      LV_COUNT = LV_COUNT + 1."因为定义的GS_INFO前6个字段是表头部分的  所以从第7个字段开始赋值
      ASSIGN COMPONENT LV_COUNT OF STRUCTURE GS_INFO TO <FS_FIELD>.
      PERFORM FRM_CELL USING LV_ROW SY-INDEX <FS_FIELD> 11 1.
    ENDDO.
    LV_COUNT 6.
    CLEAR GS_INFO.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_RANGE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_RANGE USING  P_ZS TYPE CHAR5"左上列号
                       P_YX TYPE CHAR5 "右下列号
                       P_MERGE
                       P_ALIGNMENT.
  "创建范围对象
  CALL METHOD OF V_EXCEL 'RANGE' = V_RANGE
  EXPORTING
    #1 = P_ZS
    #2 = P_YX.
  "选中范围
  CALL METHOD OF V_RANGE 'SELECT'.
  "合并
  SET PROPERTY OF V_RANGE 'MERGECELLS' = P_MERGE.
  "居中
  SET PROPERTY OF V_RANGE 'HORIZONTALALIGNMENT' = P_ALIGNMENT.
  FREE OBJECT V_RANGE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BORDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_1
*&      --> P_6
*&      --> P_1
*&      --> P_2
*&      --> P_1
*&---------------------------------------------------------------------*
FORM FRM_BORDER  USING    P_ZS TYPE CHAR5
                           P_YX TYPE CHAR5
                           P_LINE
                           P_WEIGHT
                           P_LCOLOR .
  "创建范围对象
  CALL METHOD OF V_EXCEL 'RANGE' = V_RANGE
  EXPORTING
    #1 = P_ZS
    #2 = P_YX.
  "填充边框
  DO 4 TIMES.
    CALL METHOD OF V_RANGE 'BORDERS' = V_BORDER
    EXPORTING
      #1 = SY-INDEX.
    SET PROPERTY OF V_BORDER 'LINESTYLE' = 1."格式
    SET PROPERTY OF V_BORDER 'WEIGHT' = 2."粗细 最粗为4
    SET PROPERTY OF V_BORDER 'COLORINDEX' = 1."黑色
  ENDDO.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_COPY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_COPY USING P_ROW."当前正在填充数据的行号
  "创建第7行整行对象
  CALL METHOD OF V_SHEET 'ROWS' = V_ROW
  EXPORTING
    #1 = 7.
  CALL METHOD OF V_ROW 'SELECT'.
  "复制整行到剪贴板
  CALL METHOD OF V_ROW 'COPY'.
  FREE OBJECT V_ROW.
  "创建当前行的整行对象
  CALL METHOD OF V_SHEET 'ROWS' = V_ROW
  EXPORTING
    #1 = P_ROW.
  CALL METHOD OF V_ROW 'SELECT'.
  "在当前行中执行粘贴操作
  CALL METHOD OF V_ROW 'INSERT'.
  "清空当前行的内容
  CALL METHOD OF V_ROW 'CLEARCONTENTS'.

  FREE OBJECT V_ROW.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SAVE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SAVE .
  "获取当前活动的工作区
  GET PROPERTY OF V_EXCEL 'ACTIVEWORKBOOK' = V_WORKBOOK.
  "保存
  CALL METHOD OF V_WORKBOOK 'SAVE'.
  FREE OBJECT V_EXCEL.
  FREE OBJECT V_WORKBOOK.
  FREE OBJECT V_SHEET.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_COL_OPT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_COL_OPT .
  "创建列对象
  CALL METHOD OF V_EXCEL 'COLUMNS' = V_COLUMN.
  "列自动优化
  CALL METHOD OF V_COLUMN 'AUTOFIT'.
ENDFORM. 

 

posted on 2018-04-02 21:11  喜欢奶牛的MZ  阅读(1324)  评论(0编辑  收藏  举报

导航