实现原理

    OLE(对象链接与嵌入) 是一种Window程序之间实现共享数据与功能的面向对象技术,目前流行的Windows 和 Macintosh 操作系统平台都支持 OLE 对象。借助OLE不仅可共享其它应用程序的数据,而且还能以对象方式直接控制其它应用程序的运行,从而进一步扩展开发工具的功能。OLE 支持直接在程序中创建、使用和控制OLE对象,实现OLE自动化。PowerBuilder与作为OLE服务器的Excel具有良好的编程接口,利用OLE可以实现PowerBuilder数据窗口与Excel间进行通信。通过PowerBuilder程序代码操纵OLE对象来把数据窗口中的数据写入到Excel电子表格中去,实现二者间的通信和数据交换。具体实现过程为首先创建一个与控件独立的OLEObject对象,该对象用作远程OLE对象的代理与服务器应用程序连接,由应用程序执行对该对象的函数调用和属性设置操作,使OLEObject对象满足报表要求。即利用PowerBuilder的OLEObject对象类型声明一个变量实例,然后与Excel的OLE接口连接起来,并使Excel应用程序可见,然后根据报表要求把数据窗口中检索到的数据插入到Excel中去,实现报表制作。最后,数据处理完毕断开与Excel应用程序的连接,并删除创建的OLEObject对象。

PB使用OLEObject操作Excel

1.申明和定义(其他变量定义省略)
 OLEObject  xlapp   // EXCEL application object
 OLEObject xlwk   // EXCEL workbook object
 OLEObject xlsub   // EXCEL worksheet object
 OLEObject xlcel   // EXCEL cell object

2.连接Excel文件,ls_path为Excel路径
 xlapp = create OLEObject
 
 li_ret = xlapp.ConnectToObject(ls_path)

if li_ret < 0  then
  MessageBox("ERR","")
  destroy xlapp
 end if

3.打开Excel的workbook
 ll_cnt = xlapp.Application.Workbooks.Count //获取当前workbook的个数
 xlwk = xlapp.Application.Workbooks[ll_cnt] //打开最新的一个对象,也就是上面连接后打开的excel对象(如果改文件已经打开,需特殊考虑)
 xlsub = xlwk.Worksheets[1]
 xlapp.Application.Windows(ll_cnt).Visible = true //设置对象不可视
 
 xlsub.Activate
 
4.操作Excel的sheet
 //设置单元格背景颜色
 xlsub.cells(1,1).Interior.Color = rgb(255,0,0)
 xlsub.cells(1,1).Interior.Pattern = "1"
 
 //设置列的filter
 xlsub.Rows("1:1").AutoFilter
 
 //获取Excel行数
 ll_rowcnt_xls = xlsub.UsedRange.Rows.Count
 
 //设置Excel列宽自动大小(随内容宽度自动变化)
 xlsub.Rows("1:" + string(ll_rowcnt_xls)).Columns.AutoFit
 
 //sheet锁定, false:解锁; true:加锁
 xlsub.Cells.Locked = False
 
 //做一个下拉列表框,当选择DEL时候背景变成红色,选择NoAction无变化
 xlsub.Range(ls_range).Validation.Delete
 xlsub.Range(ls_range).Validation.Add("3", "1", "1", "NoAction,DEL")
 xlsub.Range(ls_range).Validation.IgnoreBlank = True
 xlsub.Range(ls_range).Validation.InCellDropdown = True
 xlsub.Range(ls_range).Validation.InputTitle = ""
 xlsub.Range(ls_range).Validation.ErrorTitle = ""
 xlsub.Range(ls_range).Validation.InputMessage = ""
 xlsub.Range(ls_range).Validation.ErrorMessage = ""
 xlsub.Range(ls_range).Validation.IMEMode(0)
 xlsub.Range(ls_range).Validation.ShowInput = True
 xlsub.Range(ls_range).Validation.ShowError = True
 
 xlsub.Range(ls_range).FormatConditions.Delete
 xlsub.Range(ls_range).FormatConditions.Add("1", "3", "DEL")
 xlsub.Range(ls_range).FormatConditions(1).Font.Color = rgb(255,0,0)
 
 //设置sheet单元格格式为文本格式
 xlsub.Cells.NumberFormatLocal = "@"
 
 // 设置保护,第一个参数是密码,后面的参数比较复杂,可以自己去一个一个实验
 xlsub.protect("password",true, true,true, false,false, false,false,true,true, false,true,true,false,true,false)
 
 //将sheet1的一列复制到sheet2中
 xlwk.Sheets("sheet1").Select()
 xlwk.Sheets("sheet1").Columns(ll_col_xls).Copy() // 要复制的列
 xlwk.Sheets("sheet2").Select()
 xlwk.Sheets("sheet2").Columns(ll_col_newsheet).Select() // 粘贴到ll_col_newsheet列前
 xlwk.Sheets("sheet2").Paste()
 
