PB中对Word文档操作一例
软件世界
在使用PB(Power Builder)编写程序中,经常需要把一些数据库中数据形成文字式的信息存入计算机中,而Word以其强大的功能而被广大的用户所选择。笔者在使用PB编程过程中,就有把数据写入Word文档并进行编辑的例子,在此愿与大家共享。
1.例子说明
程序中有一表单中有“输入审批流程单”按钮,用于读取数据窗口数据和从数据库中统计数据,然后完成对Word模板“商业银行机构筹建审批流程单.doc”的输入、编辑工作。
2.Word模板的定义
在本例中,共定义了8个书签,名称为inst1,inst2,......inst8。定义书签方法如下:选取所要定义的书签区域,点击Word菜单中的“插入”项,选择“书签”,再输入书签名称。
3.“输入审批流程单”按钮的PB程序
以OLE方式打开模板文件,读取数据到数组变量inst,写入到Word文档,修改字体属性。程序如下:
string docname, named,string inst[8],ss
integer m,k,i,ii,value,n,j,li_num
long bank[5],money[2],enterprise
OLEObject ole_object
docname=gs_reportpath+"\商业银行机构筹建审批流程单.doc"
// gs_reportpath为局变量,是模板文件所在路径
if not(fileexists(docname)) then
messagebox("","模板文件"+docname+"不存在!!!")
return
end if
ole_object = CREATE OLEObject
IF ole_object.ConnectToNewObject("Word.Application") <> 0 THEN
MessageBox('OLE错误','OLE无法连接!')
return
END IF
//创建、连接OLE
ole_object.Documents.open(docname) //打开word模板文件
dw_preparation.accepttext()
inst[1] = dw_preparation.getitemstring(dw_preparation.getrow(),"orgname")
inst[2] = dw_preparation.getitemstring(dw_preparation.getrow(),"orgaddress")
inst[3] = dw_preparation.getitemstring(dw_preparation.getrow(),"ceo")
inst[4] = dw_preparation.getitemstring(dw_preparation.getrow(),"file1")
inst[5] = dw_preparation.getitemstring(dw_preparation.getrow(),"file2")
inst[6] = dw_preparation.getitemstring(dw_preparation.getrow(),"file3")
inst[7] = dw_preparation.getitemstring(dw_preparation.getrow(),"file4")
for i =1 to 5
select count(bankcode) into :bank[i] from bank where bankgrade=: i +1 and bankcode=:bankcode;
//变量bankcode为实例变量,为银行类别代码,bankgrade为银行级别
if isnull(bank[i]) then bank[i]=0
next
select sum(credit1),sum(credit2) into :money[1],money[2] from bank where bankcode=:bankcode;
if isnull(money[1]) then money[1]=0
if isnull(money[2]) then money[2]=0
select sum(enterprise_num) into :enterprise from bank where bankcode=:bankcode;
if isnull(enterprise) then enterprise=0
inst[8]='1、辖内该行系统共有分行('+string(bank[1])+ ')家,支行('+string(bank[2])+ ')家,分行所属办事处('+string(bank[3])+ ')家,支行以下综合性机构('+string(bank[4])+ ')家,储蓄所('+string(bank[5]+ ')家。申请行在拟设机构地区已发生存款('+string(money[1] '+')万元,贷款('+string(money[2]+ ')万元,已有开户企业('+string(enterprise)+ ')家。~r~n'
if rb_1.checked=true then
inst[8]=inst[8]+ '2、迁址撤销机构内控制度是否完善,制定的规章制度是否得到遵守。 (√)~r~n'
else
inst[8]=inst[8]+ '2、迁址撤销机构内控制度是否完善,制定的规章制度是否得到遵守。 (×)~r~n'
end if
if rb_2.checked=true then
inst[8]=inst[8]+ '3、迁址撤销机构是否存在违规经营或重大金融案件 (√)~r~n'
else
inst[8]=inst[8]+ '3、迁址撤销机构是否存在违规经营或重大金融案件 (×)~r~n'
end if
if rb_3.checked=true then
inst[8]= '4、迁址撤销机构近3年是否有年检不合格或缓办登记情况。 (√)~r~n'
else
inst[8]= '4、迁址撤销机构近3年是否有年检不合格或缓办登记情况。 (×)~r~n'
end if
for i=1 to 8//此循环处理对Word文档输入和编辑
if not(isnull(inst[i])) then
ss="inst"+string(i)//设置ss为书签
ole_object.selection.goto(true,0,0,ss) //将光标移动到书签ss
ole_object.selection.typetext(inst[i])//输入到Word文档
as_str =inst[i]
j = len(as_str)
for m=1 TO j
n = asc(left(as_str,1))
if n>127 then china_num = china_num + 1
as_str=right(as_str,len(as_str) - 1)
next
k = china_num/2 //取出字符串中的汉字个数
for m = 1 to k
ole_object.Selection.TypeBackspace() //删除乱码
next
ole_object.activedocument.bookmarks[i].range.font.bold=true
//设置为粗体,在这里一定要注意:bookmarks后为中括号,VB行家不要写为小括号,否则PB编译时会出错
ole_object.activedocument.bookmarks[i].range.font.size=11//设置字体大小
//ole_object.activedocument.bookmarks[i].range.font.italic=true 设置为斜体
ole_object.activedocument.bookmarks[i].range.underline=true//设置下划线
end if
next
ole_object.Visible = True//使文档可见
docname = left(docname,len(docname) - 4) + "(" + inst[1]+").DOC"
ole_object.ActiveDocument.SaveAs(docname,0,false,"",True,"",False,False,False,False,False)//保存新建的文档关闭新模板文件。
Ole_Object.DisConnectObject()
Destroy Ole_Object
Word文档如(图1),其中字体为粗体、有下划线的部分为写入的书签内容。

此例子在PowerBuilder 7.0下通过。本例含有复杂的表格,如果写成单纯的文字信息,就会更简单一些。