其实带模板的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. 【ZJOI2008】树的统计(树链剖分)

    题面 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II ...

  2. zjoi网络

    map加LCT水一下就过了 # include <stdio.h> # include <stdlib.h> # include <iostream> # incl ...

  3. Frogger POJ - 2253

    题意 给你n个点,1为起点,2为终点,要求所有1到2所有路径中每条路径上最大值的最小值. 思路 不想打最短路 跑一边最小生成树,再扫一遍1到2的路径,取最大值即可 注意g++要用%f输出!!! 常数巨 ...

  4. vue-过滤器filter

    vue-过滤器filter vue的过滤器一般在JavaScript 表达式的尾部,由"|"符号指示: 过滤器可以让我们的代码更加优美,一般可以用在时间格式化,首字母大写等等. 例 ...

  5. Java 计算年龄

    public static String getAgeTxt(String birthTime,String beginTime,int level){ if(StringUtils.isBlank( ...

  6. JDK1.8源码(一)——java.lang.Object类

    本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...

  7. JavaScript中的私有成员[翻译]

    原作者:Douglas Crockford,原文地址:http://www.crockford.com/javascript/private.html JavaScript 是世界上被误解最深的编程语 ...

  8. c#事件的应用

    我已经多次使用c#事件了.举个最近的例子:我用vsto做的一个word插件.这个插件分为两层,业务逻辑层和word外接程序.有这么一个场景,我的ribbon中的一个label是动态显示的.它会随着wo ...

  9. IIS支持PHP文件解析

    打开IIS程序映射 添加模块映射 请求路径为:*.php 模块为:FastCgiModule 可执行路径选择 php-cgi.exe 名称随意写

  10. 虚拟机安装CentOS6.3及常见问题总结

    学Linux的同学大多数开始是使用的是Ubuntu或者red hat,red hat虽然安装不需要收费,但是服务是收费的,下面我就讲讲怎么用虚拟机安装CentOS6.3,其他Linux的安装可以参考这 ...