5.关闭Excel
 xlapp.Application.DisplayAlerts   =   False // 不提示保存等提示信息,且为不保存
 xlwk.save()
 xlwk.Close()
 
 xlapp.ConnectToObject(ls_path) //从新打开一个Excel对象
 ll_cnt = xlapp.Application.Workbooks.Count
 xlwk = xlapp.Application.Workbooks[ll_cnt]
 xlapp.Application.DisplayAlerts   =   True
 
 // -------------------------------------------
 // 上面关闭提示了,这里要解开关闭,否则其他woekbook关闭也没提示,
 //但是直接设置为true是不可以的(见下面两行代码),必须再打开一个对象,再设置为true才可以
 //xlapp.Application.DisplayAlerts   =   False
 //xlapp.Application.DisplayAlerts   =   True
 //--------------------------------------------
 
 xlwk.close()
 xlapp.DisConnectObject()
 
 Destroy xlsub
 Destroy xlwk
 Destroy xlapp
 
 其他一些简单的操作,网上有很多很好的资料,这里只是提到一些特殊的操作,例如:下拉列表框,选择条件,设置保护等等
 而这些也正是网上还不容易找到答案的.
 因为在Excel录制了宏之后,把宏放到PB里还是会出现很多问题,需要查阅资料以及自己的实验才能得出正确结果,

附加:PB读取Excel数据的实例

//==============================================================================
// 函数: GF_XLS2DW()
//------------------------------------------------------------------------------
// 描述: EXCEL文件导入到DATAWINDOW
//------------------------------------------------------------------------------
// 参数:
//  value datawindow dw  
//------------------------------------------------------------------------------
// 返回值:   1 SUCCEED   -1 ERROR
//==============================================================================

String str_savename,named,s_grxh
Int  excelok,li_net
Long li_count,i
String   ls_dir

oleobject excelserver
excelserver = Create oleobject
excelok = excelserver.ConnectToNewObject("excel.application")

//检查返回值,以确保已成功地连接到了Excel
If excelok <> 0 Then
 MessageBox("信息提示","连接EXCEL失败,请检查计算机中是否安装了EXCEL!")
 Return -1
End If

//得到程序路径
ls_dir  = GetCurrentDirectory ( ) 
li_net = GetFileOpenName("选择文件", str_savename,named,"xls","Excel文件(*.xls),*.xls")
ChangeDirectory ( ls_dir ) //切换回原路径!(很重要!不然程序运行有问题!)
If li_net > 0 Then
 If str_savename = "" Then  Return -1
 dw.SetTransObject(sqlca)
 dw.Reset()
 excelserver.workbooks.Open(str_savename)
 excelserver.activesheet.cells.Copy
 li_count = dw.ImportClipboard(1) //导入数据(从第一行起)
 Clipboard("")
 
 excelserver.quit()
 excelserver.DisconnectObject()
 Destroy excelserver
 Return 1
Else
 MessageBox('信息提示','没有指定导入文件!')
 Return -1
End If

希望对需要的人有帮助.

