当前位置: 首页 > 编程日记 > 正文

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

相关文章:

只需3分钟,就能轻松创建 一个SpreadJS的React项目

概述SpreadJS 纯前端表格控件 V11.2(SP2) 已经全面支持了 React 的拓展。接下来我们看下如何利用3分钟快速创建一个 SpreadJS 的 React 项目。1.新建React 项目(耗时 1 Min)直接运行:npx create-react-app react-spread-sheets还不清楚什么是…

1039 到底买不买

很典型的散列题&#xff0c;对于shop和eva有的珠子(即字符)&#xff0c;各开一个128长度的整形散列表计数&#xff0c;将字符作为下标读入。 然后从0~127进行遍历&#xff0c;看每个下标下两个散列表的数量&#xff0c;如果有shop<eva说明不买&#xff0c;但是遍历仍然要继…

什么是Linq

最近一直利用业余的时间来研究Linq&#xff0c;估计这样的文章在对于园子里很多牛人来说就有点小儿科了&#xff0c;前段时间写了一个Linq To Sql体验的小例子&#xff0c;感觉很简洁程序上操作体验不错&#xff0c;我写这些的文章目的是自我学习笔记的备用和查看&#xff0c;当…

OSS正式支持IPv6公测

背景 6月20日阿里云宣布全面支持IPv6&#xff0c; 随后阿里云开放对象存储OSS也逐步开始向用户公测。 公测步骤 正常使用IPv6服务&#xff0c;除了OSS端支持还需要客户端支持&#xff0c;我们做一些检查证明客户端具备访问 IPv6的能力&#xff0c;再使用OSS SDK或工具通过IPv6 …

C++中定义类的对象:用new和不用new的区别

Point p1; Point *p2new Point(); p1 由系统创建并释放&#xff0c;不用担心会出现内存泄露&#xff0c;但是生命期只有在本区域的大括号内&#xff0c;出了大括号就没用了。 P2 是指针&#xff0c;要自己释放&#xff0c;用不好很危险&#xff0c;用好了功能强大&#xff0c;…

1043 输出PATest

开一个长度为6的整型数组分别记录6个字符的数量&#xff0c;输出的时候条件是数组中至少存在一个不为零的元素 while(PATest[0]||PATest[1]||PATest[2]||PATest[3]||PATest[4]||PATest[5]){//当6个还有一个不为0 AC代码 #include<cstdio> #include<cmath> #inc…

[转载 js] YUI解决mouseout事件冒泡的办法

原文出处&#xff1a;http://design.alibaba-inc.com/?qnode/727&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&am…

adodb.RecordSet的属性和方法

为了更精确地跟踪数据&#xff0c;要用RecordSet组件创建包括数据的游标&#xff0c;游标就是储存在内存中的数据&#xff1a; rs Server.CreateObject("ADODB.RecordSet") rs.Open(sqlStr,conn,1,A) 注&#xff1a;A1表示读取数据&#xff1b;A3表示新增、改动或删…

给女友讲讲设计模式——适配器模式(JAVA实例)5

前言 有这样一个人&#xff0c;看到别人一个个开餐馆赚了好多钱&#xff0c;于是自己也很想在餐饮业这方面大展拳脚&#xff0c;他从别人那里学到了他们的理念&#xff0c;还学习到了他们真正开店的经验。不但如此&#xff0c;他还引进了除了吃饭意外其他的服务&#xff0c;例如…

1041 Be Unique

1.依旧是散列题&#xff0c;开一个整形的哈希数组bets[10010]来计数&#xff0c;最后数目为1的&#xff0c;也就是unique 2.注意&#xff0c;可能为1的不止一个&#xff0c;要输出第一个输入的unique&#xff0c;那么需要记录下读入的顺序&#xff0c;可以开辟一个数组inputs[…

SWT图像处理入门

