(原创)带模板的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 ,
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的更多相关文章
- (原创)不带模板的OLE输出EXCEL
		
目前我已知的EXCEL输出方式有3种: 1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出). 2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一 ...
 - 2018年,请不要再使用OLE生成EXCEL文件
		
输出EXCEL文件是ABAP开发工作中的常见需求,为了学习相关技术,我翻译过一篇文章:使用OLE2对象创建EXCEL文件,并且一度乐在其中. 最近几个月,经过与若干EXCEL打印程序的艰苦斗争,以及对 ...
 - java动态生成带下拉框的Excel导入模板
		
在实际开发中,由于业务需要,常常需要进行Excel导入导出操作.以前做一些简单的导入时,先准备一个模板,再进行导入,单有十几. 二十几个导入模板时,往往要做十几.二十几个模板.而且,当在模板中需要有下 ...
 - 通过zabbix自带模板监控windowsPC机器
		
通过zabbix自带模板监控windowsPC机器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:高级运维工程师之路 598432640 相信有很多 ...
 - springmvc+mybatis下载项目自带模板
		
1.首先如果要获取javaweb项目中的文件在哪,用到的代码:request.getSession().getServletContext().getRealPath("/WEB-INF/d ...
 - xBIM IFC 输出 Excel 报表
		
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
 - Zabbix Server 自带模板监控更加灵活MySQL数据库
		
Zabbix Server 自带模板监控更加灵活MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix-agent端配置 1>.修改zabbix的 ...
 - Zabbix Server 自带模板监控有密码MySQL数据库
		
Zabbix Server 自带模板监控有密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Zabbix-agent端的配置 1>.为数据库设置密码 ...
 - Zabbix Server 自带模板监控无密码MySQL数据库
		
Zabbix Server 自带模板监控无密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装MariaDB 1>.安装MariaDB [root ...
 
随机推荐
- [JZOJ5511] 送你一个DAG
			
题目描述: 给出一个 \(n\) 个点 \(m\) 条边的 \(DAG\) 和参数 \(k\). 定义一条经过 \(l\) 条边的路径的权值为 \(l^k\). 对于 \(i = 1-n\), 求出所 ...
 - Micropython Turnipbit  换挡风扇 旋转按钮控制直流电机转速
			
学过物理学的我们都知道换挡风扇的原理,一般按钮控制电感分压或者电容分压,以达到控制电流的目的.那么我们可不可以使用Turnipbit模拟这个系统呢?其实是很简单的.类似于之前用Tpyboard做的智能 ...
 - Servlet 过滤器、拦截器、监听器以及文件上传下载
			
在学习之初,总是对过滤器.拦截器.监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户 ...
 - 误操作导致 lvdisplay 命令不存在解决
			
1.lvdisplay 命令不存在 查看lvm2 包被卸载2.执行 yum install lvm2 命令 发现 yum 被锁 3.删除yum.lock 发现/ 目录只读4.mount -o remo ...
 - Handsontable的前端分页与数据库分页
			
Handsontable虽然处理速度很快,但当数据量达到10W+的时候很容易导致浏览器内存泄漏,这时候可以用分页来解决.官网提供了前端分页demo,测试后发现也只能处理低于10W的数据,而且调试的时候 ...
 - C++对一组pair数据进行排序(sort函数的使用)
			
最近在写一个算法的时候,把一些数据存在了pair中,并且需要根据pair中first或者second的值对这些数据进行排序.比如:输入数据(1,2).(4,2).(3,3).(2,1)根据first的 ...
 - 一个类似抖音 APP 拍摄按钮效果的控件
			
TouchButton 一个类似抖音 APP 拍摄按钮效果的控件 效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+i ...
 - VMware静态地址上网
			
虚拟机通过dhcp获取ip,当系统重启时可能导致ip变更,出现不必要的麻烦,以下是通过nat模式设置虚拟机静态ip同时能够上网的方式. 编辑VMware,依次点击“编辑”--“虚拟网络编辑器” 注:为 ...
 - equals和hashCode详解
			
equals和hashCode详解 http://www.cnblogs.com/Qian123/p/5703507.html
 - phpStorm安装方法
			
1)下载 http://big2.h5gamen.com/soft/jetbrainscrack-2.6.2.zip 放到phpstorm安装目录下的lib文件夹 如放到f盘 F:\PhpStorm ...