在PB中嵌入Word文档 国防科技大学3院5队98研 张 涛 罗诗途 PB(PowerBuilder) 是Sybase公司推出的一种优秀的数据库开发工具,利用它的数据窗口控件可以快速地开发出一个数据管理系统。现在许多单位很注重报表的格式,需要不同类 型的报表,所以必须提高报表格式的多样性。虽然我们可以利用PB设计出具有打印功能的窗口,但是由于格式是事先规定好的,用户很难根据需要进行修改。 Word是大家熟悉的一种文字处理工具,具有强大的编辑与打印功能。如果能够将数据源动态地导入到Word文档中,然后在Word中调整和打印,用户的自 由度就比较大。下面笔者以生成用户话费清单为例,介绍一种通过OLE技术嵌入Word文档的方法。 创建模板文件 首先,我们建立一个报表样式的模板文件,取名为"用户清单模板.dot"。根据需要录入静态文本,并在需要插入动态数据的地方插入"书签"。"书签"名字与PB数据源中列的名字一致,如图1所示。 图1 模板文件 编写程序 1seem用法. 数据窗口d_user和d_cost,分别取自移动电话用户基本信息表和用户话费记录表,数据模型如 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 = string ls_savefilename ls_savefilename = 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.unt) dw_1.setredraw(false) for j = 1 to ll_colnum dw_1.setcolumn(j) ls_value = t() ls_colname = dw_1.describe('#' + string(j) + ".name") if ls_colname = "name" then ls_savefilename + = "\用户 " + ls_value + " 话费清单.doc" ole_(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.unt) ll_rownum = wcount() + 1 ole_(true,0,0,'list') ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range, ll_rownum, ll_colnum, wdWord9TableBehavior, wdAutoFitFixed) ole_object.Selection.MoveLeft(wdCell) for i = 1 to ll_colnum //得到标题头的名字 ls_colname = dw_2.describe('#' + string(i) +".name") +"_t" ls_value = dw_2.describe(ls_colname + ".text") ole_object.Selection.TypeText(ls_value) for k = 1 to f_getcnnum(ls_value) ole_object.Selection.TypeBackspace() next ole_object.Selection.MoveRight(wdCell) next //输出清单数据 dw_2.setredraw(false) ole_object.Selection.MoveLeft(wdCell) for i = 2 to ll_rownum 会计中级职称报名条件 for j = 1 to ll_colnum dw_2.scrolltorow(i - 1) dw_2.setcolumn(j) ls_value = dw_2. gettext() ole_object.Selection.MoveRight(wdCell) ole_object.Selection.TypeText(ls_value) for k = 1 to f_getcnnum(ls_value) ole_object.Selection.TypeBackspace() next next next dw_2.setredraw(true) constant long wdFormatDocument = 0 //保存用户详细话单 ole_object.ActiveDocument.SaveAs(ls_savefilename,1) ole_object.Application.Quit() ole_object.DisConnectObject() //断开OLE连接 Destroy ole_object MessageBox("提示","用户详细话单Word文档已经生成!") 当用户单击"生成用户清单(Word)"按钮后,程序将利用OLE技术连接Word,在相应的位置填写数据,生成用户的话费清单,并且保存在指定目录下。生成所有用户的话费清单后,即可以统一进行打印。 程序运行时界面如图3所示: |
∙ 对我有用[0]
∙ 丢个板砖[0]
∙ 引用
∙ 举报
∙ 管理
请查看PB的Code Examples中的OleControl2.0的例子!
OleObject ole_app
OleObject ole_CommandBars
//ole_word.InsertObject()
//得到Word的工具条集合,隐藏一些没必要的工具条
OleObject ole_app
OleObject ole_CommandBars
//ole_word.InsertObject()
//得到Word的工具条集合,隐藏一些没必要的工具条
Try
ole_app = ole_word.Object.Application
ole_CommandBars = ole_app.CommandBars
Long i,ll_count
String ls_name
ll_count = unt
//隐藏其它工具条,保留“常用”和“格式”工具条
For i = 1 To ll_count
Try
ls_name = String(ole_CommandBars.Item[i].Name)
祭灶节的来历和风俗 If Lower(Trim(ls_name)) = "menu bar" Or &
Lower(Trim(ls_name)) = "standard" Or &
Lower(Trim(ls_name)) = "formatting" Then
财务管理专业怎么样ole_app = ole_word.Object.Application
ole_CommandBars = ole_app.CommandBars
Long i,ll_count
String ls_name
ll_count = unt
//隐藏其它工具条,保留“常用”和“格式”工具条
For i = 1 To ll_count
Try
ls_name = String(ole_CommandBars.Item[i].Name)
祭灶节的来历和风俗 If Lower(Trim(ls_name)) = "menu bar" Or &
Lower(Trim(ls_name)) = "standard" Or &
Lower(Trim(ls_name)) = "formatting" Then
ole_CommandBars.Item[i].Visible = True
Else
If ole_CommandBars.Item[i].Visible Then
ole_CommandBars.Item[i].Visible = False
End If
End If
Catch(runtimeerror Error)
//MessageBox(ls_name,Error.GetMessage())
End Try
word打开是乱码 Next
//显示比例
ole_app.ActiveWindow.View.Zoom.Percentage = 0.9
Catch(runtimeerror e)
//出错了,哈哈
End Try
Else
If ole_CommandBars.Item[i].Visible Then
ole_CommandBars.Item[i].Visible = False
End If
End If
Catch(runtimeerror Error)
//MessageBox(ls_name,Error.GetMessage())
End Try
word打开是乱码 Next
//显示比例
ole_app.ActiveWindow.View.Zoom.Percentage = 0.9
Catch(runtimeerror e)
//出错了,哈哈
End Try
ole_word.Activate(Inplace!)
ole_word.object.application.CommandBars.item("standard").Visible =false
ole_word.object.application.CommandBars.item("standard").Visible =false
∙ 高仿包包TOP
精华推荐:做pb还有出路吗?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论