(原创)不带模板的OLE输出EXCEL
目前作者已知的EXCEL输出方式有3种:
1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出)。
2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一个个单元格去操作来完成的,所以速度很慢,在下面的DEMO中,202行6列的数据输出需要用时2分钟左右)。
3.DOI输出(可以嵌入屏幕容器中直接输出EXCEL,且所有方法封装在类中,编写起来更加简单)。
个人感觉OLE的学习最好方式是设置EXCEL输出为前端显示模式,然后一句句弄懂每句OLE语句的意义,知道每一个OLE语句等同于在EXCEL中做了什么样的操作。
例如你写完
CREATE OBJECT V_EXCEL 'EXCEL.APPLICATION'.
SET PROPERTY OF V_EXCEL 'VISIBLE' = .
你知道此时执行是打开了EXCEL应用,但是其中没有任何工作页,如下图:

当你在加上OLE语句
* "新建一个工作区WORKBOOK
CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_BOOK.
CALL METHOD OF V_BOOK 'ADD'.
你知道此时创建了一个工作区,其中自动插入了一个工作页,且其为激活状态,如下图:

当你像这样一句句的做完一个DEMO之后,相信你应该能熟练应用OLE来输出EXCEL。
下面给出一个OLE的简单DEMO程序:
输出目标:

