实现原理

    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. 2021年大数据Spark(三十三):SparkSQL分布式SQL引擎
  2. 测试基于2SK241的150kHz的导航信号高频放大器
  3. ArcGIS实现在线与线交叉处打断线(批量)
  4. myeclipse新建映射文件xxx.hbm.xml
  5. 字节跳动AI Lab招聘算法工程师,含全职和实习
  6. HDU 5515 Game of Flying Circus 二分
  7. VB 游戏外挂操作类
  8. 浮点数在内存中的表示
  9. JAVA分布式架构的演变及解决方案
  10. ISA Server、虚拟机、托管服务器的使用
  11. ntko php,NTKO OFFICE文档控件
  12. oracle表转换mysql建表语句
  13. 人脸识别相似度计算方法
  14. 【阿里图标库的使用】
  15. C语言从入门到放弃视频教程
  16. python中函数的定义通常会从关键字_4.7. 深入 Python 函数定义
  17. android怎么用apk,手机如何安装APK应用教程 小白操作安卓系统教程 (全文)
  18. 毕业设计So Easy:JSP+layui+MySQL实现Web端图书管理系统
  19. 机器学习笔记(九)聚类算法Birch和层次聚类Hierarchical clustering
  20. 编写一个函数判断一个整数是不是素数c语言,编写函数判断一个整数是否为素数....

热门文章

  1. 解决GitHub无法登录的方法
  2. 那些不得不说的性能优化套路
  3. 基于javaweb+jsp的健身房信息管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
  4. 人工智能和大数据分析之间,主要有什么区别
  5. 程序员硬核吸猫:自制猫抓板、猫脸识别、智能猫窝!
  6. 汽车零部件行业SRM供应商协同系统:提升汽车零部件企业采购质量,驱动供应商快速响应
  7. 手机APP爬虫[爬虫专题(19)]
  8. 软件工程网络15个人作业3(201521123028 李家俊)
  9. 萌新安装mongodb
  10. WEB前端程序员找工作跳槽简历该怎么写?