当前位置: 代码迷 >> PB >> pb透过ole操作word.application,求函数和属性调用方法
  详细解决方案

pb透过ole操作word.application,求函数和属性调用方法

热度:77   发布时间:2016-04-29 07:31:33.0
pb通过ole操作word.application,求函数和属性调用方法
如题,谁有好的uer object或者其他说明文档之类的,麻烦分享一下!![email protected] 重分酬谢!
------解决方案--------------------
在PB中嵌入Word文档2008-10-11 22:43PB(PowerBuilder)是Sybase公司推出的一种优秀的数据库开发工具,利用它的数据窗口控件可以快速地开发出一个数据管理系统。现在许多单位很注重报表的格式,需要不同类型的报表,所以必须提高报表格式的多样性。虽然我们可以利用PB设计出具有打印功能的窗口,但是由于格式是事先规定好的,用户很难根据需要进行修改。Word是大家熟悉的一种文字处理工具,具有强大的编辑与打印功能。如果能够将数据源动态地导入到Word文档中,然后在Word中调整和打印,用户的自由度就比较大。下面笔者以生成用户话费清单为例,介绍一种通过OLE技术嵌入Word文档的方法。 
 
创建模板文件 
首先,我们建立一个报表样式的模板文件,取名为“用户清单模板.dot”。根据需要录入静态文本,并在需要插入动态数据的地方插入“书签”。“书签”名字与PB数据源中列的名字一致,如图1所示。 
 
 
 
图1 模板文件 
 
编写程序 
1. 数据窗口d_user和d_cost,分别取自移动电话用户基本信息表和用户话费记录表,数据模型如 
 
 
 
图2 数据模型 
 
2. PB和Word通信时,如果向Word中输出汉字,则该汉字后面会出现与汉字个数相同的乱码,所以必须编写函数处理这种情况。定义全局函数integer f_getcnnum(string aString)。代码如下: 
string ls_ch //临时单元 
string ls_SecondSecTable //存放所有国标二级汉字读音 
integer li_num = 0 //返回值 
integer i,j 
for i = 1 to Len(aString) 
ls_ch = Mid(aString,i,1) 
if Asc(ls_ch) >= 128 then //判定是汉字 
li_num++ 
i = i+1 
end if 
next 
return li_num 
3.创建窗口w_costlist,其中包含两个数据窗口dw_1和dw_2,分别对应数据窗口d_user和d_cost。再插入两个单行编辑器sle_1和sle_2,分别用于用户录入和选择模板文件与文档输出路径。本文省略选择文件与路径按钮的编程代码。 
4.添加“生成用户清单(Word)”按钮。该按钮Clicked事件代码如下: 
constant integer ppLayoutBlank = 12 
OLEObject ole_object 
ole_object = CREATE OLEObject 
integer li_ret 
//建立与Word的连接 
li_ret = ole_object.ConnectToObject(“Word.application”) 
if li_ret <> 0 then 
//如果Word还没有打开,则新建一个Word 
li_ret = ole_object.ConnectToNewObject(“Word.application”) 
if li_ret <> 0 then 
MessageBox(‘OLE错误’,‘OLE无法连接! 错误号 :’ + string(li_ret)) 
return 
end if 
ole_object.Visible = false 
end if 
string ls_modelfilename 
ls_modelfilename = sle_1.text 
string ls_savefilename 
ls_savefilename = sle_2.text 
ole_object.Documents.open(ls_modelfilename) 
constant long wdWord9TableBehavior = 1 
constant long wdAutoFitFixed = 0 
constant long wdCell = 12 
long i,j,k,ll_colnum,ll_rownum 
string ls_value,ls_colname 
//输出清单表头 
ll_colnum = Long(dw_1.object.datawindow.column.count) 
dw_1.setredraw(false) 
for j = 1 to ll_colnum 
dw_1.setcolumn(j) 
ls_value = dw_1.gettext() 
ls_colname = dw_1.describe(‘#’ + string(j) + “.name”) 
if ls_colname = “name” then ls_savefilename + = “\用户 ” + ls_value + “ 话费清单.doc” 
ole_object.selection.goto(true,0,0,ls_colname) 
ole_object.Selection.TypeText(ls_value) 
for k = 1 to f_getcnnum(ls_value) 
ole_object.Selection.TypeBackspace() 
next 
next 
dw_1.setredraw(true) 
//输出清单 
ll_colnum = Long(dw_2.object.datawindow.column.count) 
ll_rownum = dw_2.rowcount() + 1 
ole_object.selection.goto(true,0,0,‘list’) 
ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range, ll_rownum, ll_colnum, wdWord9TableBehavior, wdAutoFitFixed) 
  相关解决方案