OLE 操作Excel 详解(转)
使用Excel模板进行报表的开发.
今年搞的Excel比较多,总结了一下,相信常用的操作包含的差不多了。
可以首先定义一个无内容的Excel报表模板文件.
通过Tcode SMW0 上传至SAP数据库中备用.(注: Web对象应该选择’WebRFC 应用程序的二进制数据’)
开发程序:
在程序中需要首先导入下面两项.
INCLUDE ole2incl. “ 此项根据需要导入不同的对象类
INCLUDE officeintegrationinclude.
在INITIALIZATION 中建立文件对象与链接服务器.
参考http://help.sap.com/saphelp_40b/helpdata/en/e9/0be7ed408e11d1893b0000e8323c4f/content.htm
选择需要的报表数据.
检查目标文件是否已经存在,若存在将其删除.
使用FUNCTION 'SAP_OI_LOAD_MIME_DATA' 从SAP数据库中得到报表模板数据.
使用METHOD factory->get_document_proxy创建文档实例.
使用METHOD document->play_document_from_table 用报表模板数据填入文档内容.
使用METHOD document->save_copy_as 将创建的文档另存为本地文件.
关闭释放文档对象:
METHOD document->is_destroyed
METHOD document->close_document
METHOD document->release_document
FREE document.
关闭释放连接服务器:
METHOD link_server->stop_link_server
FREE link_server.
关闭释放代理对象:
METHOD factory->stop_factory
FREE factory.
下面开始处理保存到本地的报表模板,向其填写具体数据内容.
CREATE OBJECT h_excel 'EXCEL.APPLICATION'. “ 新建OLE对象
SET PROPERTY OF h_excel 'Visible' = 0. “ 定义其不可见
CALL METHOD OF h_excel 'Workbooks' = h_mapl. “ 得到活动excel对象
CALL METHOD OF h_mapl 'Open' “ 打开此活动excel
EXPORTING
#1 = p_file. “ 本地模板文件路径
CALL METHOD OF h_excel 'WORKSHEETS' = H_SHEET. “ 得到活动的worksheet
如果需要生成多张报表则需要建立多个Sheet .
首先判断相应名字的sheet是否已经存在:
GET PROPERTY OF WORKSHEETS 'COUNT' = SHEETCOUNT. “ 得到sheet数量
DO SHEETCOUNT TIMES. “ 循环判断sheetname是否已经存在,若已经存在则不再创建
I = I + 1.
CALL METHOD OF EXCEL 'WORKSHEETS' = TMPSHEET
EXPORTING #1 = I.
GET PROPERTY OF TMPSHEET 'NAME' = TMPNAME.
IF TMPNAME = SHEETNAME.
EXISTFLAG = 1.
EXIT.
ENDIF.
ENDDO.
若sheetname不存在则创建
IF EXISTFLAG = 0.
CALL METHOD OF EXCEL 'WORKSHEETS' = MODELSHEET “ 第一个sheet
EXPORTING #1 = 'Sheet1'.
* EXPORTING #1 = '模板'.
PERFORM ERR_HDL.
CALL METHOD OF EXCEL 'WORKSHEETS' = TMPSHEET “ 最后一个sheet
EXPORTING #1 = SHEETCOUNT.
PERFORM ERR_HDL.
CALL METHOD OF MODELSHEET 'COPY' “ Copy一个新的sheet
EXPORTING #1 = TMPSHEET.
PERFORM ERR_HDL.
GET PROPERTY OF WORKSHEETS 'COUNT' = NEWSHEETCOUNT. “ 重新得到Sheet数量
PERFORM ERR_HDL.
IF NEWSHEETCOUNT > SHEETCOUNT. “ 判断是否创建sheet成功
CALL METHOD OF EXCEL 'WORKSHEETS' = NEWSHEET “ 如果创建成功则改Sheet的名字
EXPORTING #1 = SHEETCOUNT.
PERFORM ERR_HDL.
SET PROPERTY OF NEWSHEET 'NAME' = SHEETNAME. “注:此处修改的是倒数第二个sheet
PERFORM ERR_HDL.
* SET PROPERTY OF NEWSHEET 'SCENARIOS' = 0.
PERFORM ERR_HDL.
ENDIF.
ENDIF.
将所有的sheet创建完毕后开始逐一向每个sheet添加报表内容.
CALL METHOD OF h_excel 'WORKSHEETS' = h_sheet
EXPORTING
#1 = 'Sheet1'. “ 首先将第一个sheet也改名字
CALL METHOD OF h_sheet 'ACTIVATE'.
CALL METHOD OF h_excel 'ACTIVEWINDOW' = activewindow. “ 得到活动窗口对象
SET PROPERTY OF activewindow 'DISPLAYGRIDLINES' = 0. “ 隐藏格线(虚线)
SET PROPERTY OF h_sheet 'NAME' = sheet_name. “ 修改sheet name
LOOP AT TAB_ALL.
CLEAR sheet_name.
sheet_name+0(10) = TAB_ALL-NAME.
sheet_name+10(1) = '-'.
sheet_name+11(8) = TAB_ALL-pernr.
CALL METHOD OF h_excel 'WORKSHEETS' = h_sheet
EXPORTING
#1 = sheet_name.
CALL METHOD OF h_sheet 'ACTIVATE'. “ 逐个sheet激活
PERFORM fill_cell USING 2 3 1 tab_all-name. “ 向各个字段添加数值
PERFORM fill_cell USING 2 5 1 tab_all-xb. “ 向各个字段添加数值
… … … …
… … … …
ENDLOOP.
SET PROPERTY OF h_excel 'Visible' = 1. “ 取消隐藏
CALL METHOD OF h_sheet 'CLOSE'. “ 关闭
FREE OBJECT h_excel. “ 释放
FREE OBJECT h_mapl. “ 释放
FREE OBJECT h_sheet. “ 释放
FREE OBJECT activewindow.
调用宏(带参数)
CALL METHOD OF excel 'RUN' EXPORTING #1 = 'ZMACRO1'
#2 = param1. “ 带参数
根据列数(1,2,3… …)换算Excel列名(a,b,c… …)
CALL FUNCTION 'ZHRIS_GET_EXCEL_COLUMN'
EXPORTING
p_column = l_int
IMPORTING
f_column = col.
FUNCTION ZHRIS_GET_EXCEL_COLUMN.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(P_COLUMN) TYPE I
*" EXPORTING
*" REFERENCE(F_COLUMN) TYPE C
*"----------------------------------------------------------------------
data : l_col type string .
data : l_cyc type i .
data : l_mod type i .
data : c1, c2 .
l_col = 'abcdefghijklmnopqrstuvwxyz' .
if p_column >= 1 .
l_cyc = p_column div 26 .
l_mod = p_column mod 26 .
if l_cyc > 1 .
* l_cyc = l_cyc - 1 .
endif.
if l_mod > 1 .
l_mod = l_mod - 1 .
endif.
if l_mod = 0 .
l_cyc = l_cyc - 1 .
l_mod = 25.
endif.
if l_cyc >= 1 .
l_cyc = l_cyc - 1 .
c1 = l_col+l_cyc(1).
endif.
if l_mod >= 1 .
if l_mod = 1 .
l_mod = l_mod - 1 .
endif.
c2 = l_col+l_mod(1).
endif.
concatenate c1 c2 into F_COLUMN .
condense F_COLUMN no-gaps .
endif.
ENDFUNCTION.
选择Excel中某个区域
CALL METHOD OF h_sheet 'range' = range
EXPORTING
#1 = 'a3'
#2 = 'b10'.
CALL METHOD OF range 'Select' NO FLUSH. “ 选择
GET PROPERTY OF range 'borders' = h_borders no flush. “ 加边框
* SET PROPERTY OF h_borders 'weight' = '2' no flush.
SET PROPERTY OF h_borders 'linestyle' = '1' no flush. “ 框线格式
CALL METHOD OF excel 'Columns' = column “ 选定列
EXPORTING
#1 = 1.
SET PROPERTY OF column 'ColumnWidth' = 3. “ 定义列宽
SET PROPERTY OF column 'rowheight' = 30. “ 定义行高
CALL METHOD OF range 'ClearContents'. “ 清空内容
SET PROPERTY OF range 'MergeCells' = 1. “ 合并单元格
SET PROPERTY OF range 'HorizontalAlignment' = 3. “ 对齐方式-纵向
SET PROPERTY OF range 'ShrinkToFit' = 0 . “ 取消自动缩小字体
CALL METHOD OF h_mapl 'SAVEAS' “ 保存Excel
EXPORTING
#1 = 'C:"工资明细表.xls'
#2 = 1.
FREE OBJECT excel.
FREE OBJECT h_sheet.
*********** 调整Sheet 之间的顺序 *****************
sheet_name+0(9) = '通知书'.
sheet_name+9(1) = '-'.
sheet_name+10(2) = '01'.
CALL METHOD OF h_excel 'WORKSHEETS' = h_sheet
EXPORTING
#1 = sheet_name.
sheet_name1+0(9) = '通知书'.
sheet_name1+9(1) = '-'.
sheet_name1+10(2) = '02'.
CALL METHOD OF h_excel 'WORKSHEETS' = h_move
EXPORTING
#1 = sheet_name1.
CALL METHOD OF h_sheet 'Move' EXPORTING #1 = h_move.
*********** 调整Sheet 之间的顺序 *****************
转载于:https://www.cnblogs.com/elegantok/archive/2009/03/10/1407982.html
OLE 操作Excel 详解(转)相关推荐
- 【转】用VB操作Excel详解
用VB操作Excel详解 一. VB读写EXCEL表: VB本身提自动化功能可以读写EXCEL表,其方法如下: 1.在工程中引用MicrosoftExcel 类型库: 从"工程"菜 ...
- 使用poi操作excel详解
使用poi操作excel详解 1.POI工具介绍 2.POI可操作的文件类型 3.POI所需依赖 4.xls和xlsx的区别 5.POI Excel 写 03(xls)和07(xlsx)版本方式 6. ...
- python excel详解_python操作excel详解
前提: python操作excel需要使用的模块有xlrd.xlwt.xlutils.对excel进行读.写.更新操作.操作excel时需要先导入这些模块,demo如下: excel-读操作知识点: ...
- [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- C#NPOI导出Excel详解
C#NPOI导出Excel详解 开发工具与技术:工具:Visual Studio/C#.Net,技术:C# 作者:刘胜 撰写时间:2019-05-08 NPOI简介 NOP是一个开源的C#读写Exce ...
- 1.8 Collections类操作集合详解——排序,查找,复制
Collections类操作集合详解 Collections 类是 Java 提供的一个操作 Set.List 和 Map 等集合的工具类. Collections 类提供了许多操作集合的静态方法,借 ...
- vsftp建立虚拟用户不同目录分配不同权限操作步骤详解
这篇文章主要介绍了vsftp建立虚拟用户不同目录分配不同权限操作步骤详解,大家参考设置自己的FTP服务器吧vsftpd服务器同时支持匿名用户.本地用户和虚拟用户三类用户账号,使用虚拟用户账号可以提供集 ...
- ElasticSearch-.net平台下c#操作ElasticSearch详解
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
- Linux下fdisk命令操作磁盘详解--添加、删除、转换分区
linux下fdisk命令操作磁盘详解--添加.删除.转换分区等 fdisk 操作硬盘的命令格式如下: [root@localhost beinan]# fdisk 设备 比如我们通过 fdisk - ...
最新文章
- 华为安卓11是鸿蒙系统吗,恭喜华为手机,EMUI11曝光,是披着Android 11的“鸿蒙系统”?...
- 操作系统:基本分段存储管理方式
- xml解析:Sax,Dom,pull解析
- oracle 10046详解
- NodeJs两个简单调试技巧
- 不同语言,系统通过共享内存方式实现信息交互
- web(七)---fastcgi再进阶(请求和响应)官方例子
- java获取map遍历,Map获取键值,Map的几种遍历方法总结(推荐)
- java 获取及修改系统变量
- debian10杀毒软件安装和使用
- 华为是怎样研发的(10)——知识管理
- linux下TF卡测试寿命的测试程序编写
- fetion-robot是基于web飞信接口的飞信机器人
- 百度地图改变定位图标
- 从数据库导出数据到EXCEL换行的问题解决方法(即数据库字段太长自动换行)
- Linux服务器常见运维性能测试(2)内存测试mbw、stream
- 实验吧-简单的登录题——WriteUp再研究
- 数通 | 静态路由表的配置(含负载分担、路由备份)
- 结构化数据和非结构化数据有何区别?
- 计算机辅助英语,计算机辅助英语教学
热门文章
- javascript组件_是的,JavaScript运行Swift。 无论如何都要构建您的组件库。
- 渐进式web应用程序_渐进式Web应用程序简介
- PAT(甲级)2018年冬季考试 7-3 Vertex Coloring
- 找Java培训机构需要注意那些
- leetcode--对称二叉树--python
- [Java实现] 图片择优(选择最清楚的图片)
- 气温上升影响数据中心节能
- 报错 org.springframework.beans.factory.BeanCreationException
- 为创业者保驾护航 “无安全 不创业” 安全狗全国路演北京站
- 简短的几句js实现css压缩和反压缩功能