其实带模板的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 ,
       SEX        TYPE C LENGTH ,
       AGE        TYPE N LENGTH ,
       DEPARTMENT TYPE C LENGTH ,
       GROUP      TYPE N LENGTH ,
       RZDATE     TYPE ERSDA, "入职时间
       INDEX      TYPE I, "条目
       JLDATE     TYPE ERSDA, "工作经历时间
       COMPANY    TYPE C LENGTH , "公司
       POSITION   TYPE C LENGTH , "职位
       JOBCONTENT TYPE C LENGTH , "工作内容
     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  OBLIGATORY, "姓名
            P_SEX    TYPE C LENGTH , "性别
            P_AGE    TYPE N LENGTH , "年龄
            P_DEPART TYPE C LENGTH , "部门
            P_GROUP  TYPE N LENGTH , "小组
            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  TIMES.
    LV_INDEX = SY-INDEX.
    CONDENSE LV_INDEX NO-GAPS.
    IF SY-INDEX = .
      "表头部分
      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                = 
      ERROR_NO_GUI              = 
      NOT_SUPPORTED_BY_GUI      = 
      INVALID_DEFAULT_FILE_NAME = 
      OTHERS                    = .
  IF SY-SUBRC <> .
    MESSAGE '调用文件保存对话框出错' TYPE 'E'.
  ELSE.
    "赋值文件完整路径
    GV_FILE = LV_FULLPATH.
    "检查模板是否已存在SAP中
    SELECT SINGLE *
      INTO CORRESPONDING FIELDS OF LS_WWWDATA
      FROM WWWDATA
      WHERE SRTF2 = 
      AND RELID = 'MI'"MIME类型
      AND OBJID = LV_OBJID.
    IF SY-SUBRC NE .
      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 .
        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' = .
  "创建工作区对象
  CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_WORKBOOK.
  "打开模板文件
  CALL METHOD OF V_WORKBOOK 'OPEN'
    EXPORTING
      # = 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 USING:   GS_HEAD-NAME        ,"行号 列号 单元格值 字体大小 字体颜色
                            GS_HEAD-SEX         ,
                            GS_HEAD-AGE         ,
                            GS_HEAD-DEPARTMENT  ,
                            GS_HEAD-GROUP       ,
                            GS_HEAD-RZDATE      .
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
    # = P_ROW
    # = 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 .
  FIELD-SYMBOLS <FS_FIELD>.   LOOP AT GT_INFO INTO GS_INFO.
    LV_ROW = SY-TABIX + ."6为表头部分所占行数
    IF SY-TABIX = .
      "先设置第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  -."合并第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   ."左上列号 右下列号 边框格式 边框粗细 边框颜色 A7-F7
    ELSE.
      "填充剩余行
      PERFORM FRM_COPY USING LV_ROW."复制第7行的格式
    ENDIF.
    DO  TIMES.
      LV_COUNT = LV_COUNT + ."因为定义的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>  .
    ENDDO.
    LV_COUNT = .
    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
    # = P_ZS
    # = 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
    # = P_ZS
    # = P_YX.
  "填充边框
  DO  TIMES.
    CALL METHOD OF V_RANGE 'BORDERS' = V_BORDER
    EXPORTING
      # = SY-INDEX.
    SET PROPERTY OF V_BORDER 'LINESTYLE' = ."格式
    SET PROPERTY OF V_BORDER 'WEIGHT' = ."粗细 最粗为4
    SET PROPERTY OF V_BORDER 'COLORINDEX' = ."黑色
  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
    # = .
  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
    # = 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.

