在PB中嵌入Word文档
PB中嵌入Word文档


国防科技大学3598 罗诗途 

PB(PowerBuilder) Sybase公司推出的一种优秀的数据库开发工具,利用它的数据窗口控件可以快速地开发出一个数据管理系统。现在许多单位很注重报表的格式,需要不同类 型的报表,所以必须提高报表格式的多样性。虽然我们可以利用PB设计出具有打印功能的窗口,但是由于格式是事先规定好的,用户很难根据需要进行修改。 Word是大家熟悉的一种文字处理工具,具有强大的编辑与打印功能。如果能够将数据源动态地导入到Word文档中,然后在Word中调整和打印,用户的自 由度就比较大。下面笔者以生成用户话费清单为例,介绍一种通过OLE技术嵌入Word文档的方法。

创建模板文件

首先,我们建立一个报表样式的模板文件,取名为"用户清单模板.dot"。根据需要录入静态文本,并在需要插入动态数据的地方插入"书签""书签"名字与PB数据源中列的名字一致,如图1所示。

 
1 模板文件
编写程序

1seem用法. 数据窗口d_userd_cost,分别取自移动电话用户基本信息表和用户话费记录表,数据模型如


2 PBWord通信时,如果向Word中输出汉字,则该汉字后面会出现与汉字个数相同的乱码,所以必须编写函数处理这种情况。定义全局函数integer f_getcnnum(string aString)。代码如下:

string ls_ch //临时单元
string ls_SecondSecTable //存放所有国标二级汉字读音
integer li_num = 0 //返回值
integer ij
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_1dw_2,分别对应数据窗口d_userd_cost。再插入两个单行编辑器sle_1sle_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 ijkll_colnumll_rownum
string ls_valuels_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_(true00'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的工具条集合,隐藏一些没必要的工具条
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_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 
ole_word.Activate(Inplace!)

ole_word.object.application.CommandBars.item("standard").Visible =false
高仿包包TOP
精华推荐:做pb还有出路吗?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。