在PowerBuilder中利用OLE技术调用Excel

 

实现原理

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

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

3.打开Excelworkbook
 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.
操作Excelsheet
 //
设置单元格背景颜色
 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

 

 

  希望对需要的人有帮助.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++ Builder是一个强大的集成开发环境,其包含了许多功能丰富的组件和库。OLE(Object Linking and Embedding)技术是一种微软开发的机制,可以实现不同应用程序之间的通信和数据共享。 在C++ Builder,我们可以使用OLE技术来存取Excel表数据,具体步骤如下: 1. 首先,需要在项目导入相关的类型库。在工具菜单下的“其库”选项,选择“import ActiveX control”,然后选择Microsoft Excel类型库。 2. 在代码引入Excel类型库的头文件,例如:#include <excel_97.h> 3. 创建一个Excel对象,可以使用CoInitialize函数初始化COM库,并用CoCreateInstance函数创建Excel对象。例如: ``` CoInitialize(NULL); _ApplicationPtr excelApp; CLSID clsid; CLSIDFromProgID(L"Excel.Application", &clsid); excelApp.CreateInstance(clsid); ``` 4. 打开Excel文件,可以使用excelApp对象的Workbooks属性获取Workbooks对象,然后使用Open函数打开指定的Excel文件。例如: ``` _WorkbooksPtr workbooks = excelApp->Workbooks; _WorkbookPtr workbook = workbooks->Open(L"文件路径"); ``` 5. 在打开的Excel文件获取数据,可以使用workbook对象的Worksheets属性获取Worksheets对象,然后使用Cells属性访问指定的单元格。例如: ``` _WorksheetPtr worksheet = workbook->Worksheets->GetItem(1); _RangePtr range = worksheet->Cells; _range->Item[1][1]->Value = L"Hello"; ``` 6. 在完成对数据的操作后,记得关闭Excel文件并释放对象,可以使用workbook对象的Close函数关闭文件,然后使用excelApp对象的Release函数释放Excel对象。例如: ``` workbook->Close(); excelApp->Release(); CoUninitialize(); ``` 通过以上步骤,我们就可以使用C++ BuilderOLE技术来存取Excel表数据了。当然,还可以使用其他Excel对象和函数进行更多高级的操作,例如添加数据、保存文件等。有关详细的操作可以参考C++ Builder的相关文档或搜索相关的技术资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值