源程序:
主程序:Z15540_OLE1
*&---------------------------------------------------------------------*
*& Report Z15540_0LE1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z15540_OLE1. INCLUDE Z15540_OLE1_TOP.
INCLUDE Z15540_OLE1_F01. START-OF-SELECTION.
PERFORM FRM_GET_DATA. END-OF-SELECTION.
IF GT_ALV IS NOT INITIAL.
PERFORM FRM_SET_LAYOUT.
PERFORM FRM_FILL_FIELD.
PERFORM FRM_DISPLAY_ALV.
ENDIF. 包含程序:Z15540_OLE1_TOP
*&---------------------------------------------------------------------*
*& 包含 Z15540_0LE1_TOP
*&---------------------------------------------------------------------*
TABLES:MARD,MARA,MAKT.
TYPE-POOLS:SLIS,OLE2.
DATA:BEGIN OF GS_ALV,
MATNR TYPE MARD-MATNR,
WERKS TYPE MARD-WERKS,
LGORT TYPE MARD-LGORT,
LABST TYPE MARD-LABST,
MEINS TYPE MARA-MEINS,
MAKTX TYPE MAKT-MAKTX,
END OF GS_ALV.
DATA GT_ALV LIKE TABLE OF GS_ALV. DATA:GS_LAYOUT TYPE LVC_S_LAYO,
GS_FCAT TYPE LVC_S_FCAT,
GT_FCAT TYPE LVC_T_FCAT. DATA:V_EXCEL TYPE OLE2_OBJECT,
V_BOOK TYPE OLE2_OBJECT,
V_SHEET TYPE OLE2_OBJECT,
V_RANGE TYPE OLE2_OBJECT,
V_CELL TYPE OLE2_OBJECT,
V_FONT TYPE OLE2_OBJECT,
V_COLOR TYPE OLE2_OBJECT,
V_BORDER TYPE OLE2_OBJECT,
V_COLUMN TYPE OLE2_OBJECT. DATA GV_FILENAME TYPE STRING."文件路径 SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-.
SELECT-OPTIONS:S_WERKS FOR MARD-WERKS,
S_LGORT FOR MARD-LGORT,
S_MATNR FOR MARD-MATNR.
SELECTION-SCREEN END OF BLOCK BLK1. 包含程序:Z15540_OLE1_F01
*&---------------------------------------------------------------------*
*& 包含 Z15540_0LE1_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT D~MATNR,
D~WERKS,
D~LGORT,
D~LABST,
A~MEINS,
T~MAKTX
INTO TABLE @GT_ALV UP TO ROWS
FROM MARD AS D INNER JOIN MARA AS A
ON D~MATNR = A~MATNR
LEFT OUTER JOIN MAKT AS T
ON D~MATNR = T~MATNR
WHERE D~WERKS IN @S_WERKS
AND D~LGORT IN @S_LGORT
AND D~MATNR IN @S_MATNR
AND T~SPRAS = @SY-LANGU.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = I_BYPASSING_BUFFER
* I_BUFFER_ACTIVE = I_BUFFER_ACTIVE
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME = I_STRUCTURE_NAME
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE = I_GRID_TITLE
* I_GRID_SETTINGS = I_GRID_SETTINGS
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FCAT
* IT_EXCLUDING = IT_EXCLUDING
* IT_SPECIAL_GROUPS_LVC = IT_SPECIAL_GROUPS_LVC
* IT_SORT_LVC = IT_SORT_LVC
* IT_FILTER_LVC = IT_FILTER_LVC
* IT_HYPERLINK = IT_HYPERLINK
* IS_SEL_HIDE = IS_SEL_HIDE
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT = IS_VARIANT
* IT_EVENTS = IT_EVENTS
* IT_EVENT_EXIT = IT_EVENT_EXIT
* IS_PRINT_LVC = IS_PRINT_LVC
* IS_REPREP_ID_LVC = IS_REPREP_ID_LVC
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = I_HTML_HEIGHT_TOP
* I_HTML_HEIGHT_END = I_HTML_HEIGHT_END
* IT_ALV_GRAPHICS = IT_ALV_GRAPHICS
* IT_EXCEPT_QINFO_LVC = IT_EXCEPT_QINFO_LVC
* IR_SALV_FULLSCREEN_ADAPTER = IR_SALV_FULLSCREEN_ADAPTER
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER = E_EXIT_CAUSED_BY_CALLER
* ES_EXIT_CAUSED_BY_USER = ES_EXIT_CAUSED_BY_USER
TABLES
T_OUTTAB = GT_ALV
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF SY-SUBRC <> .
* Implement suitable error handling here
ENDIF. ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
CLEAR GS_LAYOUT.
GS_LAYOUT-ZEBRA = 'X'.
GS_LAYOUT-COL_OPT = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_FILL_FIELD .
PERFORM FRM_FILLFIELD USING: 'MATNR' '物料号',
'MAKTX' '物料描述',
'WERKS' '工厂',
'LGORT' '仓库',
'LABST' '非限制使用库存',
'MEINS' '数量单位'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILLFIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> P_
*&---------------------------------------------------------------------*
FORM FRM_FILLFIELD USING P_FIELDNAME TYPE LVC_FNAME
P_COLTEXT TYPE LVC_TXTCOL.
CLEAR GS_FCAT.
GS_FCAT-FIELDNAME = P_FIELDNAME.
GS_FCAT-COLTEXT = P_COLTEXT.
IF P_FIELDNAME = 'LABST'.
GS_FCAT-QFIELDNAME = 'MEINS'.
ENDIF.
APPEND GS_FCAT TO GT_FCAT.
ENDFORM.
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD'.
ENDFORM.
FORM USER_COMMAND USING UCOMM LIKE SY-UCOMM "UCOMM获取返回的功能码
SELFIELD TYPE SLIS_SELFIELD."SELFIELD获取返回的行数据
CASE UCOMM.
WHEN 'EXCEL'. "点击保存,
PERFORM FRM_EXCEL.
ENDCASE.
ENDFORM. "USER_COMMAND
*&-------------------------------------------------------------------
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_EXCEL .
PERFORM FRM_FILE.
"创建EXCEL对象
CREATE OBJECT V_EXCEL 'EXCEL.APPLICATION'.
"设置EXCEL前台显示
SET PROPERTY OF V_EXCEL 'VISIBLE' = .
* "新建一个工作页WORKBOOK
CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_BOOK.
CALL METHOD OF V_BOOK 'ADD'.
"获取当前SHEET页
GET PROPERTY OF V_EXCEL 'ACTIVESHEET' = V_SHEET.
"选中SHEET页
CALL METHOD OF V_SHEET 'SELECT'.
"更改当前SHEET页 名称
SET PROPERTY OF V_SHEET 'NAME' = '可用库存量清单SHEET1'. "填充标题和表头行
PERFORM FRM_HEADER.
"填充主体部分
PERFORM FRM_BODY.
"设置列宽自动优化(在数据填充完后调用)
CALL METHOD OF V_EXCEL 'COLUMNS' = V_COLUMN.
CALL METHOD OF V_COLUMN 'AUTOFIT'.
"保存EXCEL
PERFORM FRM_SAVE. ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CELL
*&---------------------------------------------------------------------*
*& text *&-------------------------------------------*& --> P_1
*& --> P_
*& --> P_2
*&---------------------------------------------------------------------*
FORM FRM_CELL USING P_ROW "行号
P_COL "列号
P_VALUE "值
P_BOLD "加粗
P_SIZE "字体大小
P_UNDERLINE "下划线
P_FCOLOR "字体颜色
P_COLOR."背景颜色
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 'BOLD' = P_BOLD."加粗
SET PROPERTY OF V_FONT 'SIZE' = P_SIZE."字体大小
SET PROPERTY OF V_FONT 'UNDERLINE' = P_UNDERLINE."下划线
SET PROPERTY OF V_FONT 'COLORINDEX' = P_FCOLOR."字体颜色
"生成背景颜色对象
CALL METHOD OF V_CELL 'INTERIOR' = V_COLOR.
SET PROPERTY OF V_COLOR 'COLORINDEX' = P_COLOR."背景颜色
FREE OBJECT V_CELL."用完对象后释放 ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SAVE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*&---------------------------------------------------------------------*
FORM FRM_SAVE .
CALL METHOD OF V_SHEET 'SAVEAS'
EXPORTING
# = GV_FILENAME
# = .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HEADER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text *&------------------------------------------------------------------FORM FRM_HEADER .
"标题
PERFORM FRM_CELL USING '可用库存量清单' ."行号 列号 值 加粗 字体大小 下划线 字体颜色(红) 背景颜色(蓝)
PERFORM FRM_RANGE USING '' '' - ."左上角列号 右下角列号 合并 居中 边框格式 边框格式 边框粗细 边框颜色
"表头行
PERFORM FRM_CELL USING: '工厂' ,"行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
'库存地点' ,
'物料号' ,
'物料描述' ,
'可用非限制库存' ,
'单位' .
PERFORM FRM_RANGE USING '' '' - ."左上角列号 右下角列号 合并 居中 边框格式 边框格式 边框粗细 边框颜色
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_RANGE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_RANGE USING P_ZS TYPE CHAR5"左上角列号
P_YX TYPE CHAR5"右下角列号
P_MERGECELLS "合并
P_ALIGNMENT "居中
P_LINESTYLE "边框格式
P_WEIGHT "边框粗细
P_BCOLOR."边框颜色
CONCATENATE 'A' P_ZS INTO P_ZS.
CONCATENATE 'F' P_YX INTO P_YX.
CONDENSE P_ZS NO-GAPS.
CONDENSE P_YX NO-GAPS.
"创建RANGE对象
CALL METHOD OF V_EXCEL 'RANGE' = V_RANGE
EXPORTING
# = P_ZS
# = P_YX.
"选中RANGE
CALL METHOD OF V_RANGE 'SELECT'.
SET PROPERTY OF V_RANGE 'MERGECELLS' = P_MERGECELLS."0不合并 1合并
SET PROPERTY OF V_RANGE 'HORIZONTALALIGNMENT' = P_ALIGNMENT."居中 DO TIMES.
"创建BORDER对象
CALL METHOD OF V_RANGE 'BORDERS' = V_BORDER EXPORTING # = SY-INDEX.
"设置线条格式,粗细,颜色
SET PROPERTY OF V_BORDER 'LINESTYLE' = P_LINESTYLE.
SET PROPERTY OF V_BORDER 'WEIGHT' = P_WEIGHT.
SET PROPERTY OF V_BORDER 'COLORINDEX' = P_BCOLOR.
ENDDO.
"用完释放对象
FREE OBJECT V_RANGE.
FREE OBJECT V_BORDER.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BODY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_BODY .
DATA LV_ZS TYPE CHAR5."左上
DATA LV_YX TYPE CHAR5."右下
DATA LV_LINE TYPE I."输出内表总行数
DATA LV_CURRENT TYPE I."当前填充的行号
DESCRIBE TABLE GT_ALV LINES LV_LINE.
LV_ZS = ."3 = 2(标题和表头行共计2行) + 1.
LV_YX = + LV_LINE."标题+表头+主体
CONDENSE LV_YX NO-GAPS."去除空格
"填充数据
LOOP AT GT_ALV INTO GS_ALV.
LV_CURRENT = SY-TABIX + ."从第3行开始填充主体数据
"每行需填充6列的数据
PERFORM FRM_CELL USING: LV_CURRENT GS_ALV-WERKS ,"行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
LV_CURRENT GS_ALV-LGORT ,"行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
LV_CURRENT GS_ALV-MATNR ,"行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
LV_CURRENT GS_ALV-MAKTX ,"行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
LV_CURRENT GS_ALV-LABST ,"行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
LV_CURRENT GS_ALV-MEINS ."行号 列号 值 加粗 字体大小 下划线 字体颜色(黑) 背景颜色(白)
CLEAR GS_ALV.
ENDLOOP.
"加边框
PERFORM FRM_RANGE USING LV_ZS LV_YX - ."左上角列号 右下角列号 合并 居中 边框格式 边框格式 边框粗细 边框颜色
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_FILE .
*获取文件名
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = '可用库存清单' "默认文件名
* DEF_PATH = ' '
MASK = ',EXCEL,*.XLS.' "文件类型
MODE = 'S' "S保存 O打开
TITLE = 'EXCEL保存' "弹出对话框标题
IMPORTING
FILENAME = GV_FILENAME "输出的文件路径
* RC = RC
EXCEPTIONS
INV_WINSYS =
NO_BATCH =
SELECTION_CANCEL =
SELECTION_ERROR = .
ENDFORM.
(原创)不带模板的OLE输出EXCEL的更多相关文章
- (原创)带模板的OLE输出EXCEL
其实带模板的OLE输出EXCEL就是将要输出的EXCEL中一些拥有固定值(如标题,表头行等)的单元格先填充好数据和设置好格式后作为模板上传到SAP 中.这样后续在输出EXCEL时只需从SAP中将模板下 ...
- 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 ...
随机推荐
- 【BZOJ1834】网络扩容(最大流,费用流)
[BZOJ1834]网络扩容(最大流,费用流) 题面 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下 ...
- webpack3中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
1.在webpack中需要处理css必须先安装如下两个loader npm install --save-dev css-loader style-loader 2.要处理sass和添加浏览器前缀需要 ...
- 魔改版ss-panel v3前端配置文件
配置文件所在目录:网站根目录/config/.config.php <?php // ss-panel v3 配置 // // !!! 修改此key为随机字符串确保网站安全 !!! $Syste ...
- 读书笔记-浅析Java运行时数据区
作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...
- Google Maps API的使用
之前在学习了简单的API调用后,查看了几个知名网站的API调用方法,发现Google的API调用还是相对比较简单的.下面就从API key的获取.googlemaps的安装,再到实际使用做一下说明. ...
- opencv3.4+vs2015+win10安装过程问题解决
在使用cmake configure生成vs的工程文件时,有几个第三方的库和文件会频繁下载不成功,分别是: ffmpeg_version.cmake opencv_ffmpeg.dll opencv_ ...
- 消息队列的使用 RabbitMQ
RabbitMQ 是一款开源且比较流行的消息中间件.但用起来还是比较麻烦,有人封装了一层, 这就是 EasyNetQ . 一.安装 1.安装 Erlang: http://www.erlang.org ...
- Python3 多线程编程(thread、threading模块)
threading是对thread的封装. 1.开启线程: t=threading.Thread(target=sayhi,args=('hh',)) t.start() 或者先建一个Thread的继 ...
- 笔记:Spring Cloud Hystrix 封装命令
使用继承的方式来创建Hystrix 命令,不是用注解的方式来使用 Hystrix 创建 HelloGetCommand 对象,继承与 HystrixCommand 并实现 run 方法,示例如下: p ...
- 笔记:Spring Cloud Ribbon RestTemplate 详解
详细介绍RestTemplate 针对几种不同请求类型和参数类型的服务调用实现,示例代码中的 restTemplate 都是通过Spring 注入方式创建的,相关代码如下: @Autowired pr ...