其实带模板的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. [BZOJ2654] tree (kruskal & 二分答案)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  2. js实现简单的轮播效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)

    前言 小伙伴们, 大家好,我是Rector. 最近Rector忙于换工作,没有太多时间来更新我们的ASP.NET MVC 5系列文章 [一步一步创建ASP.NET MVC5程序Repository+A ...

  4. Python魔法方法(转发整合)

    如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. __new__: 是一个对象实例化时调用的第一 ...

  5. Global.asax 中校验Session

    Application 相关的 Application_Init:在每一个HttpApplication实例初始化的时候执行. Application_Disposed:在每一个HttpApplica ...

  6. html学习第一弹の常用标签的归类

    HTML初步学习: 行内元素:只占据他对应标签的边框所包含的空间,默认横向排布. 块级元素:块级元素占据其父元素(容器)的整个空间,因此创建了一个块,通常浏览器会在块级元素前后另起一行,默认竖向排布. ...

  7. 设计模式——代理模式(C++实现)

    #include <iostream> #include <string> using namespace std; class CSubject { public: ; }; ...

  8. Numpy库的下载及安装(吐血总结)

    Python很火,我也下了个来耍耍一阵子.可是渐渐地,我已经不满足于它的基本库了,我把目光转到了Numpy~~~~~ 然而想法总是比现实容易,因为我之前下的是Python3.3.x,所有没有自带pip ...

  9. 用于 SELECT 和 WHERE 子句的函数

    一个 SQL 语句中的 select_expression 或 where_definition 可由任何使用了下面所描述函数的表达式组成. 包含 NULL 的表达式总是得出一个 NULL 值结果,除 ...

  10. 【.NetCore】基于jenkins以及gitlab的持续编译及发布

    前沿 其实本来是想把标题叫做持续集成的,只是后来看看研究出的内容,就只有发布这一个动作,自动化测试等内容也未涉及到,所以改名叫持续编译及发布应该更加贴切吧? 问题背景 其实目前我们传统方式上的发布方式 ...