在PowerBuilder中利用OLE技术调用Excel相关推荐

  1. 用OLE技术操纵Excel

    ---- C++Builder是Borland公司继Delphi之后又一成功的产品,她集VB.VC++ 及 Delphi 的优点于一体而深得C语言爱好者的青睐.由于多数操作者爱用 MicroSoft公 ...

  2. Windows中的“OLE”技术,是什么技术,它可以实现多个文件之间的住处传递和共享...

    我看的不太懂这个东西但是看哪个mfc初始化的时候有调用这个某个函数初始化这个东西所以百度了下看不懂.然后也把转载的放上来了. Windows中的"OLE"技术,是什么技术,它可以实 ...

  3. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  4. 利用xlwings直接调用Excel的xlsm文件中的宏vba

    例如某个xlsm文件中的模块1中有宏 Sub 宏1() ' ' 宏1 宏 ''Range("G3").SelectActiveCell.FormulaR1C1 = "你好 ...

  5. MFC中使用OLE/COM操作EXCEL的方法

    使用OLE的方法操作EXCEL,首先计算机必须安装excel,这样才会有接口暴露出来.本次使用大神封装好的类. excel作为OLE/COM库插件,定义好了各类交互接口,而且这些接口是跨语言的,可以导 ...

  6. ALV中调用Excel inplace时没能传递数据实例解决

    在很多用到ALV的项目开发中,会有调用Excel inplace功能直接在excel中查看数据(sy-ucomm = &VEXCEL), 可是当我们点该按钮是, excel是成功出现了,可是a ...

  7. VS用OLE方式对Excel进行读写操作

    OLE技术(Object Linking and Embedding,对象连接与嵌入)OLE是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM). 一.Excel对象模型. Appl ...

  8. [VFP实例]VFP的OLE技术应用详解

    VFP用了OLE2.0技术,使VFP应用程序的适应能力大为加强. VFP提供两种类型的OLE对象:一种是OLE控件(.OCX文件),这是一种自定义控件,通常在WINDOWS/SYSTEM目录下,拥有自 ...

  9. 关于在呼叫中心业务中应用语音识别技术的探讨

    关于在呼叫中心业务中应用语音识别技术的探讨 摘要:本文首先给出了语音技术的应用现状,接着对语音识别技术在呼叫中心中可应用可尝试的业务进行探讨,最后提出呼叫中心业务中应用语音识别技术的虚拟CSR概念. ...

最新文章

  1. python进阶九_网络编程
  2. oracle分页查询前10条,Oracle查询前十条记录及分页查询(第5条到第10记录)
  3. lol自动刷人机辅助_LOL星籁歌姬新手怎么玩 星籁歌姬技能出装符文打法攻略 新英雄星籁歌姬辅助攻略...
  4. 以鶸ice为例,手撸一个解释器(一)明确目标
  5. 如何进行自动化PDF测试?这里有真正简单明了的方法
  6. Atitit aop spring5.2 demo与流程总结 目录 1.1. 定义切面MyAllAspect 1 1.2. 定义普通类型userservice 1 1.3. 设置切面到某个方法上ex
  7. 【转载】MiniUtilityFramework(九):CText和TEXT
  8. 史上最全的程序员求职渠道总结
  9. NAC(网络准入控制)实施案例(20100531)
  10. vmware14安装黑苹果max ox x 10.13懒人版教程
  11. 一块链习公开课:从 0 到 1 构建去中心化应用 | ArcBlock 预告
  12. bluekitchen-stm32f1/csr8311移植笔记(4)-database driver
  13. 06-python中的集合类-01
  14. 固件和微码到底啥区别
  15. Intellij IDEA 占满CPU
  16. 使用立体声混音(Stereo Mix)录制音频
  17. win11环境 cmd 命令窗口 sqlplus 命令无响应
  18. Oracle drop删表后的数据恢复
  19. 开源社媒体组招募 | 找暑期实习的小伙伴看过来
  20. p2p下载器是什么?

热门文章

  1. webmagic爬取网页
  2. 字谜分组_数组中的字谜分组
  3. 树莓派3 之 USB摄像头安装和使用
  4. SimpleColorPick网页桌面取色器
  5. CTFHUB——反射型XSS详解
  6. matlab二维数组排序函数,Matlab 用sort函数排序 二维数组
  7. Android 判断一个点是否在封闭的Path内或不规则的图形内
  8. 10个全球最佳免费土地覆被/土地利用数据资源
  9. 中国航空发动机行业发展动态分析与十四五战略规划研究报告2022-2028年版
  10. 给安卓开发小白们的unit test指南 - 这也能测?这也要测?