SWT图像处理入门 Standard Widget Toolkit ( SWT &#xff0c;标准窗口小部件工具箱)&#xff0c;是在 Eclipse 平台上使用的窗口小部件工具箱&#xff0c;它能向开发者提供和本机平台一致的用户界面和比较稳定的性能&#xff0c;也提供了强大的图像处理功能。本文首先介绍 SWT…

MyEclipse中的快捷键

MyEclipse 快捷键1(CTRL)-------------------------------------Ctrl1 快速修复CtrlD: 删除当前行 CtrlQ 定位到最后编辑的地方 CtrlL 定位在某行 CtrlO 快速显示 OutLine CtrlT 快速显示当前类的继承结构 CtrlW 关闭当前Editer CtrlK 快速定位到下一个 CtrlE 快速显示当…

CocoaPods原理(一)

CocoaPods介绍 CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用 CocoaPods&#xff0c;可以定义自己的依赖关系 (称作 pods)&#xff0c;并且随着时间的变化&#xff0c;以及在整个开发环境中对第三方库的版本管理非常方便。 CocoaPods 背后的理念主…

1055 The World‘s Richest

开始的做法是&#xff0c;对于每一个case&#xff0c;都在整个person数组内进行遍历&#xff0c;把所有年龄符合要求的都放进一个临时数组&#xff0c;然后对临时数组进行排序&#xff0c;再根据要求的数目输出。但是这么做会有一个测试用例因为超时而通不过。 穷则思变。于是…

IOS时间传递机制简记

事件传递顺序&#xff1a;自定义View -- > UIview --> RootViewController --> UIWindow -->UIApplication -->Appdelegate -->nil 注&#xff1a; //分发事件&#xff0c;将当前的触摸事件分发给当前对象的下一个响应者 //如果当前对象处理了当前事件&am…

HDOJ2270(How Many Friends Will Be Together With You)

#include <iostream>using namespacestd;const int MAX 1000005;intfr[MAX];intmain(){ int n, i, tt, sum; while(cin>>n) { for(i 1; i < n; i) fr[i] i;//初始化&#xff0c;一开始每个都是独立的&#xff0c;并无朋友 …

在linux环境下重启oracle数据库,解决密码过期的问题

&#xff08;1&#xff09; 以oracle身份登录数据库&#xff0c;命令&#xff1a;su – oracle &#xff08;2&#xff09; 进入Sqlplus控制台&#xff0c;命令&#xff1a;sqlplus /nolog &#xff08;3&#xff09; 以系统管理员登录&#xff0c;命令&#xff1a;connect /as…

1075 PAT Judge

1. 这一题一开始&#xff0c;为了同一个人的数据更新得方便&#xff0c;我把id从字符串转化成整数&#xff0c;作为数组下标&#xff0c;但是注意了&#xff0c;每个学生还是要有字符串的id属性(根据下标得到)&#xff0c;因为后面一旦排序&#xff0c;数组下标就毫无意义了。 …

MySQL 错误代码和消息

本章列出了当你用任何主机语言调用MySQL时可能出现的错误。首先列出了服务器错误消息。其次列出了客户端程序消息。 B.1. 服务器错误代码和消息 服务器错误信息来自下述源文件&#xff1a; 错误消息信息列在share/errmsg.txt文件中。“%d”和“%s”分别代表编号和字符…

一步步学习汇编(8)之指令

要理解ret,retf&#xff0c;call指令&#xff0c;必须要先理清以下汇编基础知识&#xff1a; 一&#xff0e; [bx]和内存单元<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />[bx]是什么呢&#xff1f; 和[0]有些类似…

【转】不分主副卡!全网通5.0时代到来

全网通在今天已经不是噱头了&#xff0c;它经历了有5年时间&#xff0c;从过去的全网通1.0到现在的全网通5.0&#xff0c;可以说有这长足的发展。今年&#xff0c;小米率先了支持全网通5.0的小米MIX 2S和红米Note5&#xff0c;可以双卡双待4G&#xff0c;一边打电话一边打游戏不…

1048 Find Coins(散列解法)

1. 开始测试点3答案错误&#xff0c;看参考书发现是&#xff0c;读题时根据硬币最大面值500设置的数组大小&#xff0c;但是后来会用总面值减去硬币面值&#xff0c;这个大小在[1,999)&#xff0c;因此散列表的大小应该设为1010。 2. 学会了一个小技巧。main函数可以不止一处r…

简单ThreadPool实现

由于最近需要用多线程处理一些问题&#xff0c;一开始我用了.net默认的ThreadPool&#xff0c;感觉不是很适合。于是我自己实现了一个简单的ThreadPool。 写的比较简单&#xff0c;有兴趣的朋友一起看看&#xff0c;共同改进。 代码主要由ThreadPoolEx,WorkItem,WorkQueue组成。…

CSS中强大的EM

使用CSS也好久了&#xff0c;但一直都是在使用“px”来设置Web元素的相关属性&#xff0c;未敢使用“em”。主要原因是&#xff0c;对其并不什么了解&#xff0c;只知道一点概念性的东西&#xff0c;前段时间在项目中要求使用“em”作为单位设置元素&#xff0c;所以从头对“em…

16.1、python初识面向对象(1)

初识面向对象 楔子 你现在是一家游戏公司的开发人员&#xff0c;现在需要你开发一款叫做<人狗大战>的游戏&#xff0c;你就思考呀&#xff0c;人狗作战&#xff0c;那至少需要2个角色&#xff0c;一个是人&#xff0c; 一个是狗&#xff0c;且人和狗都有不同的技能&#…

1080 Graduate Admission

1.因为这道题第一次认真想了高考录取的规则&#xff0c;对学生按照先总分再gE的原则进行从高到低排序&#xff0c;排名允许重复。再按照排名高到低对每个学生的每个志愿进行遍历&#xff0c;当一个学生处理完&#xff0c;再进行下一个。 2.由于最后是要输出学生的原始序号&…

vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序

客户端 #include <winsock2.h>#include <stdio.h>#include <stdlib.h> #pragma comment(lib,"ws2_32.lib") char SendMsg[256]; /* The IP header */typedef struct iphdr {unsigned int h_len:4; //4位首部长度unsigned int version:4; //IP版本…

arm linux 启动之一:汇编启动到start_kernel

描述arm linux启动的概要过程&#xff0c;以S5PV210(Cortex A8)为例&#xff0c;本文描述第一个阶段。 一、arm linux的引导 uboot在引导arm linux&#xff08;uImage镜像&#xff09;到SDRAM之后&#xff0c;通过bootm命令对uImage镜像的64个字节头进行解释&#xff0c;获取li…

Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...

在维护一个非常旧的项目时&#xff0c;由于该项目版本已经非常老了&#xff0c;而且在客户现场运行的非常稳定&#xff0c;更要命的是本人目前没有找到该项目的代码&#xff0c;为了处理一个新的需求而且还不能修改程序代码&#xff0c;于是决定从数据库入手&#xff0c;毕竟该…

1070 Mooncake

1. 一道典型的贪心题&#xff0c;策略是尽可能地多出售单价高的月饼。 2. 开始有一个用例没有通过&#xff0c;看了参考书&#xff0c;说是质量虽然给的都是整数&#xff0c;但是为了计算不出错&#xff0c;需要声明为浮点型。改了以后果然就通过了&#xff0c;但是个中原理不…