实现原理
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
希望对需要的人有帮助.