(原创)带模板的OLE输出EXCEL的更多相关文章

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

    目前我已知的EXCEL输出方式有3种: 1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出). 2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一 ...

  2. 2018年,请不要再使用OLE生成EXCEL文件

    输出EXCEL文件是ABAP开发工作中的常见需求,为了学习相关技术,我翻译过一篇文章:使用OLE2对象创建EXCEL文件,并且一度乐在其中. 最近几个月,经过与若干EXCEL打印程序的艰苦斗争,以及对 ...

  3. java动态生成带下拉框的Excel导入模板

    在实际开发中,由于业务需要,常常需要进行Excel导入导出操作.以前做一些简单的导入时,先准备一个模板,再进行导入,单有十几. 二十几个导入模板时,往往要做十几.二十几个模板.而且,当在模板中需要有下 ...

  4. 通过zabbix自带模板监控windowsPC机器

       通过zabbix自带模板监控windowsPC机器   作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.       欢迎加入:高级运维工程师之路 598432640 相信有很多 ...

  5. springmvc+mybatis下载项目自带模板

    1.首先如果要获取javaweb项目中的文件在哪,用到的代码:request.getSession().getServletContext().getRealPath("/WEB-INF/d ...

  6. xBIM IFC 输出 Excel 报表

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  7. Zabbix Server 自带模板监控更加灵活MySQL数据库

    Zabbix Server 自带模板监控更加灵活MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.zabbix-agent端配置 1>.修改zabbix的 ...

  8. Zabbix Server 自带模板监控有密码MySQL数据库

    Zabbix Server 自带模板监控有密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Zabbix-agent端的配置 1>.为数据库设置密码 ...

  9. Zabbix Server 自带模板监控无密码MySQL数据库

    Zabbix Server 自带模板监控无密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装MariaDB 1>.安装MariaDB  [root ...

随机推荐

  1. JavaScript之中级教程关键

    Date() setTime()getTime()toUpperCase() toLowerCase() charAt() 返回指定的字符,返回的字符长度为1的字符串. indexOf('需要检索的字 ...

  2. THUWC2018滚粗记

    THUWC2018滚粗记 前言 又是一篇滚粗记, 不过可能还要写过很多很多篇滚粗记, 才会有一篇不是滚粗记的东西啦 总而言之,我现在还是太菜了 还要过一大段时间我才会变强啦 Day -inf 联赛考完 ...

  3. 【Luogu1273】有线电视网(动态规划)

    [Luogu1273]有线电视网(动态规划) 题面 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端, ...

  4. [BZOJ3110] [Zjoi2013] K大数查询 (树套树)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...

  5. 微信小程序之换肤的功能

    pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...

  6. 4.2 js没有块级作用域

    JavaScript没有块级作用域.在其他语言上,比如C语言中,有花括号封闭的代码块都有自己的作用域,(如果用ECMAScript的话来讲,就是他们自己的执行环境),因而支持根据条件来定义变量.例如, ...

  7. FPGA加三移位算法:硬件逻辑实现二进制转BCD码

    本文设计方式采用明德扬至简设计法.利用FPGA来完成显示功能不是个很理想的方式,当显示任务比较复杂,要通过各种算法显示波形或者特定图形时,当然要用单片机通过C语言完成这类流程控制复杂,又对时序要求不高 ...

  8. Hive数据仓库笔记(二)

    分区和桶:   分区:可以提高查询的效率,只扫描固定范围数据,不用全部扫描 CREATE TABLE logs (ts BIGINT, lineSTRING) PARTITIONED BY (dt S ...

  9. 案例:中科院光机所应用大数据可视化工具-LightningChart | 见证高性能图表

    中国科学院上海光学精密机械研究所 中国现代光学和激光科学领域领先研究所 中国科学院上海光学精密机械研究所(简称中科院上海光机所)是我国建立最早.规模最大的激光专业研究所,成立于1964年,现已发展成为 ...

  10. JAVA的18条BASE

    关于Java的基础知识,实践证明学习OO,最终领悟“父类控制流程,子类实现具体的业务逻辑”的OO思想,需要的不是智商而是基础,也就是说,基础越好越快领悟,所以请每位S1学习Java的学员请牢记以下Ja ...